커널에서 UDP 패킷 보내기
커널에서 UDP 패킷을 보낼일이 생겨서 작성중인데 이상하게 전송이 안되네요..
원래는 주소값이 설정이 잘못되서 안가는줄 알았지만 그 부분을 고쳤어도 전송이 안됩니다.
     38                 memset(MAC, 'a', MAX_MAC_LENGTH);
     39
     40                 struct socket* sock;
     41                 struct sockaddr_in hostapd_addr;
     42                 int sock_fd;
     43
     44                 ret = sock_create(AF_INET, SOCK_DGRAM, 0, &sock);
     45                 sock_fd = sock_map_fd(sock);
     46
     47                 if(ret < 0)
     48                 {
     49                              printk(KERN_INFO "k_2_u: Socket create error!\n");
     50                              return ret;
     51                 }
     52                 sock = sockfd_lookup(sock_fd, &ret);
     53                 if(sock == NULL)
     54                 {
     55                              printk(KERN_INFO "No such socket : index %d\n", sock_fd);
     56                              return ret;
     57                 }
     58                 memset(&hostapd_addr, 0, sizeof(hostapd_addr));
     59                 hostapd_addr.sin_family = AF_INET;
     60                 //hostapd_addr.sin_addr.s_addr = inet_addr(HOSTAPD_ADDR);
     61                 hostapd_addr.sin_addr.s_addr = htonl(HOSTAPD_ADDR);
     62                 hostapd_addr.sin_port = htons(HOSTAPD_PORT);
     63
     64                 // sys_sendto()
     65                 unsigned flags = 0;
     66                 struct msghdr msg;
     67                 struct iovec iov;
     68
     69                 iov.iov_base = MAC;
     70                 iov.iov_len = MAX_MAC_LENGTH;
     71                 msg.msg_iov = &iov;
     72                 msg.msg_iovlen = 1;
     73                 msg.msg_control = NULL;
     74                 msg.msg_controllen = 0;
     75
     76                 msg.msg_name = (void*)&hostapd_addr;
     77                 msg.msg_namelen = sizeof(hostapd_addr);
     78                 msg.msg_flags = flags;
     79
     80                 int retval = sock_sendmsg(sock, &msg, MAX_MAC_LENGTH);
     81 printk(KERN_INFO "sock_sendmsg return value: %d\n", retval);
     82                 sock_release(sock);
이렇게 해서 전송하면 sock_sendmsg값이 -14로 찍혀 나옵니다..
왜 sock_sendmsg()가 안될까요.. 아시는 분들 답변 부탁드립니다.


자답
구글에서도 찾아 봤을 때 비슷한 문제로 질문 올린 사람들이 있었는데 답변은 없더군요.
삽질끝에 전송되게 했습니다... set_fs(), get_fs()가 문제였더군요.
39 memset(MAC, 'a', MAX_MAC_LENGTH);
40
41 struct socket* sock;
42 struct sockaddr_in hostapd_addr;
43 int sock_fd;
44
45 ret = sock_create(PF_INET, SOCK_DGRAM, 0, &sock);
46 sock_fd = sock_map_fd(sock);
47
48 if(ret < 0)
49 {
50 printk(KERN_INFO "k_2_u: Socket create error!\n");
51 return ret;
52 }
53 sock = sockfd_lookup(sock_fd, &ret);
54 if(sock == NULL)
55 {
56 printk(KERN_INFO "No such socket : index %d\n", sock_fd);
57 return ret;
58 }
59
60 memset(&hostapd_addr, 0, sizeof(hostapd_addr));
61 hostapd_addr.sin_family = AF_INET;
63 hostapd_addr.sin_addr.s_addr = htonl(HOSTAPD_ADDR);
64 hostapd_addr.sin_port = htons(HOSTAPD_PORT);
65
72 // sys_sendto()
73 struct msghdr msg;
74 struct iovec iov;
75
76 iov.iov_base = (void *)MAC;
77 iov.iov_len = MAX_MAC_LENGTH;
78 msg.msg_iov = &iov;
79 msg.msg_iovlen = 1;
80 msg.msg_control = NULL;
86 msg.msg_name = (void*)&hostapd_addr;
87 msg.msg_namelen = sizeof(hostapd_addr);
88 msg.msg_flags = 0;
89
90 mm_segment_t oldfs;
91 oldfs = get_fs();
92 set_fs(KERNEL_DS);
93 sock_sendmsg(sock, &msg, MAX_MAC_LENGTH);
94 set_fs(oldfs);
96 sock_release(sock);
댓글 달기