On Fri, Jan 15, 2021 at 03:02:37PM +0100, Claudio Jeker wrote:
> On Fri, Jan 15, 2021 at 02:53:17PM +0100, Claudio Jeker wrote:
> > I forgot to add ip_mreqn support to IP_MULTICAST_IF and so the
> > IP_ADD_MEMBERSHIP change is not fixing all the issues I have.
> >
> > Linux supports calling IP_MULTICAST_IF with a struct in_addr, a struct
> > ip_mreq, or a struct ip_mreqn. FreeBSD only does the first and last.
> > I followed the Linux way because doing that was not that hard. In the end
> > only the imr_ifindex field and the imr_address field need to be checked
> > and if the imr_ifindex is 0 then just use the old code. If the imr_ifindex
> > is set then use this for interface index and break early.
> >
> > Any opinions about this?
>
> This is the corresponding diff for ospfd.
With both diffs, kernel and ospfd, regress/usr.sbin/ospfd passes.
OK bluhm@ for both
> Additionally this initalizes the imr_address field. It is not used but we
> should not send stack garbage to the kernel.
>
> --
> :wq Claudio
>
> Index: interface.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospfd/interface.c,v
> retrieving revision 1.85
> diff -u -p -r1.85 interface.c
> --- interface.c 12 Jan 2021 09:11:09 -0000 1.85
> +++ interface.c 15 Jan 2021 14:00:39 -0000
> @@ -734,6 +734,7 @@ if_join_group(struct iface *iface, struc
> return (0);
>
> mreq.imr_multiaddr.s_addr = addr->s_addr;
> + mreq.imr_address.s_addr = 0;
> mreq.imr_ifindex = iface->ifindex;
>
> if (setsockopt(iface->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
> @@ -782,6 +783,7 @@ if_leave_group(struct iface *iface, stru
> }
>
> mreq.imr_multiaddr.s_addr = addr->s_addr;
> + mreq.imr_address.s_addr = 0;
> mreq.imr_ifindex = iface->ifindex;
>
> if (setsockopt(iface->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP,
> @@ -808,11 +810,15 @@ if_leave_group(struct iface *iface, stru
> int
> if_set_mcast(struct iface *iface)
> {
> + struct ip_mreqn mreq;
> +
> switch (iface->type) {
> case IF_TYPE_POINTOPOINT:
> case IF_TYPE_BROADCAST:
> + memset(&mreq, 0, sizeof(mreq));
> + mreq.imr_ifindex = iface->ifindex;
> if (setsockopt(iface->fd, IPPROTO_IP, IP_MULTICAST_IF,
> - &iface->addr.s_addr, sizeof(iface->addr.s_addr)) == -1) {
> + &mreq, sizeof(mreq)) == -1) {
> log_warn("if_set_mcast: error setting "
> "IP_MULTICAST_IF, interface %s", iface->name);
> return (-1);