커널에서 UDP 패킷 보내기

cramade의 이미지

커널에서 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()가 안될까요.. 아시는 분들 답변 부탁드립니다.

cramade의 이미지

구글에서도 찾아 봤을 때 비슷한 문제로 질문 올린 사람들이 있었는데 답변은 없더군요.

삽질끝에 전송되게 했습니다... 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);

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.