summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordamien <damien@openbsd.org>2006-11-03 19:02:08 +0000
committerdamien <damien@openbsd.org>2006-11-03 19:02:08 +0000
commitb277585a660aa5bed06779b339ade78f7178ee01 (patch)
tree489d39238a9d12746641ed765fe0776b5b7c611e
parentReturn address is way too useful to not print here. (diff)
downloadwireguard-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.c56
-rw-r--r--sys/net80211/ieee80211_proto.h6
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 *,