2001-02-16 12:34:38

by aprasad

[permalink] [raw]
Subject: query about sending udp packets in kernel mode

Hi All,

I need to send udp packets in a kernel module. but i am unable to figure
out how to specify fill the struct msghdr to be used by the sendmsg handler
of the socket.

my skeleton is something like (by going through the kernel code:>)

struct socket *sock;
struct sockaddr_in sin;
struct msghdr msg;

sock_creat(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
sin.sin_family = AF_INET;
sin.sin_port = htons((unsigned short)serv_port);
sin.sin_addr.s_addr = htonl(INADDR_ANY); /*i am not sure about this*/

msg.msg_name = &sin;
msg.msglen = sizeof(struct sockaddr_in);
msg.msg_iov = iovec_containg the message;
msg.msg_iovlen = 1;
msg.msg_control = NULL;
msg.msg_controllen=0;
msg.msg_flags =0;

sock->ops->sendmsg(sock,&msg,count,0);
________________________________________________


i am getting EFAULT.

or can anybody suggest me how to fill the address field of sin_addr in
kernel of any known remote address(corresponding inet_addr) so that
sendto/send can be used.
Any pointers will be greatly appreciated.

Thanks,
Anil.



2001-02-16 15:44:38

by Andi Kleen

[permalink] [raw]
Subject: Re: query about sending udp packets in kernel mode

[email protected] writes:

> i am getting EFAULT.

Use

mm_segment_t oldseg = get_fs();
set_fs(KERNEL_DS);

... sendmsg

set_fs(oldseg);


-Andi

P.S.: This is really getting a FAQ. If it isn't already please someone add
it to the linux-kernel FAQ.

2001-02-17 11:03:49

by Olaf Titz

[permalink] [raw]
Subject: Re: query about sending udp packets in kernel mode

> sock_creat(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
> sin.sin_family = AF_INET;
> sin.sin_port = htons((unsigned short)serv_port);
> sin.sin_addr.s_addr = htonl(INADDR_ANY); /*i am not sure about this*/

Needs the target IP address here.

> msg.msg_name = &sin;
> msg.msglen = sizeof(struct sockaddr_in);
> msg.msg_iov = iovec_containg the message;
> msg.msg_iovlen = 1;
> msg.msg_control = NULL;
> msg.msg_controllen=0;
> msg.msg_flags =0;

{ mm_segment_t fs=get_fs();
set_fs(get_ds());

> sock->ops->sendmsg(sock,&msg,count,0);

set_fs(fs); }

"count" needs to be the total length of the message. The 0 is
redundant, sendmsg() takes only three arguments since Linux 2.1 (five
under 2.0).

Olaf