Good day.

With the hints from Martin Pieuchot had found out that the current
handling of IFT_ETHER for bridge(4) /and nowadays, after de-introduction
of IFT_MPLSTUNNEL/mpw(4) type interfaces, only IFT_ETHER ones can
be attached to the bridge(4)/
 - isn't uniform across both ADD ioctls,
 - has some redundant "if (ifs->if_type == IFT_ETHER)" statements
   both in ioctl and bridge forwarding code paths.

Can the attached patch be reviewed and considered for inclusion
into the main code?

Thanks!
-- 
rea
>From c5dc1bf7b8875788af3c325e618b08e1ff3d90a9 Mon Sep 17 00:00:00 2001
From: Eygene Ryabinkin <[email protected]>
Date: Fri, 7 Jun 2019 20:23:58 +0300
Subject: [PATCH 2/2] bridge(4): simplify interface handling logics

 - uniformly check for IFT_ETHER in both add-type ioctls:
   only Ethernet interfaces can nowadays be bridge(4) members

 - move promiscious mode handling out of IFT_ETHER checks:
   prior code structure was due to the IFT_MPLSTUNNEL interface
   types that need no promiscious mode, but now they are gone

 - don't check for IFT_ETHER in the run-time packet handling:
   this is now completely redundant.

Signed-off-by: Eygene Ryabinkin <[email protected]>
---
 sys/net/if_bridge.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/sys/net/if_bridge.c b/sys/net/if_bridge.c
index d64bdc05abb..496ed8a3b97 100644
--- a/sys/net/if_bridge.c
+++ b/sys/net/if_bridge.c
@@ -304,19 +304,18 @@ bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
                        break;
                }
 
-               if (ifs->if_type == IFT_ETHER) {
-                       error = ifpromisc(ifs, 1);
-                       if (error != 0)
-                               break;
-               } else {
+               if (ifs->if_type != IFT_ETHER) {
                        error = EINVAL;
                        break;
                }
 
+               error = ifpromisc(ifs, 1);
+               if (error != 0)
+                       break;
+
                bif = malloc(sizeof(*bif), M_DEVBUF, M_NOWAIT|M_ZERO);
                if (bif == NULL) {
-                       if (ifs->if_type == IFT_ETHER)
-                               ifpromisc(ifs, 0);
+                       ifpromisc(ifs, 0);
                        error = ENOMEM;
                        break;
                }
@@ -1201,8 +1200,6 @@ bridge_process(struct ifnet *ifp, struct mbuf *m)
         */
        bif0 = bif;
        SMR_SLIST_FOREACH_LOCKED(bif, &sc->sc_iflist, bif_next) {
-               if (bif->ifp->if_type != IFT_ETHER)
-                       continue;
                if (bridge_ourether(bif->ifp, eh->ether_dhost)) {
                        if (bif0->bif_flags & IFBIF_LEARNING)
                                bridge_rtupdate(sc,
-- 
2.21.0

Reply via email to