커널 소스에서 UDP 패킷을 전송하기 위해 다음과 같이 코딩 하였음
이전에 포스팅한 TCP 패킷과 동일한 데이터.
/* TODO */
#define DEST_ADDR (172 << 24 | 16 << 16 | 255 << 8 | 67)
//#define DEST_ADDR (220 << 24 | 103 << 16 | 255 << 8 | 203)
#define DEST_PORT 8080
static int send_udp(void)
{
struct socket* sock;
struct sockaddr_in dest_addr;
int sock_fd;
int ret;
struct msghdr msg;
struct iovec iov;
char send_data[]="POST /TMS/acs HTTP/1.1\r\nHost: 1.2.3.4\r\nUser-Agent: gSOAP/2.7\r\nContent-Type: text/xml; charset=utf-8\r\nContent-Length: 1809\r\nConnection: keep-alive\r\nAuthorization: Basic \r\nSOAPAction: \r\n\r\n";
char xml_data[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:cwmp=\"urn:dslforum-org:cwmp-1-0\"><SOAP-ENV:Header><cwmp:ID SOAP-ENV:mustUnderstand=\"1\">2</cwmp:ID>"
char send_buff[2500];
sprintf(send_buff, "%s%s", send_data, xml_data);
ret = sock_create(AF_INET, SOCK_DGRAM, 0, &sock);
sock_fd = sock_map_fd(sock);
if(ret < 0)
{
printk(KERN_INFO "Socket create error!\n");
return ret;
}
sock = sockfd_lookup(sock_fd, &ret);
if(sock == NULL)
{
printk(KERN_INFO "No such socket : index %d\n", sock_fd);
return ret;
}
memset(&dest_addr, 0, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
//dest_addr.sin_addr.s_addr = inet_addr(HOSTAPD_ADDR);
dest_addr.sin_addr.s_addr = htonl(DEST_ADDR);
dest_addr.sin_port = htons(DEST_PORT);
iov.iov_base = (char *) send_buff;
iov.iov_len = strlen(send_buff);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_control = NULL;
msg.msg_controllen = 0;
msg.msg_name = (void*)&dest_addr;
msg.msg_namelen = sizeof(dest_addr);
msg.msg_flags = MSG_DONTWAIT;
ret = sock_sendmsg(sock, &msg, strlen(send_buff));
printk(KERN_INFO "sock_sendmsg return value: %d\n", ret);
sock_release(sock);
return 0;
}