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);

Reply via email to