IPV6_FLOWINFO
flowlabel and DS field are received as ancillary data object
of type IPV6_FLOWINFO
and level SOL_IPV6
.
In the cases when it is convenient to use recvfrom(2)
,
it is possible to replace library variant with your own one,
sort of:
#include <sys/socket.h> #include <netinet/in6.h> size_t recvfrom(int fd, char *buf, size_t len, int flags, struct sockaddr *addr, int *addrlen) { size_t cc; char cbuf[128]; struct cmsghdr *c; struct iovec iov = { buf, len }; struct msghdr msg = { addr, *addrlen, &iov, 1, cbuf, sizeof(cbuf), 0 }; cc = recvmsg(fd, &msg, flags); if (cc < 0) return cc; ((struct sockaddr_in6*)addr)->sin6_flowinfo = 0; *addrlen = msg.msg_namelen; for (c=CMSG_FIRSTHDR(&msg); c; c = CMSG_NEXTHDR(&msg, c)) { if (c->cmsg_level != SOL_IPV6 || c->cmsg_type != IPV6_FLOWINFO) continue; ((struct sockaddr_in6*)addr)->sin6_flowinfo = *(__u32*)CMSG_DATA(c); } return cc; }