MCPcopy Create free account
hub / github.com/F-Stack/f-stack / lacp_marker_input

Function lacp_marker_input

freebsd/net/ieee8023ad_lacp.c:1956–2052  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1954}
1955
1956int
1957lacp_marker_input(struct lacp_port *lp, struct mbuf *m)
1958{
1959 struct lacp_softc *lsc = lp->lp_lsc;
1960 struct lagg_port *lgp = lp->lp_lagg;
1961 struct lacp_port *lp2;
1962 struct markerdu *mdu;
1963 int error = 0;
1964 int pending = 0;
1965
1966 if (m->m_pkthdr.len != sizeof(*mdu)) {
1967 goto bad;
1968 }
1969
1970 if ((m->m_flags & M_MCAST) == 0) {
1971 goto bad;
1972 }
1973
1974 if (m->m_len < sizeof(*mdu)) {
1975 m = m_pullup(m, sizeof(*mdu));
1976 if (m == NULL) {
1977 return (ENOMEM);
1978 }
1979 }
1980
1981 mdu = mtod(m, struct markerdu *);
1982
1983 if (memcmp(&mdu->mdu_eh.ether_dhost,
1984 &ethermulticastaddr_slowprotocols, ETHER_ADDR_LEN)) {
1985 goto bad;
1986 }
1987
1988 if (mdu->mdu_sph.sph_version != 1) {
1989 goto bad;
1990 }
1991
1992 switch (mdu->mdu_tlv.tlv_type) {
1993 case MARKER_TYPE_INFO:
1994 if (tlv_check(mdu, sizeof(*mdu), &mdu->mdu_tlv,
1995 marker_info_tlv_template, TRUE)) {
1996 goto bad;
1997 }
1998 mdu->mdu_tlv.tlv_type = MARKER_TYPE_RESPONSE;
1999 memcpy(&mdu->mdu_eh.ether_dhost,
2000 &ethermulticastaddr_slowprotocols, ETHER_ADDR_LEN);
2001 memcpy(&mdu->mdu_eh.ether_shost,
2002 lgp->lp_lladdr, ETHER_ADDR_LEN);
2003 error = lagg_enqueue(lp->lp_ifp, m);
2004 break;
2005
2006 case MARKER_TYPE_RESPONSE:
2007 if (tlv_check(mdu, sizeof(*mdu), &mdu->mdu_tlv,
2008 marker_response_tlv_template, TRUE)) {
2009 goto bad;
2010 }
2011 LACP_DPRINTF((lp, "marker response, port=%u, sys=%6D, id=%u\n",
2012 ntohs(mdu->mdu_info.mi_rq_port), mdu->mdu_info.mi_rq_system,
2013 ":", ntohl(mdu->mdu_info.mi_rq_xid)));

Callers 1

lacp_inputFunction · 0.85

Calls 5

m_pullupFunction · 0.85
tlv_checkFunction · 0.85
lagg_enqueueFunction · 0.85
memcpyFunction · 0.50
m_freemFunction · 0.50

Tested by

no test coverage detected