Messages in this thread Patch in this message | | | From | Neil Brown <> | Date | Wed, 19 Feb 2003 15:13:48 +1100 | Subject | Re: sendmsg and IP_PKTINFO |
| |
On Tuesday February 18, davem@redhat.com wrote: > From: Neil Brown <neilb@cse.unsw.edu.au> > Date: Tue, 18 Feb 2003 22:00:37 +1100 > > It does go on to say that the outgoing packet will be sent over the > same interface, however I feel that is an illogical conclusion given > the description of the meaning of the field. > > So yes, the current behaviour seems to match part of the > documentation. However I argue that the documented behaviour is > irrational. > > Alexey and myself totally disagree. We have described for you > the intended purpose of this feature. Please do not try to use > it in some other way, it may prove to be painful :-)
Thankyou for making that clear.
I am currently working towards testing a patch that will fix the behaviour of glibc.
Currently the sunrpc/svc_udp.c code asks for an IP_PKTINFO from recvmsg, and passes it verbatim down through sendmsg. My patch checks that the returned data looks believable and, if it does, zeros the ipi_ifindex field.
NeilBrown
--- sunrpc/svc_udp.c.orig 2003-02-19 11:25:20.000000000 +1100 +++ sunrpc/svc_udp.c 2003-02-19 14:28:46.000000000 +1100 @@ -256,8 +256,26 @@ mesgp->msg_controllen = sizeof(xprt->xp_pad) - sizeof (struct iovec) - sizeof (struct msghdr); rlen = recvmsg (xprt->xp_sock, mesgp, 0); - if (rlen >= 0) - len = mesgp->msg_namelen; + if (rlen >= 0) { + struct cmsghdr *cmsg; + len = mesgp->msg_namelen; + cmsg = CMSG_FIRSTHDR(mesgp); + if (cmsg == NULL || + CMSG_NXTHDR(mesgp, cmsg) != NULL || + cmsg->cmsg_level != SOL_IP || + cmsg->cmsg_type != IP_PKTINFO || + cmsg->cmsg_len != sizeof(struct in_pktinfo)) { + /* Not a simple IP_PKTINFO, ignore it */ + mesgp->msg_control = NULL; + mesgp->msg_controllen = 0; + } else { + /* it was a simple IP_PKTIFO as we expected, + * Discard the interface field + */ + struct in_pktinfo *pkti = CMSG_DATA(cmsg); + pkti->ipi_ifindex = 0; + } + } } else #endif - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |