On Mon, Dec 24, 2018 at 08:43:10PM -0200, Martin Pieuchot wrote:
> On 24/12/18(Mon) 17:31, Denis Fondras wrote:
> > Index: net/if_ethersubr.c
> > ===================================================================
> > RCS file: /cvs/src/sys/net/if_ethersubr.c,v
> > retrieving revision 1.256
> > diff -u -p -r1.256 if_ethersubr.c
> > --- net/if_ethersubr.c      20 Dec 2018 23:00:55 -0000      1.256
> > +++ net/if_ethersubr.c      24 Dec 2018 14:39:26 -0000
> > @@ -243,7 +243,11 @@ ether_resolve(struct ifnet *ifp, struct 
> >             if (!ISSET(ifp->if_xflags, IFXF_MPLS))
> >                     senderr(ENETUNREACH);
> >  
> > -           switch (dst->sa_family) {
> > +           af = dst->sa_family;
> > +           if (af == AF_MPLS)
> > +                   af = rt->rt_gateway->sa_family;
> > +
> > +           switch (af) {
> >             case AF_LINK:
> >                     if (satosdl(dst)->sdl_alen < sizeof(eh->ether_dhost))
> >                             senderr(EHOSTUNREACH);
> > @@ -258,7 +262,6 @@ ether_resolve(struct ifnet *ifp, struct 
> >                     break;
> >  #endif
> >             case AF_INET:
> > -           case AF_MPLS:
> >                     error = arpresolve(ifp, rt, m, dst, eh->ether_dhost);
> >                     if (error)
> >                             return (error);
> 
> This is much better.  ok mpi@
> 

I'd like to commit this safer version, still ok ?

Index: if_ethersubr.c
===================================================================
RCS file: /cvs/src/sys/net/if_ethersubr.c,v
retrieving revision 1.256
diff -u -p -r1.256 if_ethersubr.c
--- if_ethersubr.c      20 Dec 2018 23:00:55 -0000      1.256
+++ if_ethersubr.c      25 Dec 2018 09:20:28 -0000
@@ -243,7 +243,11 @@ ether_resolve(struct ifnet *ifp, struct 
                if (!ISSET(ifp->if_xflags, IFXF_MPLS))
                        senderr(ENETUNREACH);
 
-               switch (dst->sa_family) {
+               af = dst->sa_family;
+               if (af == AF_MPLS && rt->rt_gateway != NULL)
+                       af = rt->rt_gateway->sa_family;
+
+               switch (af) {
                case AF_LINK:
                        if (satosdl(dst)->sdl_alen < sizeof(eh->ether_dhost))
                                senderr(EHOSTUNREACH);
@@ -258,7 +262,6 @@ ether_resolve(struct ifnet *ifp, struct 
                        break;
 #endif
                case AF_INET:
-               case AF_MPLS:
                        error = arpresolve(ifp, rt, m, dst, eh->ether_dhost);
                        if (error)
                                return (error);



Reply via email to