In user space, I encapsulated a L3 packet using sock_raw
(including IP header) and send to kernel space using sock_sendmsg()
using msghdr
structure
struct msghdr { void *msg_name; /* optional address */ struct iovec *msg_iov; /* scatter/gather array */ ... };
I cannot understand clearly the roles of msg_name
. I already specified the source IP and dest IP in L3 header. Why do I need msg_name
?
Advertisement
Answer
The msg_name
and msg_namelen
fields of struct msghdr
have the same function as the dest_addr
and addrlen
arguments to sendto
: they specify the destination address. They are intended to be used with normal unconnected datagram sockets. For instance, when sending UDP packets with sendmsg
on an AF_INET
/SOCK_DGRAM
socket, you supply only the payload, not the headers, in the iovec, and the destination address goes in msg_name
+ msg_namelen
.
raw(7)
, the manpage describing SOCK_RAW
sockets, indicates that you are allowed to put the header into the iovec
when using raw sockets (note in particular the discussion of IP_HDRINCL
) but does not make clear what you should set msg_name
and msg_namelen
to in that case. I would recommend you try setting both of them to 0 and see if that works.