diff options
author | 2006-11-03 19:02:08 +0000 | |
---|---|---|
committer | 2006-11-03 19:02:08 +0000 | |
commit | b277585a660aa5bed06779b339ade78f7178ee01 (patch) | |
tree | 489d39238a9d12746641ed765fe0776b5b7c611e | |
parent | Return address is way too useful to not print here. (diff) | |
download | wireguard-openbsd-b277585a660aa5bed06779b339ade78f7178ee01.tar.xz wireguard-openbsd-b277585a660aa5bed06779b339ade78f7178ee01.zip |
Add two new functions:
- ieee80211_get_rts
- ieee80211_get_cts_to_self
that can be use by drivers for chipsets that don't offer hardware assisted
RTS/CTS protection (like ral/ural/rum).
"no objections here" jsg@
-rw-r--r-- | sys/net80211/ieee80211_output.c | 56 | ||||
-rw-r--r-- | sys/net80211/ieee80211_proto.h | 6 |
2 files changed, 60 insertions, 2 deletions
diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c index a90f55453fc..2965b623364 100644 --- a/sys/net80211/ieee80211_output.c +++ b/sys/net80211/ieee80211_output.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ieee80211_output.c,v 1.21 2006/06/27 20:55:51 reyk Exp $ */ +/* $OpenBSD: ieee80211_output.c,v 1.22 2006/11/03 19:02:08 damien Exp $ */ /* $NetBSD: ieee80211_output.c,v 1.13 2004/05/31 11:02:55 dyoung Exp $ */ /*- @@ -929,6 +929,60 @@ bad: #undef senderr } +/* + * Build a RTS (Request To Send) control frame. + */ +struct mbuf * +ieee80211_get_rts(struct ieee80211com *ic, const struct ieee80211_frame *wh, + u_int16_t dur) +{ + struct ieee80211_frame_rts *rts; + struct mbuf *m; + + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (m == NULL) { + ic->ic_stats.is_tx_nombuf++; + 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, u_int16_t dur) +{ + struct ieee80211_frame_cts *cts; + struct mbuf *m; + + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (m == NULL) { + ic->ic_stats.is_tx_nombuf++; + 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; +} + struct mbuf * ieee80211_beacon_alloc(struct ieee80211com *ic, struct ieee80211_node *ni) { diff --git a/sys/net80211/ieee80211_proto.h b/sys/net80211/ieee80211_proto.h index 392a53634eb..10de5944d8d 100644 --- a/sys/net80211/ieee80211_proto.h +++ b/sys/net80211/ieee80211_proto.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ieee80211_proto.h,v 1.9 2006/06/18 18:39:41 damien Exp $ */ +/* $OpenBSD: ieee80211_proto.h,v 1.10 2006/11/03 19:02:08 damien Exp $ */ /* $NetBSD: ieee80211_proto.h,v 1.3 2003/10/13 04:23:56 dyoung Exp $ */ /*- @@ -69,6 +69,10 @@ extern int ieee80211_send_mgmt(struct ieee80211com *, struct ieee80211_node *, int, int); extern struct mbuf *ieee80211_encap(struct ifnet *, struct mbuf *, struct ieee80211_node **); +extern struct mbuf *ieee80211_get_rts(struct ieee80211com *, + const struct ieee80211_frame *, u_int16_t); +extern struct mbuf *ieee80211_get_cts_to_self(struct ieee80211com *, + u_int16_t); extern struct mbuf *ieee80211_beacon_alloc(struct ieee80211com *, struct ieee80211_node *); extern void ieee80211_pwrsave(struct ieee80211com *, struct ieee80211_node *, |