2013-08-08 42 views
6

Tôi đang viết một mô-đun hạt nhân sẽ nhận tin nhắn từ không gian người dùng và gửi trả lời qua ổ cắm.Gửi gói với ổ cắm từ mô-đun hạt nhân

Khi chương trình và mô-đun trên cùng một máy và tôi sử dụng IP 127.0.0.1, mọi thứ đều hoạt động tốt. Nhưng khi tôi thử nó trên các máy khác nhau và sử dụng IP mạng thực, một cái gì đó như 192.168.3.146 nó chỉ hoạt động theo một cách.

Tôi nhận được thư từ không gian người dùng, nhưng tôi không thể nhận thư từ hạt nhân. Tôi sử dụng chức năng sock_sendmsg để gửi tin nhắn từ hạt nhân và nó không trả về bất kỳ lỗi nào. Ngoài ra tôi không nhận được bất kỳ tin nhắn nào từ tường lửa rằng một cái gì đó được đưa ra từ một máy khác, từ mô-đun hạt nhân.

Dưới đây là các câu hỏi và ví dụ tương tự, nhưng chúng không đủ hữu ích đối với tôi hoặc ví dụ đã được sử dụng phiên bản hạt nhân quá cũ.Đối với bộ xương tôi đã sử dụng bộ này, từ ổ cắm UDP: http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-3.html. Bất kỳ giúp đỡ?

Kernel đang mô-đun để gửi:

void send_data(unsigned char *data) 
{ 
    if(!IS_ERR_OR_NULL(data)) 
    { 
     int ret; 
     mm_segment_t oldfs; 
     struct msghdr message; 
     struct iovec ioVector; 
     struct sockaddr_in sendAddr; 

     sendAddr.sin_family = AF_INET; 
     sendAddr.sin_addr.s_addr = INADDR_ANY; 
     //sendAddr.sin_addr.s_addr = in_aton("192.168.1.75"); 
     //here I get port from sk_buff structure that I received. 
     sendAddr.sin_port = *((unsigned short*)skBuffer->data); 

     memset(&message, 0, sizeof(message)); 
     message.msg_name = &sendAddr; 
     message.msg_namelen = sizeof(sendAddr); 

     /* send the message back */ 
     ioVector.iov_base = data; 
     ioVector.iov_len = strlen(data); 
     message.msg_iov = &ioVector; 
     message.msg_iovlen = 1; 
     message.msg_control = NULL; 
     message.msg_controllen = 0; 

     oldfs = get_fs(); 
     set_fs(KERNEL_DS); 
     ret = sock_sendmsg(sendSocket, &message, strlen(data)); 
     set_fs(oldfs); 
    } 
} 

Trả lời

2

Tôi tìm thấy một giải pháp thay thế, sử dụng ổ cắm netpoll. Nó là dễ dàng hơn so với ổ cắm, tôi sử dụng trước và nó hoạt động. Câu trả lời và mã thích hợp là here, trên một câu hỏi StackOverflow khác.