| 1954 | } |
| 1955 | |
| 1956 | int |
| 1957 | lacp_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 | ðermulticastaddr_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 | ðermulticastaddr_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))); |
no test coverage detected