summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorthompsa <thompsa@FreeBSD.org>2007-12-31 01:16:35 +0000
committerthompsa <thompsa@FreeBSD.org>2007-12-31 01:16:35 +0000
commit93319cc10273607712748c7127ef8b6b9c423f9d (patch)
tree085e519c51963ef594607a3d43bba393ca3673f8 /sys
parent1f55b95c0b8bf827067cd8af2a8bb21479ae5efb (diff)
downloadFreeBSD-src-93319cc10273607712748c7127ef8b6b9c423f9d.zip
FreeBSD-src-93319cc10273607712748c7127ef8b6b9c423f9d.tar.gz
Pass any unmatched slowprotocols frames up the stack instead of dropping them,
there are more subtypes than just LACP.
Diffstat (limited to 'sys')
-rw-r--r--sys/net/ieee8023ad_lacp.c10
-rw-r--r--sys/net/ieee8023ad_lacp.h2
-rw-r--r--sys/net/if_lagg.c5
3 files changed, 9 insertions, 8 deletions
diff --git a/sys/net/ieee8023ad_lacp.c b/sys/net/ieee8023ad_lacp.c
index 70ee700..d4cf675 100644
--- a/sys/net/ieee8023ad_lacp.c
+++ b/sys/net/ieee8023ad_lacp.c
@@ -213,7 +213,7 @@ static const lacp_timer_func_t lacp_timer_funcs[LACP_NTIMER] = {
[LACP_TIMER_WAIT_WHILE] = lacp_sm_mux_timer,
};
-void
+struct mbuf *
lacp_input(struct lagg_port *lgp, struct mbuf *m)
{
struct lagg_softc *sc = lgp->lp_softc;
@@ -222,7 +222,7 @@ lacp_input(struct lagg_port *lgp, struct mbuf *m)
if (m->m_pkthdr.len < sizeof(struct ether_header) + sizeof(subtype)) {
m_freem(m);
- return;
+ return (NULL);
}
m_copydata(m, sizeof(struct ether_header), sizeof(subtype), &subtype);
@@ -237,10 +237,10 @@ lacp_input(struct lagg_port *lgp, struct mbuf *m)
break;
default:
- /* Unknown LACP packet type */
- m_freem(m);
- break;
+ /* Not a subtype we are interested in */
+ return (m);
}
+ return (NULL);
}
static void
diff --git a/sys/net/ieee8023ad_lacp.h b/sys/net/ieee8023ad_lacp.h
index b0a67e0..1e74627 100644
--- a/sys/net/ieee8023ad_lacp.h
+++ b/sys/net/ieee8023ad_lacp.h
@@ -260,7 +260,7 @@ struct lacp_softc {
#define LACP_PORT(_lp) ((struct lacp_port *)(_lp)->lp_psc)
#define LACP_SOFTC(_sc) ((struct lacp_softc *)(_sc)->sc_psc)
-void lacp_input(struct lagg_port *, struct mbuf *);
+struct mbuf *lacp_input(struct lagg_port *, struct mbuf *);
struct lagg_port *lacp_select_tx_port(struct lagg_softc *, struct mbuf *);
int lacp_attach(struct lagg_softc *);
int lacp_detach(struct lagg_softc *);
diff --git a/sys/net/if_lagg.c b/sys/net/if_lagg.c
index 27fef3f..c863387 100644
--- a/sys/net/if_lagg.c
+++ b/sys/net/if_lagg.c
@@ -1700,8 +1700,9 @@ lagg_lacp_input(struct lagg_softc *sc, struct lagg_port *lp, struct mbuf *m)
/* Tap off LACP control messages */
if (etype == ETHERTYPE_SLOW) {
- lacp_input(lp, m);
- return (NULL);
+ m = lacp_input(lp, m);
+ if (m == NULL)
+ return (NULL);
}
/*
OpenPOWER on IntegriCloud