Date: Tue, 28 Dec 2004 16:36:06 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 67802 for review Message-ID: <200412281636.iBSGa6Ej029483@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=67802 Change 67802 by sam@sam_ebb on 2004/12/28 16:35:41 move a routine so related code is kept together Affected files ... .. //depot/projects/wifi/sys/net80211/ieee80211_output.c#28 edit Differences ... ==== //depot/projects/wifi/sys/net80211/ieee80211_output.c#28 (text+ko) ==== @@ -203,74 +203,6 @@ return 0; } -/* - * Insure there is sufficient contiguous space to encapsulate the - * 802.11 data frame. If room isn't already there, arrange for it. - * Drivers and cipher modules assume we have done the necessary work - * and fail rudely if they don't find the space they need. - */ -static struct mbuf * -ieee80211_mbuf_adjust(struct ieee80211com *ic, int hdrsize, - struct ieee80211_key *key, struct mbuf *m) -{ -#define TO_BE_RECLAIMED (sizeof(struct ether_header) - sizeof(struct llc)) - int needed_space = hdrsize; - - if (key != NULL) { - /* XXX belongs in crypto code? */ - needed_space += key->wk_cipher->ic_header; - /* XXX frags */ - } - /* - * We know we are called just before stripping an Ethernet - * header and prepending an LLC header. This means we know - * there will be - * sizeof(struct ether_header) - sizeof(struct llc) - * bytes recovered to which we need additional space for the - * 802.11 header and any crypto header. - */ - /* XXX check trailing space and copy instead? */ - if (M_LEADINGSPACE(m) < needed_space - TO_BE_RECLAIMED) { - struct mbuf *n = m_gethdr(M_NOWAIT, m->m_type); - if (n == NULL) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_OUTPUT, - "%s: cannot expand storage\n", __func__); - ic->ic_stats.is_tx_nobuf++; - m_freem(m); - return NULL; - } - KASSERT(needed_space <= MHLEN, - ("not enough room, need %u got %zu\n", needed_space, MHLEN)); - /* - * Setup new mbuf to have leading space to prepend the - * 802.11 header and any crypto header bits that are - * required (the latter are added when the driver calls - * back to ieee80211_crypto_encap to do crypto encapsulation). - */ - /* NB: must be first 'cuz it clobbers m_data */ - m_move_pkthdr(n, m); - n->m_len = 0; /* NB: m_gethdr does not set */ - n->m_data += needed_space; - /* - * Pull up Ethernet header to create the expected layout. - * We could use m_pullup but that's overkill (i.e. we don't - * need the actual data) and it cannot fail so do it inline - * for speed. - */ - /* NB: struct ether_header is known to be contiguous */ - n->m_len += sizeof(struct ether_header); - m->m_len -= sizeof(struct ether_header); - m->m_data += sizeof(struct ether_header); - /* - * Replace the head of the chain. - */ - n->m_next = m; - m = n; - } - return m; -#undef TO_BE_RECLAIMED -} - /* * Assign priority to a frame based on any vlan tag assigned * to the station and/or any Diffserv setting in an IP header. @@ -387,6 +319,74 @@ return 0; } +/* + * Insure there is sufficient contiguous space to encapsulate the + * 802.11 data frame. If room isn't already there, arrange for it. + * Drivers and cipher modules assume we have done the necessary work + * and fail rudely if they don't find the space they need. + */ +static struct mbuf * +ieee80211_mbuf_adjust(struct ieee80211com *ic, int hdrsize, + struct ieee80211_key *key, struct mbuf *m) +{ +#define TO_BE_RECLAIMED (sizeof(struct ether_header) - sizeof(struct llc)) + int needed_space = hdrsize; + + if (key != NULL) { + /* XXX belongs in crypto code? */ + needed_space += key->wk_cipher->ic_header; + /* XXX frags */ + } + /* + * We know we are called just before stripping an Ethernet + * header and prepending an LLC header. This means we know + * there will be + * sizeof(struct ether_header) - sizeof(struct llc) + * bytes recovered to which we need additional space for the + * 802.11 header and any crypto header. + */ + /* XXX check trailing space and copy instead? */ + if (M_LEADINGSPACE(m) < needed_space - TO_BE_RECLAIMED) { + struct mbuf *n = m_gethdr(M_NOWAIT, m->m_type); + if (n == NULL) { + IEEE80211_DPRINTF(ic, IEEE80211_MSG_OUTPUT, + "%s: cannot expand storage\n", __func__); + ic->ic_stats.is_tx_nobuf++; + m_freem(m); + return NULL; + } + KASSERT(needed_space <= MHLEN, + ("not enough room, need %u got %zu\n", needed_space, MHLEN)); + /* + * Setup new mbuf to have leading space to prepend the + * 802.11 header and any crypto header bits that are + * required (the latter are added when the driver calls + * back to ieee80211_crypto_encap to do crypto encapsulation). + */ + /* NB: must be first 'cuz it clobbers m_data */ + m_move_pkthdr(n, m); + n->m_len = 0; /* NB: m_gethdr does not set */ + n->m_data += needed_space; + /* + * Pull up Ethernet header to create the expected layout. + * We could use m_pullup but that's overkill (i.e. we don't + * need the actual data) and it cannot fail so do it inline + * for speed. + */ + /* NB: struct ether_header is known to be contiguous */ + n->m_len += sizeof(struct ether_header); + m->m_len -= sizeof(struct ether_header); + m->m_data += sizeof(struct ether_header); + /* + * Replace the head of the chain. + */ + n->m_next = m; + m = n; + } + return m; +#undef TO_BE_RECLAIMED +} + #define KEY_UNDEFINED(k) ((k).wk_cipher == &ieee80211_cipher_none) /* * Return the transmit key to use in sending a unicast frame.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200412281636.iBSGa6Ej029483>