Module Name: src Committed By: jmcneill Date: Mon Feb 21 23:50:08 UTC 2011
Modified Files: src/sys/net80211: ieee80211_output.c ieee80211_proto.h Log Message: add ieee80211_get_rts and ieee80211_get_cts_to_self from openbsd, ok dyoung@ To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 src/sys/net80211/ieee80211_output.c cvs rdiff -u -r1.17 -r1.18 src/sys/net80211/ieee80211_proto.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net80211/ieee80211_output.c diff -u src/sys/net80211/ieee80211_output.c:1.49 src/sys/net80211/ieee80211_output.c:1.50 --- src/sys/net80211/ieee80211_output.c:1.49 Tue Jan 19 22:08:17 2010 +++ src/sys/net80211/ieee80211_output.c Mon Feb 21 23:50:08 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ieee80211_output.c,v 1.49 2010/01/19 22:08:17 pooka Exp $ */ +/* $NetBSD: ieee80211_output.c,v 1.50 2011/02/21 23:50:08 jmcneill Exp $ */ /*- * Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting @@ -36,7 +36,7 @@ __FBSDID("$FreeBSD: src/sys/net80211/ieee80211_output.c,v 1.34 2005/08/10 16:22:29 sam Exp $"); #endif #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: ieee80211_output.c,v 1.49 2010/01/19 22:08:17 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ieee80211_output.c,v 1.50 2011/02/21 23:50:08 jmcneill Exp $"); #endif #include "opt_inet.h" @@ -1706,6 +1706,58 @@ } /* + * Build a RTS (Request To Send) control frame. + */ +struct mbuf * +ieee80211_get_rts(struct ieee80211com *ic, const struct ieee80211_frame *wh, + uint16_t dur) +{ + struct ieee80211_frame_rts *rts; + struct mbuf *m; + + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (m == NULL) + return NULL; + + m->m_pkthdr.len = m->m_len = sizeof(struct ieee80211_frame_rts); + + rts = mtod(m, struct ieee80211_frame_rts *); + rts->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL | + IEEE80211_FC0_SUBTYPE_RTS; + rts->i_fc[1] = IEEE80211_FC1_DIR_NODS; + *(uint16_t *)rts->i_dur = htole16(dur); + IEEE80211_ADDR_COPY(rts->i_ra, wh->i_addr1); + IEEE80211_ADDR_COPY(rts->i_ta, wh->i_addr2); + + return m; +} + +/* + * Build a CTS-to-self (Clear To Send) control frame. + */ +struct mbuf * +ieee80211_get_cts_to_self(struct ieee80211com *ic, uint16_t dur) +{ + struct ieee80211_frame_cts *cts; + struct mbuf *m; + + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (m == NULL) + return NULL; + + m->m_pkthdr.len = m->m_len = sizeof(struct ieee80211_frame_cts); + + cts = mtod(m, struct ieee80211_frame_cts *); + cts->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL | + IEEE80211_FC0_SUBTYPE_CTS; + cts->i_fc[1] = IEEE80211_FC1_DIR_NODS; + *(uint16_t *)cts->i_dur = htole16(dur); + IEEE80211_ADDR_COPY(cts->i_ra, ic->ic_myaddr); + + return m; +} + +/* * Allocate a beacon frame and fillin the appropriate bits. */ struct mbuf * Index: src/sys/net80211/ieee80211_proto.h diff -u src/sys/net80211/ieee80211_proto.h:1.17 src/sys/net80211/ieee80211_proto.h:1.18 --- src/sys/net80211/ieee80211_proto.h:1.17 Mon Jul 28 17:54:02 2008 +++ src/sys/net80211/ieee80211_proto.h Mon Feb 21 23:50:08 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ieee80211_proto.h,v 1.17 2008/07/28 17:54:02 christos Exp $ */ +/* $NetBSD: ieee80211_proto.h,v 1.18 2011/02/21 23:50:08 jmcneill Exp $ */ /*- * Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting @@ -78,6 +78,10 @@ struct ieee80211_node *); struct mbuf *ieee80211_encap(struct ieee80211com *, struct mbuf *, struct ieee80211_node *); +struct mbuf *ieee80211_get_rts(struct ieee80211com *, + const struct ieee80211_frame *, uint16_t); +struct mbuf *ieee80211_get_cts_to_self(struct ieee80211com *, + uint16_t); void ieee80211_pwrsave(struct ieee80211com *, struct ieee80211_node *, struct mbuf *);