1229970Sadrian/*-
2229970Sadrian * Copyright (c) 2010-2011 Monthadar Al Jaberi, TerraNet AB
3229970Sadrian * All rights reserved.
4229970Sadrian *
5229970Sadrian * Redistribution and use in source and binary forms, with or without
6229970Sadrian * modification, are permitted provided that the following conditions
7229970Sadrian * are met:
8229970Sadrian * 1. Redistributions of source code must retain the above copyright
9229970Sadrian *    notice, this list of conditions and the following disclaimer,
10229970Sadrian *    without modification.
11229970Sadrian * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12229970Sadrian *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
13229970Sadrian *    redistribution must be conditioned upon including a substantially
14229970Sadrian *    similar Disclaimer requirement for further binary redistribution.
15229970Sadrian *
16229970Sadrian * NO WARRANTY
17229970Sadrian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18229970Sadrian * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19229970Sadrian * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
20229970Sadrian * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21229970Sadrian * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
22229970Sadrian * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23229970Sadrian * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24229970Sadrian * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25229970Sadrian * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26229970Sadrian * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27229970Sadrian * THE POSSIBILITY OF SUCH DAMAGES.
28229970Sadrian *
29229970Sadrian * $FreeBSD$
30229970Sadrian */
31229970Sadrian
32229970Sadrian#ifndef _DEV_WTAP_WTAPVAR_H
33229970Sadrian#define _DEV_WTAP_WTAPVAR_H
34229970Sadrian
35229970Sadrian#include <sys/cdefs.h>
36229970Sadrian#include <sys/param.h>
37229970Sadrian#include <sys/conf.h>
38229970Sadrian#include <sys/module.h>
39229970Sadrian#include <sys/kernel.h>
40229970Sadrian#include <sys/systm.h>
41229970Sadrian#include <sys/sysctl.h>
42229970Sadrian#include <sys/mbuf.h>
43229970Sadrian#include <sys/malloc.h>
44229970Sadrian#include <sys/lock.h>
45229970Sadrian#include <sys/mutex.h>
46229970Sadrian
47229970Sadrian#include <sys/types.h>
48229970Sadrian#include <sys/sockio.h>
49229970Sadrian#include <sys/socket.h>
50229970Sadrian#include <sys/socketvar.h>
51229970Sadrian#include <sys/errno.h>
52229970Sadrian#include <sys/callout.h>
53229970Sadrian#include <sys/endian.h>
54229970Sadrian#include <sys/kthread.h>
55229970Sadrian#include <sys/taskqueue.h>
56229970Sadrian#include <sys/priv.h>
57229970Sadrian#include <sys/sysctl.h>
58229970Sadrian
59229970Sadrian#include <machine/bus.h>
60229970Sadrian
61229970Sadrian#include <net/if.h>
62229970Sadrian#include <net/if_dl.h>
63229970Sadrian#include <net/if_media.h>
64229970Sadrian#include <net/if_types.h>
65229970Sadrian#include <net/if_arp.h>
66229970Sadrian#include <net/ethernet.h>
67229970Sadrian#include <net/if_llc.h>
68229970Sadrian
69229970Sadrian#include <net80211/ieee80211_var.h>
70229970Sadrian#include <net80211/ieee80211_regdomain.h>
71229970Sadrian
72229970Sadrian#include <net/bpf.h>
73229970Sadrian
74229970Sadrian#include <net/vnet.h>
75229970Sadrian
76229970Sadrian#include <netinet/in.h>
77229970Sadrian#include <netinet/if_ether.h>
78229970Sadrian
79229970Sadrian#if 0
80229970Sadrian#define DWTAP_PRINTF(...) printf(__VA_ARGS__)
81229970Sadrian#else
82229970Sadrian#define DWTAP_PRINTF(...)
83229970Sadrian#endif
84229970Sadrian
85229970Sadrian#include "if_wtapioctl.h"
86229970Sadrian
87229970Sadrian#define MAX_NBR_WTAP (64)
88229970Sadrian#define BEACON_INTRERVAL (1000)
89229970Sadrian
90229970SadrianMALLOC_DECLARE(M_WTAP);
91229970SadrianMALLOC_DECLARE(M_WTAP_PACKET);
92229970SadrianMALLOC_DECLARE(M_WTAP_BEACON);
93229970SadrianMALLOC_DECLARE(M_WTAP_RXBUF);
94229970SadrianMALLOC_DECLARE(M_WTAP_PLUGIN);
95229970Sadrian
96229970Sadrian/* driver-specific node state */
97229970Sadrianstruct wtap_node {
98229970Sadrian	struct ieee80211_node an_node;	/* base class */
99229970Sadrian	/* future addons */
100229970Sadrian};
101229970Sadrian#define	WTAP_NODE(ni)	((struct ath_node *)(ni))
102229970Sadrian#define	WTAP_NODE_CONST(ni)	((const struct ath_node *)(ni))
103229970Sadrian
104229970Sadrianstruct wtap_buf {
105229970Sadrian	STAILQ_ENTRY(wtap_buf)	bf_list;
106229970Sadrian	struct mbuf		*m;	/* mbuf for buf */
107229970Sadrian};
108229970Sadriantypedef STAILQ_HEAD(, wtap_buf) wtap_bufhead;
109229970Sadrian
110229970Sadrian#define	WTAP_BUF_BUSY 0x00000002	/* (tx) desc owned by h/w */
111229970Sadrian
112229970Sadrianstruct wtap_vap {
113229970Sadrian	struct ieee80211vap av_vap;		/* base class */
114229970Sadrian	int32_t			id;		/* wtap id */
115229970Sadrian	struct cdev 		*av_dev;	/* userspace injecting frames */
116229970Sadrian	struct wtap_medium	*av_md;		/* back pointer */
117229970Sadrian	struct mbuf *beacon;			/* beacon */
118229970Sadrian	struct ieee80211_node	*bf_node;	/* pointer to the node */
119229970Sadrian	struct ieee80211_beacon_offsets av_boff;/* dynamic update state */
120229970Sadrian	struct callout		av_swba;	/* software beacon alert */
121229970Sadrian	uint32_t		av_bcinterval;	/* beacon interval */
122229970Sadrian	void (*av_recv_mgmt)(struct ieee80211_node *,
123229970Sadrian	    struct mbuf *, int, int, int);
124229970Sadrian	int (*av_newstate)(struct ieee80211vap *,
125229970Sadrian	    enum ieee80211_state, int);
126229970Sadrian	void (*av_bmiss)(struct ieee80211vap *);
127229970Sadrian};
128229970Sadrian#define	WTAP_VAP(vap)	((struct wtap_vap *)(vap))
129229970Sadrian
130229970Sadrianstruct taskqueue;
131229970Sadrian
132229970Sadrianstruct wtap_softc {
133229970Sadrian	int32_t			id;
134229970Sadrian	int32_t			up;
135229970Sadrian	struct ifnet		*sc_ifp;	/* interface common */
136229970Sadrian	struct wtap_medium	*sc_md;		/* interface medium */
137229970Sadrian	struct ieee80211_node*	(* sc_node_alloc)
138229970Sadrian	    (struct ieee80211vap *, const uint8_t [IEEE80211_ADDR_LEN]);
139229970Sadrian	void (*sc_node_free)(struct ieee80211_node *);
140229970Sadrian	int (*if_output)			/* output routine (enqueue) */
141229970Sadrian	    (struct ifnet *, struct mbuf *, struct sockaddr *, struct route *);
142229970Sadrian	void (*if_input) (struct ifnet *, struct mbuf *);/* from h/w driver */
143229970Sadrian	int (*if_transmit)(struct ifnet *, struct mbuf *);/* output routine */
144229970Sadrian	struct mtx		sc_mtx;		/* master lock (recursive) */
145229970Sadrian	struct taskqueue	*sc_tq;		/* private task queue */
146229970Sadrian	wtap_bufhead		sc_rxbuf;	/* receive buffer */
147229970Sadrian	struct task		sc_rxtask;	/* rx int processing */
148229970Sadrian	struct wtap_tx_radiotap_header sc_tx_th;
149229970Sadrian	int			sc_tx_th_len;
150229970Sadrian	struct wtap_rx_radiotap_header sc_rx_th;
151229970Sadrian	int			sc_rx_th_len;
152229970Sadrian};
153229970Sadrian
154229970Sadrianint32_t	wtap_attach(struct wtap_softc *, const uint8_t *macaddr);
155229970Sadrianint32_t	wtap_detach(struct wtap_softc *);
156229970Sadrianvoid	wtap_resume(struct wtap_softc *);
157229970Sadrianvoid	wtap_suspend(struct wtap_softc *);
158229970Sadrianvoid	wtap_shutdown(struct wtap_softc *);
159229970Sadrianvoid	wtap_intr(struct wtap_softc *);
160229970Sadrianvoid	wtap_inject(struct wtap_softc *, struct mbuf *);
161229970Sadrianvoid	wtap_rx_deliver(struct wtap_softc *, struct mbuf *);
162229970Sadrian
163229970Sadrian#endif
164