Clean up the if_bridge hooks a bit in if_ethersubr.c and ng_ether.c, move
the broadcast/multicast test to bridge_input(). Requested by: glebius
This commit is contained in:
parent
8fe74b285e
commit
e085cf5c30
@ -333,6 +333,9 @@ const struct bridge_control bridge_control_table[] = {
|
||||
const int bridge_control_table_size =
|
||||
sizeof(bridge_control_table) / sizeof(bridge_control_table[0]);
|
||||
|
||||
static const u_char etherbroadcastaddr[ETHER_ADDR_LEN] =
|
||||
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
LIST_HEAD(, bridge_softc) bridge_list;
|
||||
|
||||
IFC_SIMPLE_DECLARE(bridge, 0);
|
||||
@ -1698,7 +1701,7 @@ bridge_input(struct ifnet *ifp, struct mbuf *m)
|
||||
return (m);
|
||||
}
|
||||
|
||||
if (m->m_flags & (M_BCAST|M_MCAST)) {
|
||||
if (ETHER_IS_MULTICAST(eh->ether_dhost)) {
|
||||
/* Tap off 802.1D packets; they do not get forwarded. */
|
||||
if (memcmp(eh->ether_dhost, bstp_etheraddr,
|
||||
ETHER_ADDR_LEN) == 0) {
|
||||
@ -1719,6 +1722,12 @@ bridge_input(struct ifnet *ifp, struct mbuf *m)
|
||||
}
|
||||
}
|
||||
|
||||
if (bcmp(etherbroadcastaddr, eh->ether_dhost,
|
||||
sizeof(etherbroadcastaddr)) == 0)
|
||||
m->m_flags |= M_BCAST;
|
||||
else
|
||||
m->m_flags |= M_MCAST;
|
||||
|
||||
/*
|
||||
* Make a deep copy of the packet and enqueue the copy
|
||||
* for bridge processing; return the original packet for
|
||||
|
@ -592,19 +592,6 @@ ether_input(struct ifnet *ifp, struct mbuf *m)
|
||||
KASSERT(bridge_input_p != NULL,
|
||||
("%s: if_bridge not loaded!", __func__));
|
||||
|
||||
/* Mark the packet as broadcast or multicast. This is also set
|
||||
* further down the code in ether_demux() but since the bridge
|
||||
* input routine rarely returns a mbuf for further processing,
|
||||
* it is an acceptable duplication.
|
||||
*/
|
||||
if (ETHER_IS_MULTICAST(eh->ether_dhost)) {
|
||||
if (bcmp(etherbroadcastaddr, eh->ether_dhost,
|
||||
sizeof(etherbroadcastaddr)) == 0)
|
||||
m->m_flags |= M_BCAST;
|
||||
else
|
||||
m->m_flags |= M_MCAST;
|
||||
}
|
||||
|
||||
m = (*bridge_input_p)(ifp, m);
|
||||
if (m == NULL)
|
||||
return;
|
||||
|
@ -105,8 +105,6 @@ static int ng_ether_rcv_upper(node_p node, struct mbuf *m);
|
||||
|
||||
/* if_bridge(4) support. XXX: should go into some include. */
|
||||
extern struct mbuf *(*bridge_input_p)(struct ifnet *, struct mbuf *);
|
||||
static const u_char etherbroadcastaddr[ETHER_ADDR_LEN] =
|
||||
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
/* Netgraph node methods */
|
||||
static ng_constructor_t ng_ether_constructor;
|
||||
@ -653,26 +651,9 @@ ng_ether_rcv_upper(node_p node, struct mbuf *m)
|
||||
* XXX: This is a copy'and'paste from if_ethersubr.c:ether_input()
|
||||
*/
|
||||
if (ifp->if_bridge) {
|
||||
struct ether_header *eh;
|
||||
|
||||
KASSERT(bridge_input_p != NULL,
|
||||
("%s: if_bridge not loaded!", __func__));
|
||||
|
||||
eh = mtod(m, struct ether_header *);
|
||||
|
||||
/* Mark the packet as broadcast or multicast. This is also set
|
||||
* further down the code in ether_demux() but since the bridge
|
||||
* input routine rarely returns a mbuf for further processing,
|
||||
* it is an acceptable duplication.
|
||||
*/
|
||||
if (ETHER_IS_MULTICAST(eh->ether_dhost)) {
|
||||
if (bcmp(etherbroadcastaddr, eh->ether_dhost,
|
||||
sizeof(etherbroadcastaddr)) == 0)
|
||||
m->m_flags |= M_BCAST;
|
||||
else
|
||||
m->m_flags |= M_MCAST;
|
||||
}
|
||||
|
||||
m = (*bridge_input_p)(ifp, m);
|
||||
if (m == NULL)
|
||||
return (0);
|
||||
|
Loading…
Reference in New Issue
Block a user