remove dos style newlines
This commit is contained in:
@ -1,155 +1,155 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_network.h"
|
||||
#include <linux/socket.h>
|
||||
#include "wifi_drivers.h"
|
||||
#include "netlink_link.h"
|
||||
|
||||
/* */
|
||||
struct netlink_request {
|
||||
struct nlmsghdr hdr;
|
||||
struct ifinfomsg ifinfo;
|
||||
char opts[16];
|
||||
};
|
||||
|
||||
/* */
|
||||
struct netlink* netlink_init(void) {
|
||||
int sock;
|
||||
struct sockaddr_nl local;
|
||||
struct netlink* netlinkhandle;
|
||||
|
||||
/* Create netlink socket */
|
||||
sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
|
||||
if (sock < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Bind to kernel */
|
||||
memset(&local, 0, sizeof(struct sockaddr_nl));
|
||||
local.nl_family = AF_NETLINK;
|
||||
local.nl_groups = RTMGRP_LINK;
|
||||
if (bind(sock, (struct sockaddr*)&local, sizeof(struct sockaddr_nl)) < 0) {
|
||||
close(sock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Netlink reference */
|
||||
netlinkhandle = (struct netlink*)capwap_alloc(sizeof(struct netlink));
|
||||
netlinkhandle->sock = sock;
|
||||
netlinkhandle->nl_sequence = 1;
|
||||
|
||||
return netlinkhandle;
|
||||
}
|
||||
|
||||
/* */
|
||||
void netlink_free(struct netlink* netlinkhandle) {
|
||||
ASSERT(netlinkhandle != NULL);
|
||||
ASSERT(netlinkhandle->sock >= 0);
|
||||
|
||||
/* */
|
||||
close(netlinkhandle->sock);
|
||||
capwap_free(netlinkhandle);
|
||||
}
|
||||
|
||||
/* */
|
||||
void netlink_event_receive(int fd, void** params, int paramscount) {
|
||||
int result;
|
||||
struct netlink* netlinkhandle;
|
||||
struct sockaddr_nl from;
|
||||
socklen_t fromlen;
|
||||
char buffer[8192];
|
||||
struct nlmsghdr* message;
|
||||
|
||||
ASSERT(fd >= 0);
|
||||
ASSERT(params != NULL);
|
||||
ASSERT(paramscount == 2);
|
||||
|
||||
/* */
|
||||
netlinkhandle = (struct netlink*)params[0];
|
||||
|
||||
/* Retrieve all netlink message */
|
||||
for (;;) {
|
||||
/* Get message */
|
||||
fromlen = sizeof(struct sockaddr_nl);
|
||||
result = recvfrom(netlinkhandle->sock, buffer, sizeof(buffer), MSG_DONTWAIT, (struct sockaddr*)&from, &fromlen);
|
||||
if (result <= 0) {
|
||||
if (errno == EINTR) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Parsing message */
|
||||
message = (struct nlmsghdr*)buffer;
|
||||
while (NLMSG_OK(message, result)) {
|
||||
switch (message->nlmsg_type) {
|
||||
case RTM_NEWLINK: {
|
||||
if (netlinkhandle->newlink_event && NLMSG_PAYLOAD(message, 0) >= sizeof(struct ifinfomsg)) {
|
||||
netlinkhandle->newlink_event((wifi_global_handle)params[1], NLMSG_DATA(message), (uint8_t*)(NLMSG_DATA(message) + NLMSG_ALIGN(sizeof(struct ifinfomsg))), NLMSG_PAYLOAD(message, sizeof(struct ifinfomsg)));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case RTM_DELLINK: {
|
||||
if (netlinkhandle->dellink_event && NLMSG_PAYLOAD(message, 0) >= sizeof(struct ifinfomsg)) {
|
||||
netlinkhandle->dellink_event((wifi_global_handle)params[1], NLMSG_DATA(message), (uint8_t*)(NLMSG_DATA(message) + NLMSG_ALIGN(sizeof(struct ifinfomsg))), NLMSG_PAYLOAD(message, sizeof(struct ifinfomsg)));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* */
|
||||
message = NLMSG_NEXT(message, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int netlink_set_link_status(struct netlink* netlinkhandle, int ifindex, int linkmode, int operstate) {
|
||||
char* data;
|
||||
struct rtattr* rta;
|
||||
struct netlink_request request;
|
||||
|
||||
ASSERT(netlinkhandle != NULL);
|
||||
ASSERT(ifindex >= 0);
|
||||
|
||||
/* */
|
||||
memset(&request, 0, sizeof(struct netlink_request));
|
||||
request.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
|
||||
request.hdr.nlmsg_type = RTM_SETLINK;
|
||||
request.hdr.nlmsg_flags = NLM_F_REQUEST;
|
||||
request.hdr.nlmsg_seq = netlinkhandle->nl_sequence++;
|
||||
request.hdr.nlmsg_pid = 0;
|
||||
request.ifinfo.ifi_family = AF_UNSPEC;
|
||||
request.ifinfo.ifi_type = 0;
|
||||
request.ifinfo.ifi_index = ifindex;
|
||||
request.ifinfo.ifi_flags = 0;
|
||||
request.ifinfo.ifi_change = 0;
|
||||
|
||||
if (linkmode != -1) {
|
||||
rta = (struct rtattr*)((char*)&request + NLMSG_ALIGN(request.hdr.nlmsg_len));
|
||||
rta->rta_type = IFLA_LINKMODE;
|
||||
rta->rta_len = RTA_LENGTH(sizeof(char));
|
||||
data = (char*)RTA_DATA(rta);
|
||||
*data = (char)linkmode;
|
||||
request.hdr.nlmsg_len = NLMSG_ALIGN(request.hdr.nlmsg_len) + RTA_LENGTH(sizeof(char));
|
||||
}
|
||||
|
||||
if (operstate != -1) {
|
||||
rta = (struct rtattr*)((char*)&request + NLMSG_ALIGN(request.hdr.nlmsg_len));
|
||||
rta->rta_type = IFLA_OPERSTATE;
|
||||
rta->rta_len = RTA_LENGTH(sizeof(char));
|
||||
data = (char*)RTA_DATA(rta);
|
||||
*data = (char)operstate;
|
||||
request.hdr.nlmsg_len = NLMSG_ALIGN(request.hdr.nlmsg_len) + RTA_LENGTH(sizeof(char));
|
||||
}
|
||||
|
||||
/* Send new interface operation state */
|
||||
if (send(netlinkhandle->sock, &request, request.hdr.nlmsg_len, 0) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#include "capwap.h"
|
||||
#include "capwap_network.h"
|
||||
#include <linux/socket.h>
|
||||
#include "wifi_drivers.h"
|
||||
#include "netlink_link.h"
|
||||
|
||||
/* */
|
||||
struct netlink_request {
|
||||
struct nlmsghdr hdr;
|
||||
struct ifinfomsg ifinfo;
|
||||
char opts[16];
|
||||
};
|
||||
|
||||
/* */
|
||||
struct netlink* netlink_init(void) {
|
||||
int sock;
|
||||
struct sockaddr_nl local;
|
||||
struct netlink* netlinkhandle;
|
||||
|
||||
/* Create netlink socket */
|
||||
sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
|
||||
if (sock < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Bind to kernel */
|
||||
memset(&local, 0, sizeof(struct sockaddr_nl));
|
||||
local.nl_family = AF_NETLINK;
|
||||
local.nl_groups = RTMGRP_LINK;
|
||||
if (bind(sock, (struct sockaddr*)&local, sizeof(struct sockaddr_nl)) < 0) {
|
||||
close(sock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Netlink reference */
|
||||
netlinkhandle = (struct netlink*)capwap_alloc(sizeof(struct netlink));
|
||||
netlinkhandle->sock = sock;
|
||||
netlinkhandle->nl_sequence = 1;
|
||||
|
||||
return netlinkhandle;
|
||||
}
|
||||
|
||||
/* */
|
||||
void netlink_free(struct netlink* netlinkhandle) {
|
||||
ASSERT(netlinkhandle != NULL);
|
||||
ASSERT(netlinkhandle->sock >= 0);
|
||||
|
||||
/* */
|
||||
close(netlinkhandle->sock);
|
||||
capwap_free(netlinkhandle);
|
||||
}
|
||||
|
||||
/* */
|
||||
void netlink_event_receive(int fd, void** params, int paramscount) {
|
||||
int result;
|
||||
struct netlink* netlinkhandle;
|
||||
struct sockaddr_nl from;
|
||||
socklen_t fromlen;
|
||||
char buffer[8192];
|
||||
struct nlmsghdr* message;
|
||||
|
||||
ASSERT(fd >= 0);
|
||||
ASSERT(params != NULL);
|
||||
ASSERT(paramscount == 2);
|
||||
|
||||
/* */
|
||||
netlinkhandle = (struct netlink*)params[0];
|
||||
|
||||
/* Retrieve all netlink message */
|
||||
for (;;) {
|
||||
/* Get message */
|
||||
fromlen = sizeof(struct sockaddr_nl);
|
||||
result = recvfrom(netlinkhandle->sock, buffer, sizeof(buffer), MSG_DONTWAIT, (struct sockaddr*)&from, &fromlen);
|
||||
if (result <= 0) {
|
||||
if (errno == EINTR) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Parsing message */
|
||||
message = (struct nlmsghdr*)buffer;
|
||||
while (NLMSG_OK(message, result)) {
|
||||
switch (message->nlmsg_type) {
|
||||
case RTM_NEWLINK: {
|
||||
if (netlinkhandle->newlink_event && NLMSG_PAYLOAD(message, 0) >= sizeof(struct ifinfomsg)) {
|
||||
netlinkhandle->newlink_event((wifi_global_handle)params[1], NLMSG_DATA(message), (uint8_t*)(NLMSG_DATA(message) + NLMSG_ALIGN(sizeof(struct ifinfomsg))), NLMSG_PAYLOAD(message, sizeof(struct ifinfomsg)));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case RTM_DELLINK: {
|
||||
if (netlinkhandle->dellink_event && NLMSG_PAYLOAD(message, 0) >= sizeof(struct ifinfomsg)) {
|
||||
netlinkhandle->dellink_event((wifi_global_handle)params[1], NLMSG_DATA(message), (uint8_t*)(NLMSG_DATA(message) + NLMSG_ALIGN(sizeof(struct ifinfomsg))), NLMSG_PAYLOAD(message, sizeof(struct ifinfomsg)));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* */
|
||||
message = NLMSG_NEXT(message, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int netlink_set_link_status(struct netlink* netlinkhandle, int ifindex, int linkmode, int operstate) {
|
||||
char* data;
|
||||
struct rtattr* rta;
|
||||
struct netlink_request request;
|
||||
|
||||
ASSERT(netlinkhandle != NULL);
|
||||
ASSERT(ifindex >= 0);
|
||||
|
||||
/* */
|
||||
memset(&request, 0, sizeof(struct netlink_request));
|
||||
request.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
|
||||
request.hdr.nlmsg_type = RTM_SETLINK;
|
||||
request.hdr.nlmsg_flags = NLM_F_REQUEST;
|
||||
request.hdr.nlmsg_seq = netlinkhandle->nl_sequence++;
|
||||
request.hdr.nlmsg_pid = 0;
|
||||
request.ifinfo.ifi_family = AF_UNSPEC;
|
||||
request.ifinfo.ifi_type = 0;
|
||||
request.ifinfo.ifi_index = ifindex;
|
||||
request.ifinfo.ifi_flags = 0;
|
||||
request.ifinfo.ifi_change = 0;
|
||||
|
||||
if (linkmode != -1) {
|
||||
rta = (struct rtattr*)((char*)&request + NLMSG_ALIGN(request.hdr.nlmsg_len));
|
||||
rta->rta_type = IFLA_LINKMODE;
|
||||
rta->rta_len = RTA_LENGTH(sizeof(char));
|
||||
data = (char*)RTA_DATA(rta);
|
||||
*data = (char)linkmode;
|
||||
request.hdr.nlmsg_len = NLMSG_ALIGN(request.hdr.nlmsg_len) + RTA_LENGTH(sizeof(char));
|
||||
}
|
||||
|
||||
if (operstate != -1) {
|
||||
rta = (struct rtattr*)((char*)&request + NLMSG_ALIGN(request.hdr.nlmsg_len));
|
||||
rta->rta_type = IFLA_OPERSTATE;
|
||||
rta->rta_len = RTA_LENGTH(sizeof(char));
|
||||
data = (char*)RTA_DATA(rta);
|
||||
*data = (char)operstate;
|
||||
request.hdr.nlmsg_len = NLMSG_ALIGN(request.hdr.nlmsg_len) + RTA_LENGTH(sizeof(char));
|
||||
}
|
||||
|
||||
/* Send new interface operation state */
|
||||
if (send(netlinkhandle->sock, &request, request.hdr.nlmsg_len, 0) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,59 +1,59 @@
|
||||
#ifndef __NETLINK_LINK_HEADER__
|
||||
#define __NETLINK_LINK_HEADER__
|
||||
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/netlink.h>
|
||||
|
||||
/* */
|
||||
#ifndef IFLA_IFNAME
|
||||
#define IFLA_IFNAME 3
|
||||
#endif
|
||||
|
||||
#ifndef IFLA_WIRELESS
|
||||
#define IFLA_WIRELESS 11
|
||||
#endif
|
||||
|
||||
#ifndef IFLA_OPERSTATE
|
||||
#define IFLA_OPERSTATE 16
|
||||
#endif
|
||||
|
||||
#ifndef IFLA_LINKMODE
|
||||
#define IFLA_LINKMODE 17
|
||||
#endif
|
||||
|
||||
#ifndef IF_OPER_DORMANT
|
||||
#define IF_OPER_DORMANT 5
|
||||
#endif
|
||||
|
||||
#ifndef IF_OPER_UP
|
||||
#define IF_OPER_UP 6
|
||||
#endif
|
||||
|
||||
#ifndef IFF_LOWER_UP
|
||||
#define IFF_LOWER_UP 0x10000
|
||||
#endif
|
||||
|
||||
#ifndef IFF_DORMANT
|
||||
#define IFF_DORMANT 0x20000
|
||||
#endif
|
||||
|
||||
/* */
|
||||
struct netlink {
|
||||
int sock;
|
||||
void (*newlink_event)(wifi_global_handle handle, struct ifinfomsg* infomsg, uint8_t* data, int length);
|
||||
void (*dellink_event)(wifi_global_handle handle, struct ifinfomsg* infomsg, uint8_t* data, int length);
|
||||
|
||||
int nl_sequence;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct netlink* netlink_init(void);
|
||||
void netlink_free(struct netlink* netlinkhandle);
|
||||
|
||||
/* */
|
||||
int netlink_set_link_status(struct netlink* netlinkhandle, int ifindex, int linkmode, int operstate);
|
||||
|
||||
/* */
|
||||
void netlink_event_receive(int fd, void** params, int paramscount);
|
||||
|
||||
#endif /* __NETLINK_LINK_HEADER__ */
|
||||
#ifndef __NETLINK_LINK_HEADER__
|
||||
#define __NETLINK_LINK_HEADER__
|
||||
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/netlink.h>
|
||||
|
||||
/* */
|
||||
#ifndef IFLA_IFNAME
|
||||
#define IFLA_IFNAME 3
|
||||
#endif
|
||||
|
||||
#ifndef IFLA_WIRELESS
|
||||
#define IFLA_WIRELESS 11
|
||||
#endif
|
||||
|
||||
#ifndef IFLA_OPERSTATE
|
||||
#define IFLA_OPERSTATE 16
|
||||
#endif
|
||||
|
||||
#ifndef IFLA_LINKMODE
|
||||
#define IFLA_LINKMODE 17
|
||||
#endif
|
||||
|
||||
#ifndef IF_OPER_DORMANT
|
||||
#define IF_OPER_DORMANT 5
|
||||
#endif
|
||||
|
||||
#ifndef IF_OPER_UP
|
||||
#define IF_OPER_UP 6
|
||||
#endif
|
||||
|
||||
#ifndef IFF_LOWER_UP
|
||||
#define IFF_LOWER_UP 0x10000
|
||||
#endif
|
||||
|
||||
#ifndef IFF_DORMANT
|
||||
#define IFF_DORMANT 0x20000
|
||||
#endif
|
||||
|
||||
/* */
|
||||
struct netlink {
|
||||
int sock;
|
||||
void (*newlink_event)(wifi_global_handle handle, struct ifinfomsg* infomsg, uint8_t* data, int length);
|
||||
void (*dellink_event)(wifi_global_handle handle, struct ifinfomsg* infomsg, uint8_t* data, int length);
|
||||
|
||||
int nl_sequence;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct netlink* netlink_init(void);
|
||||
void netlink_free(struct netlink* netlinkhandle);
|
||||
|
||||
/* */
|
||||
int netlink_set_link_status(struct netlink* netlinkhandle, int ifindex, int linkmode, int operstate);
|
||||
|
||||
/* */
|
||||
void netlink_event_receive(int fd, void** params, int paramscount);
|
||||
|
||||
#endif /* __NETLINK_LINK_HEADER__ */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,436 +1,436 @@
|
||||
#ifndef __WIFI_DRIVERS_HEADER__
|
||||
#define __WIFI_DRIVERS_HEADER__
|
||||
|
||||
#include <net/if_arp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include "ieee80211.h"
|
||||
|
||||
/* */
|
||||
#define WIFI_DRIVER_NAME_SIZE 16
|
||||
|
||||
/* */
|
||||
#define WIFI_BAND_UNKNOWN 0
|
||||
#define WIFI_BAND_2GHZ 1
|
||||
#define WIFI_BAND_5GHZ 2
|
||||
|
||||
/* */
|
||||
#define WIFI_CAPABILITY_RADIOSUPPORTED 0x00000001
|
||||
#define WIFI_CAPABILITY_RADIOTYPE 0x00000002
|
||||
#define WIFI_CAPABILITY_BANDS 0x00000004
|
||||
#define WIFI_CAPABILITY_CIPHERS 0x00000008
|
||||
#define WIFI_CAPABILITY_ANTENNA_MASK 0x00000010
|
||||
#define WIFI_CAPABILITY_MAX_SCAN_SSIDS 0x00000020
|
||||
#define WIFI_CAPABILITY_MAX_SCHED_SCAN_SSIDS 0x00000040
|
||||
#define WIFI_CAPABILITY_MAX_MATCH_SETS 0x00000080
|
||||
#define WIFI_CAPABILITY_MAX_ACL_MACADDRESS 0x00000100
|
||||
|
||||
/* */
|
||||
#define WIFI_CAPABILITY_FLAGS_OFFCHANNEL_TX_OK 0x00000001
|
||||
#define WIFI_CAPABILITY_FLAGS_ROAM_SUPPORT 0x00000002
|
||||
#define WIFI_CAPABILITY_FLAGS_SUPPORT_AP_UAPSD 0x00000004
|
||||
#define WIFI_CAPABILITY_FLAGS_DEVICE_AP_SME 0x00000008
|
||||
#define WIFI_CAPABILITY_FLAGS_PROBE_RESPONSE_OFFLOAD 0x00000010
|
||||
|
||||
/* */
|
||||
#define WIFI_CAPABILITY_AP_SUPPORTED 0x00000001
|
||||
#define WIFI_CAPABILITY_AP_VLAN_SUPPORTED 0x00000002
|
||||
#define WIFI_CAPABILITY_ADHOC_SUPPORTED 0x00000004
|
||||
#define WIFI_CAPABILITY_MONITOR_SUPPORTED 0x00000008
|
||||
#define WIFI_CAPABILITY_WDS_SUPPORTED 0x00000010
|
||||
|
||||
#define FREQ_CAPABILITY_DISABLED 0x00000001
|
||||
#define FREQ_CAPABILITY_PASSIVE_SCAN 0x00000002
|
||||
#define FREQ_CAPABILITY_NO_IBBS 0x00000004
|
||||
#define FREQ_CAPABILITY_RADAR 0x00000008
|
||||
#define FREQ_CAPABILITY_DFS_STATE 0x00000010
|
||||
#define FREQ_CAPABILITY_DFS_TIME 0x00000020
|
||||
|
||||
#define RATE_CAPABILITY_SHORTPREAMBLE 0x00000001
|
||||
|
||||
#define CIPHER_CAPABILITY_UNKNOWN 0
|
||||
#define CIPHER_CAPABILITY_WEP40 1
|
||||
#define CIPHER_CAPABILITY_WEP104 2
|
||||
#define CIPHER_CAPABILITY_TKIP 3
|
||||
#define CIPHER_CAPABILITY_CCMP 4
|
||||
#define CIPHER_CAPABILITY_CMAC 5
|
||||
#define CIPHER_CAPABILITY_GCMP 6
|
||||
#define CIPHER_CAPABILITY_WPI_SMS4 7
|
||||
|
||||
#define IEEE80211_DFS_USABLE 0
|
||||
#define IEEE80211_DFS_UNAVAILABLE 1
|
||||
#define IEEE80211_DFS_AVAILABLE 2
|
||||
|
||||
#define WLAN_INTERFACE_AP 1
|
||||
|
||||
/* */
|
||||
DECLARE_OPAQUE_TYPE(wifi_global_handle);
|
||||
DECLARE_OPAQUE_TYPE(wifi_device_handle);
|
||||
DECLARE_OPAQUE_TYPE(wifi_wlan_handle);
|
||||
|
||||
/* */
|
||||
struct device_setrates_params {
|
||||
int supportedratescount;
|
||||
uint8_t supportedrates[IEEE80211_SUPPORTEDRATE_MAX_COUNT];
|
||||
int basicratescount;
|
||||
uint8_t basicrates[IEEE80211_SUPPORTEDRATE_MAX_COUNT];
|
||||
};
|
||||
|
||||
/* */
|
||||
#define WIFI_COUNTRY_LENGTH 4
|
||||
struct device_setconfiguration_params {
|
||||
int shortpreamble;
|
||||
uint8_t maxbssid;
|
||||
uint8_t dtimperiod;
|
||||
uint8_t bssid[MACADDRESS_EUI48_LENGTH];
|
||||
uint16_t beaconperiod;
|
||||
uint8_t country[WIFI_COUNTRY_LENGTH];
|
||||
};
|
||||
|
||||
/* */
|
||||
typedef int (*send_frame_to_ac)(void* param, const uint8_t* frame, int length, uint8_t rssi, uint8_t snr, uint16_t rate);
|
||||
|
||||
struct wlan_startap_params {
|
||||
uint8_t radioid;
|
||||
uint8_t wlanid;
|
||||
|
||||
const char* ssid;
|
||||
uint8_t ssid_hidden;
|
||||
uint16_t capability;
|
||||
uint8_t qos;
|
||||
uint8_t authmode;
|
||||
uint8_t macmode;
|
||||
uint8_t tunnelmode;
|
||||
};
|
||||
|
||||
|
||||
/* */
|
||||
struct wlan_send_frame_params {
|
||||
uint8_t* packet;
|
||||
int length;
|
||||
|
||||
uint32_t frequency;
|
||||
uint32_t duration;
|
||||
int offchannel_tx_ok;
|
||||
int no_cck_rate;
|
||||
int no_wait_ack;
|
||||
|
||||
uint64_t cookie;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct station_add_params {
|
||||
uint8_t* address;
|
||||
};
|
||||
|
||||
/* Interface capability */
|
||||
struct wifi_freq_capability {
|
||||
unsigned long flags;
|
||||
|
||||
unsigned long frequency; /* MHz */
|
||||
unsigned long channel;
|
||||
|
||||
unsigned long maxtxpower; /* mBm = 100 * dBm */
|
||||
|
||||
unsigned long dfsstate;
|
||||
unsigned long dfstime; /* ms */
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_rate_capability {
|
||||
unsigned long flags;
|
||||
|
||||
uint8_t bitrate;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_band_capability {
|
||||
unsigned long band;
|
||||
|
||||
unsigned long htcapability;
|
||||
|
||||
struct capwap_array* freq;
|
||||
struct capwap_array* rate;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_cipher_capability {
|
||||
unsigned long cipher;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_capability {
|
||||
struct wifi_device* device;
|
||||
|
||||
unsigned long flags;
|
||||
unsigned long capability;
|
||||
|
||||
/* WIFI_CAPABILITY_RADIOSUPPORTED */
|
||||
unsigned long radiosupported;
|
||||
|
||||
/* WIFI_CAPABILITY_RADIOTYPE */
|
||||
unsigned long radiotype;
|
||||
|
||||
/* WIFI_CAPABILITY_ANTENNA_MASK */
|
||||
unsigned long txantennamask;
|
||||
unsigned long rxantennamask;
|
||||
|
||||
/* WIFI_CAPABILITY_BANDS */
|
||||
struct capwap_array* bands;
|
||||
|
||||
/* WIFI_CAPABILITY_CIPHERS */
|
||||
struct capwap_array* ciphers;
|
||||
|
||||
/* WIFI_CAPABILITY_MAX_SCAN_SSIDS */
|
||||
uint8_t maxscanssids;
|
||||
|
||||
/* WIFI_CAPABILITY_MAX_SCHED_SCAN_SSIDS */
|
||||
uint8_t maxschedscanssids;
|
||||
|
||||
/* WIFI_CAPABILITY_MAX_MATCH_SETS */
|
||||
uint8_t maxmatchsets;
|
||||
|
||||
/* WIFI_CAPABILITY_MAX_ACL_MACADDRESS */
|
||||
uint8_t maxaclmacaddress;
|
||||
};
|
||||
|
||||
/* Frequency configuration */
|
||||
struct wifi_frequency {
|
||||
uint32_t band;
|
||||
uint32_t mode;
|
||||
uint8_t channel;
|
||||
uint32_t frequency;
|
||||
};
|
||||
|
||||
/* */
|
||||
#define WIFI_EVENT_MAX_ITEMS 2
|
||||
struct wifi_event {
|
||||
void (*event_handler)(int fd, void** params, int paramscount);
|
||||
int paramscount;
|
||||
void* params[WIFI_EVENT_MAX_ITEMS];
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_driver_instance {
|
||||
struct wifi_driver_ops* ops; /* Driver functions */
|
||||
wifi_global_handle handle; /* Global instance handle */
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_global {
|
||||
int sock_util;
|
||||
struct capwap_list* devices;
|
||||
|
||||
/* Timeout */
|
||||
struct capwap_timeout* timeout;
|
||||
|
||||
/* Stations */
|
||||
struct capwap_hash* stations;
|
||||
};
|
||||
|
||||
/* Device handle */
|
||||
#define WIFI_DEVICE_SET_FREQUENCY 0x00000001
|
||||
#define WIFI_DEVICE_SET_RATES 0x00000002
|
||||
#define WIFI_DEVICE_SET_CONFIGURATION 0x00000004
|
||||
#define WIFI_DEVICE_REQUIRED_FOR_BSS (WIFI_DEVICE_SET_FREQUENCY | WIFI_DEVICE_SET_RATES | WIFI_DEVICE_SET_CONFIGURATION)
|
||||
|
||||
struct wifi_device {
|
||||
struct wifi_global* global;
|
||||
|
||||
wifi_device_handle handle; /* Device handle */
|
||||
struct wifi_driver_instance* instance; /* Driver instance */
|
||||
|
||||
uint32_t phyindex;
|
||||
char phyname[IFNAMSIZ];
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
/* */
|
||||
struct capwap_list* wlans;
|
||||
unsigned long wlanactive;
|
||||
|
||||
/* Current frequency */
|
||||
struct wifi_frequency currentfrequency;
|
||||
|
||||
/* */
|
||||
uint16_t beaconperiod;
|
||||
uint8_t dtimperiod;
|
||||
int shortpreamble;
|
||||
|
||||
/* Cached capability */
|
||||
struct wifi_capability* capability;
|
||||
|
||||
/* Rates */
|
||||
unsigned long supportedratescount;
|
||||
uint8_t supportedrates[IEEE80211_SUPPORTEDRATE_MAX_COUNT];
|
||||
unsigned long basicratescount;
|
||||
uint8_t basicrates[IEEE80211_SUPPORTEDRATE_MAX_COUNT];
|
||||
|
||||
/* ERP Information */
|
||||
int olbc;
|
||||
unsigned long stationsnonerpcount;
|
||||
unsigned long stationsnoshortslottimecount;
|
||||
unsigned long stationsnoshortpreamblecount;
|
||||
};
|
||||
|
||||
/* WLAN handle */
|
||||
#define WIFI_WLAN_RUNNING 0x00000001
|
||||
#define WIFI_WLAN_SET_BEACON 0x00000002
|
||||
#define WIFI_WLAN_OPERSTATE_RUNNING 0x00000004
|
||||
|
||||
struct wifi_wlan {
|
||||
wifi_wlan_handle handle;
|
||||
struct wifi_device* device;
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
uint32_t virtindex;
|
||||
char virtname[IFNAMSIZ];
|
||||
|
||||
uint8_t address[MACADDRESS_EUI48_LENGTH];
|
||||
|
||||
/* */
|
||||
uint8_t radioid;
|
||||
uint8_t wlanid;
|
||||
|
||||
/* WLAN information */
|
||||
char ssid[IEEE80211_SSID_MAX_LENGTH + 1];
|
||||
uint8_t ssid_hidden;
|
||||
uint16_t capability;
|
||||
|
||||
/* Tunnel */
|
||||
uint8_t macmode;
|
||||
uint8_t tunnelmode;
|
||||
|
||||
/* Authentication */
|
||||
uint8_t authmode;
|
||||
|
||||
/* Station information */
|
||||
unsigned long stationscount;
|
||||
unsigned long maxstationscount;
|
||||
|
||||
uint32_t aidbitfield[IEEE80211_AID_BITFIELD_SIZE];
|
||||
};
|
||||
|
||||
/* Station handle */
|
||||
#define WIFI_STATION_FLAGS_AUTHENTICATED 0x00000001
|
||||
#define WIFI_STATION_FLAGS_ASSOCIATE 0x00000002
|
||||
#define WIFI_STATION_FLAGS_NON_ERP 0x00000004
|
||||
#define WIFI_STATION_FLAGS_NO_SHORT_SLOT_TIME 0x00000008
|
||||
#define WIFI_STATION_FLAGS_NO_SHORT_PREAMBLE 0x00000010
|
||||
#define WIFI_STATION_FLAGS_WMM 0x00000020
|
||||
#define WIFI_STATION_FLAGS_AUTHORIZED 0x00000040
|
||||
|
||||
/* */
|
||||
#define WIFI_STATION_TIMEOUT_ASSOCIATION_COMPLETE 30000
|
||||
#define WIFI_STATION_TIMEOUT_AFTER_DEAUTHENTICATED 5000
|
||||
|
||||
/* */
|
||||
#define WIFI_STATION_TIMEOUT_ACTION_DELETE 0x00000001
|
||||
#define WIFI_STATION_TIMEOUT_ACTION_DEAUTHENTICATE 0x00000002
|
||||
|
||||
struct wifi_station {
|
||||
uint8_t address[MACADDRESS_EUI48_LENGTH];
|
||||
char addrtext[CAPWAP_MACADDRESS_EUI48_BUFFER];
|
||||
|
||||
/* */
|
||||
struct wifi_wlan* wlan;
|
||||
|
||||
/* */
|
||||
unsigned long flags;
|
||||
|
||||
/* Timers */
|
||||
int timeoutaction;
|
||||
unsigned long idtimeout;
|
||||
|
||||
/* */
|
||||
uint16_t capability;
|
||||
uint16_t listeninterval;
|
||||
uint16_t aid;
|
||||
|
||||
/* */
|
||||
int supportedratescount;
|
||||
uint8_t supportedrates[IEEE80211_SUPPORTEDRATE_MAX_COUNT];
|
||||
|
||||
/* Authentication */
|
||||
uint16_t authalgorithm;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_driver_ops {
|
||||
const char* name; /* Name of wifi driver */
|
||||
const char* description; /* Description of wifi driver */
|
||||
|
||||
/* Global initialize driver */
|
||||
wifi_global_handle (*global_init)(void);
|
||||
int (*global_getfdevent)(wifi_global_handle handle, struct pollfd* fds, struct wifi_event* events);
|
||||
void (*global_deinit)(wifi_global_handle handle);
|
||||
|
||||
/* Device functions */
|
||||
int (*device_init)(wifi_global_handle handle, struct wifi_device* device);
|
||||
int (*device_getfdevent)(struct wifi_device* device, struct pollfd* fds, struct wifi_event* events);
|
||||
int (*device_getcapability)(struct wifi_device* device, struct wifi_capability* capability);
|
||||
void (*device_updatebeacons)(struct wifi_device* device);
|
||||
int (*device_setfrequency)(struct wifi_device* device);
|
||||
void (*device_deinit)(struct wifi_device* device);
|
||||
|
||||
/* WLAN functions */
|
||||
wifi_wlan_handle (*wlan_create)(struct wifi_device* device, struct wifi_wlan* wlan);
|
||||
int (*wlan_getfdevent)(struct wifi_wlan* wlan, struct pollfd* fds, struct wifi_event* events);
|
||||
int (*wlan_startap)(struct wifi_wlan* wlan);
|
||||
void (*wlan_stopap)(struct wifi_wlan* wlan);
|
||||
int (*wlan_sendframe)(struct wifi_wlan* wlan, uint8_t* frame, int length, uint32_t frequency, uint32_t duration, int offchannel_tx_ok, int no_cck_rate, int no_wait_ack);
|
||||
void (*wlan_delete)(struct wifi_wlan* wlan);
|
||||
|
||||
/* Stations functions */
|
||||
int (*station_authorize)(struct wifi_wlan* wlan, struct wifi_station* station);
|
||||
int (*station_deauthorize)(struct wifi_wlan* wlan, const uint8_t* address);
|
||||
};
|
||||
|
||||
/* Initialize wifi driver engine */
|
||||
int wifi_driver_init(struct capwap_timeout* timeout);
|
||||
void wifi_driver_free(void);
|
||||
|
||||
/* Get File Descriptor Event */
|
||||
int wifi_event_getfd(struct pollfd* fds, struct wifi_event* events, int count);
|
||||
|
||||
/* */
|
||||
struct wifi_wlan* wifi_get_wlan(uint32_t ifindex);
|
||||
|
||||
/* Device management */
|
||||
struct wifi_device* wifi_device_connect(const char* ifname, const char* driver);
|
||||
const struct wifi_capability* wifi_device_getcapability(struct wifi_device* device);
|
||||
int wifi_device_setconfiguration(struct wifi_device* device, struct device_setconfiguration_params* params);
|
||||
int wifi_device_setfrequency(struct wifi_device* device, uint32_t band, uint32_t mode, uint8_t channel);
|
||||
int wifi_device_updaterates(struct wifi_device* device, uint8_t* rates, int ratescount);
|
||||
|
||||
/* WLAN management */
|
||||
struct wifi_wlan* wifi_wlan_create(struct wifi_device* device, const char* ifname);
|
||||
int wifi_wlan_startap(struct wifi_wlan* wlan, struct wlan_startap_params* params);
|
||||
void wifi_wlan_stopap(struct wifi_wlan* wlan);
|
||||
int wifi_wlan_getbssid(struct wifi_wlan* wlan, uint8_t* bssid);
|
||||
uint16_t wifi_wlan_check_capability(struct wifi_wlan* wlan, uint16_t capability);
|
||||
int wifi_wlan_send_frame(struct wifi_wlan* wlan, const uint8_t* data, int length, uint8_t rssi, uint8_t snr, uint16_t rate);
|
||||
void wifi_wlan_destroy(struct wifi_wlan* wlan);
|
||||
|
||||
/* WLAN packet management */
|
||||
void wifi_wlan_receive_station_frame(struct wifi_wlan* wlan, const struct ieee80211_header* frame, int length, uint32_t frequency, uint8_t rssi, uint8_t snr, uint16_t rate);
|
||||
void wifi_wlan_receive_station_ackframe(struct wifi_wlan* wlan, const struct ieee80211_header* frame, int length, int ack);
|
||||
void wifi_wlan_receive_ac_frame(struct wifi_wlan* wlan, struct ieee80211_header* frame, int length);
|
||||
|
||||
/* Station management */
|
||||
int wifi_station_authorize(struct wifi_wlan* wlan, struct station_add_params* params);
|
||||
void wifi_station_deauthorize(struct wifi_device* device, const uint8_t* address);
|
||||
|
||||
/* Util functions */
|
||||
uint32_t wifi_iface_index(const char* ifname);
|
||||
int wifi_iface_hwaddr(int sock, const char* ifname, uint8_t* hwaddr);
|
||||
|
||||
int wifi_frequency_to_radiotype(uint32_t freq);
|
||||
|
||||
/* */
|
||||
int wifi_iface_getstatus(int sock, const char* ifname);
|
||||
int wifi_iface_updown(int sock, const char* ifname, int up);
|
||||
#define wifi_iface_up(sock, ifname) wifi_iface_updown(sock, ifname, 1)
|
||||
#define wifi_iface_down(sock, ifname) wifi_iface_updown(sock, ifname, 0)
|
||||
|
||||
#endif /* __WIFI_DRIVERS_HEADER__ */
|
||||
#ifndef __WIFI_DRIVERS_HEADER__
|
||||
#define __WIFI_DRIVERS_HEADER__
|
||||
|
||||
#include <net/if_arp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include "ieee80211.h"
|
||||
|
||||
/* */
|
||||
#define WIFI_DRIVER_NAME_SIZE 16
|
||||
|
||||
/* */
|
||||
#define WIFI_BAND_UNKNOWN 0
|
||||
#define WIFI_BAND_2GHZ 1
|
||||
#define WIFI_BAND_5GHZ 2
|
||||
|
||||
/* */
|
||||
#define WIFI_CAPABILITY_RADIOSUPPORTED 0x00000001
|
||||
#define WIFI_CAPABILITY_RADIOTYPE 0x00000002
|
||||
#define WIFI_CAPABILITY_BANDS 0x00000004
|
||||
#define WIFI_CAPABILITY_CIPHERS 0x00000008
|
||||
#define WIFI_CAPABILITY_ANTENNA_MASK 0x00000010
|
||||
#define WIFI_CAPABILITY_MAX_SCAN_SSIDS 0x00000020
|
||||
#define WIFI_CAPABILITY_MAX_SCHED_SCAN_SSIDS 0x00000040
|
||||
#define WIFI_CAPABILITY_MAX_MATCH_SETS 0x00000080
|
||||
#define WIFI_CAPABILITY_MAX_ACL_MACADDRESS 0x00000100
|
||||
|
||||
/* */
|
||||
#define WIFI_CAPABILITY_FLAGS_OFFCHANNEL_TX_OK 0x00000001
|
||||
#define WIFI_CAPABILITY_FLAGS_ROAM_SUPPORT 0x00000002
|
||||
#define WIFI_CAPABILITY_FLAGS_SUPPORT_AP_UAPSD 0x00000004
|
||||
#define WIFI_CAPABILITY_FLAGS_DEVICE_AP_SME 0x00000008
|
||||
#define WIFI_CAPABILITY_FLAGS_PROBE_RESPONSE_OFFLOAD 0x00000010
|
||||
|
||||
/* */
|
||||
#define WIFI_CAPABILITY_AP_SUPPORTED 0x00000001
|
||||
#define WIFI_CAPABILITY_AP_VLAN_SUPPORTED 0x00000002
|
||||
#define WIFI_CAPABILITY_ADHOC_SUPPORTED 0x00000004
|
||||
#define WIFI_CAPABILITY_MONITOR_SUPPORTED 0x00000008
|
||||
#define WIFI_CAPABILITY_WDS_SUPPORTED 0x00000010
|
||||
|
||||
#define FREQ_CAPABILITY_DISABLED 0x00000001
|
||||
#define FREQ_CAPABILITY_PASSIVE_SCAN 0x00000002
|
||||
#define FREQ_CAPABILITY_NO_IBBS 0x00000004
|
||||
#define FREQ_CAPABILITY_RADAR 0x00000008
|
||||
#define FREQ_CAPABILITY_DFS_STATE 0x00000010
|
||||
#define FREQ_CAPABILITY_DFS_TIME 0x00000020
|
||||
|
||||
#define RATE_CAPABILITY_SHORTPREAMBLE 0x00000001
|
||||
|
||||
#define CIPHER_CAPABILITY_UNKNOWN 0
|
||||
#define CIPHER_CAPABILITY_WEP40 1
|
||||
#define CIPHER_CAPABILITY_WEP104 2
|
||||
#define CIPHER_CAPABILITY_TKIP 3
|
||||
#define CIPHER_CAPABILITY_CCMP 4
|
||||
#define CIPHER_CAPABILITY_CMAC 5
|
||||
#define CIPHER_CAPABILITY_GCMP 6
|
||||
#define CIPHER_CAPABILITY_WPI_SMS4 7
|
||||
|
||||
#define IEEE80211_DFS_USABLE 0
|
||||
#define IEEE80211_DFS_UNAVAILABLE 1
|
||||
#define IEEE80211_DFS_AVAILABLE 2
|
||||
|
||||
#define WLAN_INTERFACE_AP 1
|
||||
|
||||
/* */
|
||||
DECLARE_OPAQUE_TYPE(wifi_global_handle);
|
||||
DECLARE_OPAQUE_TYPE(wifi_device_handle);
|
||||
DECLARE_OPAQUE_TYPE(wifi_wlan_handle);
|
||||
|
||||
/* */
|
||||
struct device_setrates_params {
|
||||
int supportedratescount;
|
||||
uint8_t supportedrates[IEEE80211_SUPPORTEDRATE_MAX_COUNT];
|
||||
int basicratescount;
|
||||
uint8_t basicrates[IEEE80211_SUPPORTEDRATE_MAX_COUNT];
|
||||
};
|
||||
|
||||
/* */
|
||||
#define WIFI_COUNTRY_LENGTH 4
|
||||
struct device_setconfiguration_params {
|
||||
int shortpreamble;
|
||||
uint8_t maxbssid;
|
||||
uint8_t dtimperiod;
|
||||
uint8_t bssid[MACADDRESS_EUI48_LENGTH];
|
||||
uint16_t beaconperiod;
|
||||
uint8_t country[WIFI_COUNTRY_LENGTH];
|
||||
};
|
||||
|
||||
/* */
|
||||
typedef int (*send_frame_to_ac)(void* param, const uint8_t* frame, int length, uint8_t rssi, uint8_t snr, uint16_t rate);
|
||||
|
||||
struct wlan_startap_params {
|
||||
uint8_t radioid;
|
||||
uint8_t wlanid;
|
||||
|
||||
const char* ssid;
|
||||
uint8_t ssid_hidden;
|
||||
uint16_t capability;
|
||||
uint8_t qos;
|
||||
uint8_t authmode;
|
||||
uint8_t macmode;
|
||||
uint8_t tunnelmode;
|
||||
};
|
||||
|
||||
|
||||
/* */
|
||||
struct wlan_send_frame_params {
|
||||
uint8_t* packet;
|
||||
int length;
|
||||
|
||||
uint32_t frequency;
|
||||
uint32_t duration;
|
||||
int offchannel_tx_ok;
|
||||
int no_cck_rate;
|
||||
int no_wait_ack;
|
||||
|
||||
uint64_t cookie;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct station_add_params {
|
||||
uint8_t* address;
|
||||
};
|
||||
|
||||
/* Interface capability */
|
||||
struct wifi_freq_capability {
|
||||
unsigned long flags;
|
||||
|
||||
unsigned long frequency; /* MHz */
|
||||
unsigned long channel;
|
||||
|
||||
unsigned long maxtxpower; /* mBm = 100 * dBm */
|
||||
|
||||
unsigned long dfsstate;
|
||||
unsigned long dfstime; /* ms */
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_rate_capability {
|
||||
unsigned long flags;
|
||||
|
||||
uint8_t bitrate;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_band_capability {
|
||||
unsigned long band;
|
||||
|
||||
unsigned long htcapability;
|
||||
|
||||
struct capwap_array* freq;
|
||||
struct capwap_array* rate;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_cipher_capability {
|
||||
unsigned long cipher;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_capability {
|
||||
struct wifi_device* device;
|
||||
|
||||
unsigned long flags;
|
||||
unsigned long capability;
|
||||
|
||||
/* WIFI_CAPABILITY_RADIOSUPPORTED */
|
||||
unsigned long radiosupported;
|
||||
|
||||
/* WIFI_CAPABILITY_RADIOTYPE */
|
||||
unsigned long radiotype;
|
||||
|
||||
/* WIFI_CAPABILITY_ANTENNA_MASK */
|
||||
unsigned long txantennamask;
|
||||
unsigned long rxantennamask;
|
||||
|
||||
/* WIFI_CAPABILITY_BANDS */
|
||||
struct capwap_array* bands;
|
||||
|
||||
/* WIFI_CAPABILITY_CIPHERS */
|
||||
struct capwap_array* ciphers;
|
||||
|
||||
/* WIFI_CAPABILITY_MAX_SCAN_SSIDS */
|
||||
uint8_t maxscanssids;
|
||||
|
||||
/* WIFI_CAPABILITY_MAX_SCHED_SCAN_SSIDS */
|
||||
uint8_t maxschedscanssids;
|
||||
|
||||
/* WIFI_CAPABILITY_MAX_MATCH_SETS */
|
||||
uint8_t maxmatchsets;
|
||||
|
||||
/* WIFI_CAPABILITY_MAX_ACL_MACADDRESS */
|
||||
uint8_t maxaclmacaddress;
|
||||
};
|
||||
|
||||
/* Frequency configuration */
|
||||
struct wifi_frequency {
|
||||
uint32_t band;
|
||||
uint32_t mode;
|
||||
uint8_t channel;
|
||||
uint32_t frequency;
|
||||
};
|
||||
|
||||
/* */
|
||||
#define WIFI_EVENT_MAX_ITEMS 2
|
||||
struct wifi_event {
|
||||
void (*event_handler)(int fd, void** params, int paramscount);
|
||||
int paramscount;
|
||||
void* params[WIFI_EVENT_MAX_ITEMS];
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_driver_instance {
|
||||
struct wifi_driver_ops* ops; /* Driver functions */
|
||||
wifi_global_handle handle; /* Global instance handle */
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_global {
|
||||
int sock_util;
|
||||
struct capwap_list* devices;
|
||||
|
||||
/* Timeout */
|
||||
struct capwap_timeout* timeout;
|
||||
|
||||
/* Stations */
|
||||
struct capwap_hash* stations;
|
||||
};
|
||||
|
||||
/* Device handle */
|
||||
#define WIFI_DEVICE_SET_FREQUENCY 0x00000001
|
||||
#define WIFI_DEVICE_SET_RATES 0x00000002
|
||||
#define WIFI_DEVICE_SET_CONFIGURATION 0x00000004
|
||||
#define WIFI_DEVICE_REQUIRED_FOR_BSS (WIFI_DEVICE_SET_FREQUENCY | WIFI_DEVICE_SET_RATES | WIFI_DEVICE_SET_CONFIGURATION)
|
||||
|
||||
struct wifi_device {
|
||||
struct wifi_global* global;
|
||||
|
||||
wifi_device_handle handle; /* Device handle */
|
||||
struct wifi_driver_instance* instance; /* Driver instance */
|
||||
|
||||
uint32_t phyindex;
|
||||
char phyname[IFNAMSIZ];
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
/* */
|
||||
struct capwap_list* wlans;
|
||||
unsigned long wlanactive;
|
||||
|
||||
/* Current frequency */
|
||||
struct wifi_frequency currentfrequency;
|
||||
|
||||
/* */
|
||||
uint16_t beaconperiod;
|
||||
uint8_t dtimperiod;
|
||||
int shortpreamble;
|
||||
|
||||
/* Cached capability */
|
||||
struct wifi_capability* capability;
|
||||
|
||||
/* Rates */
|
||||
unsigned long supportedratescount;
|
||||
uint8_t supportedrates[IEEE80211_SUPPORTEDRATE_MAX_COUNT];
|
||||
unsigned long basicratescount;
|
||||
uint8_t basicrates[IEEE80211_SUPPORTEDRATE_MAX_COUNT];
|
||||
|
||||
/* ERP Information */
|
||||
int olbc;
|
||||
unsigned long stationsnonerpcount;
|
||||
unsigned long stationsnoshortslottimecount;
|
||||
unsigned long stationsnoshortpreamblecount;
|
||||
};
|
||||
|
||||
/* WLAN handle */
|
||||
#define WIFI_WLAN_RUNNING 0x00000001
|
||||
#define WIFI_WLAN_SET_BEACON 0x00000002
|
||||
#define WIFI_WLAN_OPERSTATE_RUNNING 0x00000004
|
||||
|
||||
struct wifi_wlan {
|
||||
wifi_wlan_handle handle;
|
||||
struct wifi_device* device;
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
uint32_t virtindex;
|
||||
char virtname[IFNAMSIZ];
|
||||
|
||||
uint8_t address[MACADDRESS_EUI48_LENGTH];
|
||||
|
||||
/* */
|
||||
uint8_t radioid;
|
||||
uint8_t wlanid;
|
||||
|
||||
/* WLAN information */
|
||||
char ssid[IEEE80211_SSID_MAX_LENGTH + 1];
|
||||
uint8_t ssid_hidden;
|
||||
uint16_t capability;
|
||||
|
||||
/* Tunnel */
|
||||
uint8_t macmode;
|
||||
uint8_t tunnelmode;
|
||||
|
||||
/* Authentication */
|
||||
uint8_t authmode;
|
||||
|
||||
/* Station information */
|
||||
unsigned long stationscount;
|
||||
unsigned long maxstationscount;
|
||||
|
||||
uint32_t aidbitfield[IEEE80211_AID_BITFIELD_SIZE];
|
||||
};
|
||||
|
||||
/* Station handle */
|
||||
#define WIFI_STATION_FLAGS_AUTHENTICATED 0x00000001
|
||||
#define WIFI_STATION_FLAGS_ASSOCIATE 0x00000002
|
||||
#define WIFI_STATION_FLAGS_NON_ERP 0x00000004
|
||||
#define WIFI_STATION_FLAGS_NO_SHORT_SLOT_TIME 0x00000008
|
||||
#define WIFI_STATION_FLAGS_NO_SHORT_PREAMBLE 0x00000010
|
||||
#define WIFI_STATION_FLAGS_WMM 0x00000020
|
||||
#define WIFI_STATION_FLAGS_AUTHORIZED 0x00000040
|
||||
|
||||
/* */
|
||||
#define WIFI_STATION_TIMEOUT_ASSOCIATION_COMPLETE 30000
|
||||
#define WIFI_STATION_TIMEOUT_AFTER_DEAUTHENTICATED 5000
|
||||
|
||||
/* */
|
||||
#define WIFI_STATION_TIMEOUT_ACTION_DELETE 0x00000001
|
||||
#define WIFI_STATION_TIMEOUT_ACTION_DEAUTHENTICATE 0x00000002
|
||||
|
||||
struct wifi_station {
|
||||
uint8_t address[MACADDRESS_EUI48_LENGTH];
|
||||
char addrtext[CAPWAP_MACADDRESS_EUI48_BUFFER];
|
||||
|
||||
/* */
|
||||
struct wifi_wlan* wlan;
|
||||
|
||||
/* */
|
||||
unsigned long flags;
|
||||
|
||||
/* Timers */
|
||||
int timeoutaction;
|
||||
unsigned long idtimeout;
|
||||
|
||||
/* */
|
||||
uint16_t capability;
|
||||
uint16_t listeninterval;
|
||||
uint16_t aid;
|
||||
|
||||
/* */
|
||||
int supportedratescount;
|
||||
uint8_t supportedrates[IEEE80211_SUPPORTEDRATE_MAX_COUNT];
|
||||
|
||||
/* Authentication */
|
||||
uint16_t authalgorithm;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wifi_driver_ops {
|
||||
const char* name; /* Name of wifi driver */
|
||||
const char* description; /* Description of wifi driver */
|
||||
|
||||
/* Global initialize driver */
|
||||
wifi_global_handle (*global_init)(void);
|
||||
int (*global_getfdevent)(wifi_global_handle handle, struct pollfd* fds, struct wifi_event* events);
|
||||
void (*global_deinit)(wifi_global_handle handle);
|
||||
|
||||
/* Device functions */
|
||||
int (*device_init)(wifi_global_handle handle, struct wifi_device* device);
|
||||
int (*device_getfdevent)(struct wifi_device* device, struct pollfd* fds, struct wifi_event* events);
|
||||
int (*device_getcapability)(struct wifi_device* device, struct wifi_capability* capability);
|
||||
void (*device_updatebeacons)(struct wifi_device* device);
|
||||
int (*device_setfrequency)(struct wifi_device* device);
|
||||
void (*device_deinit)(struct wifi_device* device);
|
||||
|
||||
/* WLAN functions */
|
||||
wifi_wlan_handle (*wlan_create)(struct wifi_device* device, struct wifi_wlan* wlan);
|
||||
int (*wlan_getfdevent)(struct wifi_wlan* wlan, struct pollfd* fds, struct wifi_event* events);
|
||||
int (*wlan_startap)(struct wifi_wlan* wlan);
|
||||
void (*wlan_stopap)(struct wifi_wlan* wlan);
|
||||
int (*wlan_sendframe)(struct wifi_wlan* wlan, uint8_t* frame, int length, uint32_t frequency, uint32_t duration, int offchannel_tx_ok, int no_cck_rate, int no_wait_ack);
|
||||
void (*wlan_delete)(struct wifi_wlan* wlan);
|
||||
|
||||
/* Stations functions */
|
||||
int (*station_authorize)(struct wifi_wlan* wlan, struct wifi_station* station);
|
||||
int (*station_deauthorize)(struct wifi_wlan* wlan, const uint8_t* address);
|
||||
};
|
||||
|
||||
/* Initialize wifi driver engine */
|
||||
int wifi_driver_init(struct capwap_timeout* timeout);
|
||||
void wifi_driver_free(void);
|
||||
|
||||
/* Get File Descriptor Event */
|
||||
int wifi_event_getfd(struct pollfd* fds, struct wifi_event* events, int count);
|
||||
|
||||
/* */
|
||||
struct wifi_wlan* wifi_get_wlan(uint32_t ifindex);
|
||||
|
||||
/* Device management */
|
||||
struct wifi_device* wifi_device_connect(const char* ifname, const char* driver);
|
||||
const struct wifi_capability* wifi_device_getcapability(struct wifi_device* device);
|
||||
int wifi_device_setconfiguration(struct wifi_device* device, struct device_setconfiguration_params* params);
|
||||
int wifi_device_setfrequency(struct wifi_device* device, uint32_t band, uint32_t mode, uint8_t channel);
|
||||
int wifi_device_updaterates(struct wifi_device* device, uint8_t* rates, int ratescount);
|
||||
|
||||
/* WLAN management */
|
||||
struct wifi_wlan* wifi_wlan_create(struct wifi_device* device, const char* ifname);
|
||||
int wifi_wlan_startap(struct wifi_wlan* wlan, struct wlan_startap_params* params);
|
||||
void wifi_wlan_stopap(struct wifi_wlan* wlan);
|
||||
int wifi_wlan_getbssid(struct wifi_wlan* wlan, uint8_t* bssid);
|
||||
uint16_t wifi_wlan_check_capability(struct wifi_wlan* wlan, uint16_t capability);
|
||||
int wifi_wlan_send_frame(struct wifi_wlan* wlan, const uint8_t* data, int length, uint8_t rssi, uint8_t snr, uint16_t rate);
|
||||
void wifi_wlan_destroy(struct wifi_wlan* wlan);
|
||||
|
||||
/* WLAN packet management */
|
||||
void wifi_wlan_receive_station_frame(struct wifi_wlan* wlan, const struct ieee80211_header* frame, int length, uint32_t frequency, uint8_t rssi, uint8_t snr, uint16_t rate);
|
||||
void wifi_wlan_receive_station_ackframe(struct wifi_wlan* wlan, const struct ieee80211_header* frame, int length, int ack);
|
||||
void wifi_wlan_receive_ac_frame(struct wifi_wlan* wlan, struct ieee80211_header* frame, int length);
|
||||
|
||||
/* Station management */
|
||||
int wifi_station_authorize(struct wifi_wlan* wlan, struct station_add_params* params);
|
||||
void wifi_station_deauthorize(struct wifi_device* device, const uint8_t* address);
|
||||
|
||||
/* Util functions */
|
||||
uint32_t wifi_iface_index(const char* ifname);
|
||||
int wifi_iface_hwaddr(int sock, const char* ifname, uint8_t* hwaddr);
|
||||
|
||||
int wifi_frequency_to_radiotype(uint32_t freq);
|
||||
|
||||
/* */
|
||||
int wifi_iface_getstatus(int sock, const char* ifname);
|
||||
int wifi_iface_updown(int sock, const char* ifname, int up);
|
||||
#define wifi_iface_up(sock, ifname) wifi_iface_updown(sock, ifname, 1)
|
||||
#define wifi_iface_down(sock, ifname) wifi_iface_updown(sock, ifname, 0)
|
||||
|
||||
#endif /* __WIFI_DRIVERS_HEADER__ */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,45 +1,45 @@
|
||||
#ifndef __WIFI_NL80211_HEADER__
|
||||
#define __WIFI_NL80211_HEADER__
|
||||
|
||||
#include "capwap_hash.h"
|
||||
#include "netlink_link.h"
|
||||
|
||||
/* Compatibility functions */
|
||||
#ifdef HAVE_LIBNL_10
|
||||
#define nl_sock nl_handle
|
||||
#endif
|
||||
|
||||
/* */
|
||||
typedef int (*nl_valid_cb)(struct nl_msg* msg, void* data);
|
||||
|
||||
/* Global handle */
|
||||
struct nl80211_global_handle {
|
||||
struct nl_sock* nl;
|
||||
struct nl_cb* nl_cb;
|
||||
int nl80211_id;
|
||||
|
||||
struct nl_sock* nl_event;
|
||||
int nl_event_fd;
|
||||
|
||||
struct netlink* netlinkhandle;
|
||||
|
||||
int sock_util;
|
||||
};
|
||||
|
||||
/* Device handle */
|
||||
struct nl80211_device_handle {
|
||||
struct nl80211_global_handle* globalhandle;
|
||||
};
|
||||
|
||||
/* WLAN handle */
|
||||
struct nl80211_wlan_handle {
|
||||
struct nl80211_device_handle* devicehandle;
|
||||
|
||||
struct nl_sock* nl;
|
||||
int nl_fd;
|
||||
struct nl_cb* nl_cb;
|
||||
|
||||
uint64_t last_cookie;
|
||||
};
|
||||
|
||||
#endif /* __WIFI_NL80211_HEADER__ */
|
||||
#ifndef __WIFI_NL80211_HEADER__
|
||||
#define __WIFI_NL80211_HEADER__
|
||||
|
||||
#include "capwap_hash.h"
|
||||
#include "netlink_link.h"
|
||||
|
||||
/* Compatibility functions */
|
||||
#ifdef HAVE_LIBNL_10
|
||||
#define nl_sock nl_handle
|
||||
#endif
|
||||
|
||||
/* */
|
||||
typedef int (*nl_valid_cb)(struct nl_msg* msg, void* data);
|
||||
|
||||
/* Global handle */
|
||||
struct nl80211_global_handle {
|
||||
struct nl_sock* nl;
|
||||
struct nl_cb* nl_cb;
|
||||
int nl80211_id;
|
||||
|
||||
struct nl_sock* nl_event;
|
||||
int nl_event_fd;
|
||||
|
||||
struct netlink* netlinkhandle;
|
||||
|
||||
int sock_util;
|
||||
};
|
||||
|
||||
/* Device handle */
|
||||
struct nl80211_device_handle {
|
||||
struct nl80211_global_handle* globalhandle;
|
||||
};
|
||||
|
||||
/* WLAN handle */
|
||||
struct nl80211_wlan_handle {
|
||||
struct nl80211_device_handle* devicehandle;
|
||||
|
||||
struct nl_sock* nl;
|
||||
int nl_fd;
|
||||
struct nl_cb* nl_cb;
|
||||
|
||||
uint64_t last_cookie;
|
||||
};
|
||||
|
||||
#endif /* __WIFI_NL80211_HEADER__ */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,124 +1,124 @@
|
||||
#ifndef __KMOD_CAPWAP_HEADER__
|
||||
#define __KMOD_CAPWAP_HEADER__
|
||||
|
||||
#include "capwap_rfc.h"
|
||||
#include "socket.h"
|
||||
|
||||
/* */
|
||||
#define MAX_MTU 9000
|
||||
#define DEFAULT_MTU 1450
|
||||
#define MIN_MTU 500
|
||||
#define IEEE80211_MTU 7981
|
||||
|
||||
/* */
|
||||
#define CAPWAP_FRAGMENT_QUEUE 16
|
||||
|
||||
/* */
|
||||
#define CAPWAP_FRAGMENT_ENABLE 0x0001
|
||||
#define CAPWAP_FRAGMENT_LRUQUEUE 0x0002
|
||||
#define CAPWAP_FRAGMENT_LAST 0x0004
|
||||
|
||||
/* */
|
||||
#define SKB_CAPWAP_FLAG_FROM_DATA_CHANNEL 0x0001
|
||||
#define SKB_CAPWAP_FLAG_FROM_USER_SPACE 0x0002
|
||||
#define SKB_CAPWAP_FLAG_FROM_AC_TAP 0x0004
|
||||
#define SKB_CAPWAP_FLAG_FROM_IEEE80211 0x0008
|
||||
|
||||
#define SKB_CAPWAP_FLAG_SESSIONID 0x0100
|
||||
#define SKB_CAPWAP_FLAG_RADIOID 0x0200
|
||||
#define SKB_CAPWAP_FLAG_BINDING 0x0400
|
||||
#define SKB_CAPWAP_FLAG_WIRELESSINFORMATION 0x0800
|
||||
#define SKB_CAPWAP_FLAG_FRAGMENT 0x1000
|
||||
|
||||
struct sc_skb_capwap_cb {
|
||||
uint16_t flags;
|
||||
|
||||
/* Session ID */
|
||||
struct sc_capwap_sessionid_element sessionid;
|
||||
|
||||
/* Capwap information */
|
||||
uint8_t radioid;
|
||||
uint8_t binding;
|
||||
|
||||
/* Wireless Information */
|
||||
uint8_t winfo_rssi;
|
||||
uint8_t winfo_snr;
|
||||
uint16_t winfo_rate;
|
||||
|
||||
/* Fragment */
|
||||
uint16_t frag_offset;
|
||||
uint16_t frag_length;
|
||||
};
|
||||
|
||||
#define CAPWAP_SKB_CB(skb) ((struct sc_skb_capwap_cb*)((skb)->cb))
|
||||
|
||||
/* */
|
||||
struct sc_capwap_fragment {
|
||||
struct list_head lru_list;
|
||||
|
||||
uint8_t flags;
|
||||
ktime_t tstamp;
|
||||
|
||||
uint16_t fragmentid;
|
||||
|
||||
struct sk_buff* fragments;
|
||||
struct sk_buff* lastfragment;
|
||||
int recvlength;
|
||||
int totallength;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct sc_capwap_fragment_queue {
|
||||
spinlock_t lock;
|
||||
|
||||
struct list_head lru_list;
|
||||
struct sc_capwap_fragment queues[CAPWAP_FRAGMENT_QUEUE];
|
||||
};
|
||||
|
||||
/* */
|
||||
struct sc_capwap_session {
|
||||
uint16_t mtu;
|
||||
union capwap_addr peeraddr;
|
||||
struct sc_capwap_sessionid_element sessionid;
|
||||
|
||||
uint16_t fragmentid;
|
||||
spinlock_t fragmentid_lock;
|
||||
|
||||
struct sc_capwap_fragment_queue fragments;
|
||||
};
|
||||
|
||||
/* */
|
||||
extern union capwap_addr sc_localaddr;
|
||||
|
||||
/* Dipendent implementation function */
|
||||
void sc_capwap_recvpacket(struct sk_buff* skb);
|
||||
struct sc_capwap_session* sc_capwap_recvunknownkeepalive(const union capwap_addr* sockaddr, const struct sc_capwap_sessionid_element* sessionid);
|
||||
|
||||
void sc_capwap_parsingdatapacket(struct sc_capwap_session* session, struct sk_buff* skb);
|
||||
void sc_capwap_parsingmgmtpacket(struct sc_capwap_session* session, struct sk_buff* skb);
|
||||
|
||||
/* Indipendent implementation function */
|
||||
int sc_capwap_bind(union capwap_addr* sockaddr);
|
||||
|
||||
void sc_capwap_initsession(struct sc_capwap_session* session);
|
||||
void sc_capwap_freesession(struct sc_capwap_session* session);
|
||||
uint16_t sc_capwap_newfragmentid(struct sc_capwap_session* session);
|
||||
|
||||
int sc_capwap_8023_to_80211(struct sk_buff* skb, const uint8_t* bssid);
|
||||
int sc_capwap_80211_to_8023(struct sk_buff* skb);
|
||||
|
||||
void sc_capwap_sessionid_printf(const struct sc_capwap_sessionid_element* sessionid, char* string);
|
||||
|
||||
int sc_capwap_createkeepalive(struct sc_capwap_sessionid_element* sessionid, uint8_t* buffer, int size);
|
||||
int sc_capwap_parsingpacket(struct sc_capwap_session* session, const union capwap_addr* sockaddr, struct sk_buff* skb);
|
||||
|
||||
struct sc_capwap_radio_addr* sc_capwap_setradiomacaddress(uint8_t* buffer, int size, uint8_t* bssid);
|
||||
struct sc_capwap_wireless_information* sc_capwap_setwinfo_frameinfo(uint8_t* buffer, int size, uint8_t rssi, uint8_t snr, uint16_t rate);
|
||||
struct sc_capwap_wireless_information* sc_capwap_setwinfo_destwlans(uint8_t* buffer, int size, uint16_t wlanidbitmap);
|
||||
|
||||
int sc_capwap_forwarddata(struct sc_capwap_session* session, uint8_t radioid, uint8_t binding, struct sk_buff* skb, uint32_t flags, struct sc_capwap_radio_addr* radioaddr, int radioaddrlength, struct sc_capwap_wireless_information* winfo, int winfolength);
|
||||
|
||||
/* Private funciotn */
|
||||
#include "capwap_private.h"
|
||||
|
||||
#endif /* __KMOD_CAPWAP_HEADER__ */
|
||||
#ifndef __KMOD_CAPWAP_HEADER__
|
||||
#define __KMOD_CAPWAP_HEADER__
|
||||
|
||||
#include "capwap_rfc.h"
|
||||
#include "socket.h"
|
||||
|
||||
/* */
|
||||
#define MAX_MTU 9000
|
||||
#define DEFAULT_MTU 1450
|
||||
#define MIN_MTU 500
|
||||
#define IEEE80211_MTU 7981
|
||||
|
||||
/* */
|
||||
#define CAPWAP_FRAGMENT_QUEUE 16
|
||||
|
||||
/* */
|
||||
#define CAPWAP_FRAGMENT_ENABLE 0x0001
|
||||
#define CAPWAP_FRAGMENT_LRUQUEUE 0x0002
|
||||
#define CAPWAP_FRAGMENT_LAST 0x0004
|
||||
|
||||
/* */
|
||||
#define SKB_CAPWAP_FLAG_FROM_DATA_CHANNEL 0x0001
|
||||
#define SKB_CAPWAP_FLAG_FROM_USER_SPACE 0x0002
|
||||
#define SKB_CAPWAP_FLAG_FROM_AC_TAP 0x0004
|
||||
#define SKB_CAPWAP_FLAG_FROM_IEEE80211 0x0008
|
||||
|
||||
#define SKB_CAPWAP_FLAG_SESSIONID 0x0100
|
||||
#define SKB_CAPWAP_FLAG_RADIOID 0x0200
|
||||
#define SKB_CAPWAP_FLAG_BINDING 0x0400
|
||||
#define SKB_CAPWAP_FLAG_WIRELESSINFORMATION 0x0800
|
||||
#define SKB_CAPWAP_FLAG_FRAGMENT 0x1000
|
||||
|
||||
struct sc_skb_capwap_cb {
|
||||
uint16_t flags;
|
||||
|
||||
/* Session ID */
|
||||
struct sc_capwap_sessionid_element sessionid;
|
||||
|
||||
/* Capwap information */
|
||||
uint8_t radioid;
|
||||
uint8_t binding;
|
||||
|
||||
/* Wireless Information */
|
||||
uint8_t winfo_rssi;
|
||||
uint8_t winfo_snr;
|
||||
uint16_t winfo_rate;
|
||||
|
||||
/* Fragment */
|
||||
uint16_t frag_offset;
|
||||
uint16_t frag_length;
|
||||
};
|
||||
|
||||
#define CAPWAP_SKB_CB(skb) ((struct sc_skb_capwap_cb*)((skb)->cb))
|
||||
|
||||
/* */
|
||||
struct sc_capwap_fragment {
|
||||
struct list_head lru_list;
|
||||
|
||||
uint8_t flags;
|
||||
ktime_t tstamp;
|
||||
|
||||
uint16_t fragmentid;
|
||||
|
||||
struct sk_buff* fragments;
|
||||
struct sk_buff* lastfragment;
|
||||
int recvlength;
|
||||
int totallength;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct sc_capwap_fragment_queue {
|
||||
spinlock_t lock;
|
||||
|
||||
struct list_head lru_list;
|
||||
struct sc_capwap_fragment queues[CAPWAP_FRAGMENT_QUEUE];
|
||||
};
|
||||
|
||||
/* */
|
||||
struct sc_capwap_session {
|
||||
uint16_t mtu;
|
||||
union capwap_addr peeraddr;
|
||||
struct sc_capwap_sessionid_element sessionid;
|
||||
|
||||
uint16_t fragmentid;
|
||||
spinlock_t fragmentid_lock;
|
||||
|
||||
struct sc_capwap_fragment_queue fragments;
|
||||
};
|
||||
|
||||
/* */
|
||||
extern union capwap_addr sc_localaddr;
|
||||
|
||||
/* Dipendent implementation function */
|
||||
void sc_capwap_recvpacket(struct sk_buff* skb);
|
||||
struct sc_capwap_session* sc_capwap_recvunknownkeepalive(const union capwap_addr* sockaddr, const struct sc_capwap_sessionid_element* sessionid);
|
||||
|
||||
void sc_capwap_parsingdatapacket(struct sc_capwap_session* session, struct sk_buff* skb);
|
||||
void sc_capwap_parsingmgmtpacket(struct sc_capwap_session* session, struct sk_buff* skb);
|
||||
|
||||
/* Indipendent implementation function */
|
||||
int sc_capwap_bind(union capwap_addr* sockaddr);
|
||||
|
||||
void sc_capwap_initsession(struct sc_capwap_session* session);
|
||||
void sc_capwap_freesession(struct sc_capwap_session* session);
|
||||
uint16_t sc_capwap_newfragmentid(struct sc_capwap_session* session);
|
||||
|
||||
int sc_capwap_8023_to_80211(struct sk_buff* skb, const uint8_t* bssid);
|
||||
int sc_capwap_80211_to_8023(struct sk_buff* skb);
|
||||
|
||||
void sc_capwap_sessionid_printf(const struct sc_capwap_sessionid_element* sessionid, char* string);
|
||||
|
||||
int sc_capwap_createkeepalive(struct sc_capwap_sessionid_element* sessionid, uint8_t* buffer, int size);
|
||||
int sc_capwap_parsingpacket(struct sc_capwap_session* session, const union capwap_addr* sockaddr, struct sk_buff* skb);
|
||||
|
||||
struct sc_capwap_radio_addr* sc_capwap_setradiomacaddress(uint8_t* buffer, int size, uint8_t* bssid);
|
||||
struct sc_capwap_wireless_information* sc_capwap_setwinfo_frameinfo(uint8_t* buffer, int size, uint8_t rssi, uint8_t snr, uint16_t rate);
|
||||
struct sc_capwap_wireless_information* sc_capwap_setwinfo_destwlans(uint8_t* buffer, int size, uint16_t wlanidbitmap);
|
||||
|
||||
int sc_capwap_forwarddata(struct sc_capwap_session* session, uint8_t radioid, uint8_t binding, struct sk_buff* skb, uint32_t flags, struct sc_capwap_radio_addr* radioaddr, int radioaddrlength, struct sc_capwap_wireless_information* winfo, int winfolength);
|
||||
|
||||
/* Private funciotn */
|
||||
#include "capwap_private.h"
|
||||
|
||||
#endif /* __KMOD_CAPWAP_HEADER__ */
|
||||
|
@ -1,275 +1,275 @@
|
||||
#include "config.h"
|
||||
#include <linux/module.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/ieee80211.h>
|
||||
#include <net/mac80211.h>
|
||||
#include <net/ipv6.h>
|
||||
#include "capwap.h"
|
||||
#include "nlsmartcapwap.h"
|
||||
#include "netlinkapp.h"
|
||||
|
||||
/* */
|
||||
static struct sc_capwap_session sc_acsession;
|
||||
|
||||
/* */
|
||||
int sc_capwap_init(void) {
|
||||
TRACEKMOD("### sc_capwap_init\n");
|
||||
|
||||
/* Init session */
|
||||
memset(&sc_acsession, 0, sizeof(struct sc_capwap_session));
|
||||
sc_capwap_initsession(&sc_acsession);
|
||||
|
||||
/* Init sockect */
|
||||
memset(&sc_localaddr, 0, sizeof(union capwap_addr));
|
||||
return sc_socket_init();
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_capwap_close(void) {
|
||||
TRACEKMOD("### sc_capwap_close\n");
|
||||
|
||||
/* */
|
||||
sc_socket_close();
|
||||
memset(&sc_localaddr, 0, sizeof(union capwap_addr));
|
||||
sc_capwap_freesession(&sc_acsession);
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_capwap_connect(const union capwap_addr* sockaddr, struct sc_capwap_sessionid_element* sessionid, uint16_t mtu) {
|
||||
TRACEKMOD("### sc_capwap_connect\n");
|
||||
|
||||
if ((sc_localaddr.ss.ss_family != AF_INET) && (sc_localaddr.ss.ss_family != AF_INET6)) {
|
||||
return -ENONET;
|
||||
}
|
||||
|
||||
/* AC address */
|
||||
if ((sockaddr->ss.ss_family == AF_INET6) && ipv6_addr_v4mapped(&sockaddr->sin6.sin6_addr)) {
|
||||
return -EINVAL;
|
||||
} else if ((sc_localaddr.ss.ss_family == AF_INET) && (sockaddr->ss.ss_family == AF_INET6)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* */
|
||||
memcpy(&sc_acsession.peeraddr, sockaddr, sizeof(union capwap_addr));
|
||||
memcpy(&sc_acsession.sessionid, sessionid, sizeof(struct sc_capwap_sessionid_element));
|
||||
sc_acsession.mtu = mtu;
|
||||
|
||||
return sc_capwap_sendkeepalive();
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_capwap_resetsession(void) {
|
||||
TRACEKMOD("### sc_capwap_resetsession\n");
|
||||
|
||||
/* */
|
||||
sc_capwap_freesession(&sc_acsession);
|
||||
|
||||
/* Reinit session */
|
||||
memset(&sc_acsession, 0, sizeof(struct sc_capwap_session));
|
||||
sc_capwap_initsession(&sc_acsession);
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_capwap_sendkeepalive(void) {
|
||||
int ret;
|
||||
int length;
|
||||
uint8_t buffer[CAPWAP_KEEP_ALIVE_MAX_SIZE];
|
||||
|
||||
TRACEKMOD("### sc_capwap_sendkeepalive\n");
|
||||
|
||||
/* Build keepalive */
|
||||
length = sc_capwap_createkeepalive(&sc_acsession.sessionid, buffer, CAPWAP_KEEP_ALIVE_MAX_SIZE);
|
||||
|
||||
/* Send packet */
|
||||
ret = sc_socket_send(SOCKET_UDP, buffer, length, &sc_acsession.peeraddr);
|
||||
TRACEKMOD("*** Send keep-alive result: %d\n", ret);
|
||||
if (ret > 0) {
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* */
|
||||
struct sc_capwap_session* sc_capwap_getsession(const union capwap_addr* sockaddr) {
|
||||
TRACEKMOD("### sc_capwap_getsession\n");
|
||||
|
||||
if (!sockaddr) {
|
||||
return &sc_acsession;
|
||||
} else if (sc_acsession.peeraddr.ss.ss_family == sockaddr->ss.ss_family) {
|
||||
if (sc_acsession.peeraddr.ss.ss_family == AF_INET) {
|
||||
if ((sc_acsession.peeraddr.sin.sin_port == sockaddr->sin.sin_port) && (sc_acsession.peeraddr.sin.sin_addr.s_addr == sockaddr->sin.sin_addr.s_addr)) {
|
||||
return &sc_acsession;
|
||||
}
|
||||
} else if (sc_acsession.peeraddr.ss.ss_family == AF_INET6) {
|
||||
if ((sc_acsession.peeraddr.sin6.sin6_port == sockaddr->sin6.sin6_port) && !ipv6_addr_cmp(&sc_acsession.peeraddr.sin6.sin6_addr, &sockaddr->sin6.sin6_addr)) {
|
||||
return &sc_acsession;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_capwap_recvpacket(struct sk_buff* skb) {
|
||||
union capwap_addr peeraddr;
|
||||
struct sc_capwap_session* session;
|
||||
|
||||
TRACEKMOD("### sc_capwap_recvpacket\n");
|
||||
|
||||
/* Get peer address */
|
||||
if (sc_socket_getpeeraddr(skb, &peeraddr)) {
|
||||
goto drop;
|
||||
}
|
||||
|
||||
/* Get session */
|
||||
session = sc_capwap_getsession(&peeraddr);
|
||||
if (!session) {
|
||||
TRACEKMOD("*** Session not found\n");
|
||||
goto drop;
|
||||
}
|
||||
|
||||
/* Remove UDP header */
|
||||
if (!skb_pull(skb, sizeof(struct udphdr))) {
|
||||
TRACEKMOD("*** Invalid packet\n");
|
||||
goto drop;
|
||||
}
|
||||
|
||||
/* Parsing packet */
|
||||
if (sc_capwap_parsingpacket(session, &peeraddr, skb)) {
|
||||
TRACEKMOD("*** Parsing error\n");
|
||||
goto drop;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
drop:
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
/* */
|
||||
struct sc_capwap_session* sc_capwap_recvunknownkeepalive(const union capwap_addr* sockaddr, const struct sc_capwap_sessionid_element* sessionid) {
|
||||
TRACEKMOD("### sc_capwap_recvunknownkeepalive\n");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_capwap_parsingdatapacket(struct sc_capwap_session* session, struct sk_buff* skb) {
|
||||
uint8_t* pos;
|
||||
uint8_t* dstaddress;
|
||||
struct net_device* dev;
|
||||
struct sc_capwap_header* header = (struct sc_capwap_header*)skb->data;
|
||||
int is80211 = (IS_FLAG_T_HEADER(header) ? 1 : 0);
|
||||
struct sc_capwap_radio_addr* radioaddr = NULL;
|
||||
int radioaddrsize = 0;
|
||||
struct sc_capwap_wireless_information* winfo = NULL;
|
||||
struct sc_capwap_destination_wlans* destwlan = NULL;
|
||||
int winfosize = 0;
|
||||
|
||||
TRACEKMOD("### sc_capwap_parsingdatapacket\n");
|
||||
|
||||
/* Retrieve optional attribute */
|
||||
pos = skb->data + sizeof(struct sc_capwap_header);
|
||||
if (IS_FLAG_M_HEADER(header)) {
|
||||
radioaddr = (struct sc_capwap_radio_addr*)pos;
|
||||
radioaddrsize = (sizeof(struct sc_capwap_radio_addr) + radioaddr->length + 3) & ~3;
|
||||
pos += radioaddrsize;
|
||||
}
|
||||
|
||||
if (IS_FLAG_W_HEADER(header)) {
|
||||
winfo = (struct sc_capwap_wireless_information*)pos;
|
||||
destwlan = (struct sc_capwap_destination_wlans*)(pos + sizeof(struct sc_capwap_wireless_information));
|
||||
winfosize = (sizeof(struct sc_capwap_wireless_information) + winfo->length + 3) & ~3;
|
||||
pos += winfosize;
|
||||
}
|
||||
|
||||
/* Body packet */
|
||||
skb_pull(skb, GET_HLEN_HEADER(header) * 4);
|
||||
|
||||
dstaddress = (is80211 ? ieee80211_get_DA((struct ieee80211_hdr*)skb->data) : (uint8_t*)((struct ethhdr*)skb->data)->h_dest);
|
||||
if (is_multicast_ether_addr(dstaddress)) {
|
||||
/* Accept only broadcast packet with wireless information */
|
||||
if (winfo) {
|
||||
uint8_t wlanid = 1;
|
||||
uint16_t bitmask = be16_to_cpu(destwlan->wlanidbitmap);
|
||||
while (bitmask) {
|
||||
if (bitmask & 0x01) {
|
||||
dev = sc_netlink_getdev_from_wlanid(GET_RID_HEADER(header), wlanid);
|
||||
if (dev) {
|
||||
struct sk_buff* clone = skb_copy_expand(skb, skb_headroom(skb), skb_tailroom(skb), GFP_KERNEL);
|
||||
if (!clone) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* */
|
||||
if (!is80211) {
|
||||
if (sc_capwap_8023_to_80211(clone, dev->dev_addr)) {
|
||||
kfree_skb(clone);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
TRACEKMOD("*** Send broadcast packet to interface: %d\n", dev->ifindex);
|
||||
|
||||
/* Send packet */
|
||||
local_bh_disable();
|
||||
ieee80211_inject_xmit(clone, dev);
|
||||
local_bh_enable();
|
||||
} else {
|
||||
TRACEKMOD("*** Unknown wlanid: %d\n", (int)wlanid);
|
||||
}
|
||||
}
|
||||
|
||||
/* Next */
|
||||
wlanid++;
|
||||
bitmask >>= 1;
|
||||
}
|
||||
} else {
|
||||
TRACEKMOD("*** Invalid broadcast packet\n");
|
||||
}
|
||||
|
||||
/* Free broadcast packet */
|
||||
kfree_skb(skb);
|
||||
} else {
|
||||
/* Accept only 802.11 frame or 802.3 frame with radio address */
|
||||
if (is80211 || (radioaddr && (radioaddr->length == MACADDRESS_EUI48_LENGTH))){
|
||||
if (!is80211) {
|
||||
if (sc_capwap_8023_to_80211(skb, radioaddr->addr)) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
/* */
|
||||
dev = sc_netlink_getdev_from_bssid(GET_RID_HEADER(header), ((struct ieee80211_hdr*)skb->data)->addr2);
|
||||
if (!dev) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
TRACEKMOD("** Send packet to interface: %d\n", dev->ifindex);
|
||||
|
||||
/* Send packet */
|
||||
local_bh_disable();
|
||||
ieee80211_inject_xmit(skb, dev);
|
||||
local_bh_enable();
|
||||
} else {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
error:
|
||||
TRACEKMOD("*** Invalid packet\n");
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_capwap_parsingmgmtpacket(struct sc_capwap_session* session, struct sk_buff* skb) {
|
||||
TRACEKMOD("### sc_capwap_parsingmgmtpacket\n");
|
||||
|
||||
/* Send packet with capwap header into userspace */
|
||||
sc_netlink_notify_recv_data(skb->data, skb->len);
|
||||
}
|
||||
#include "config.h"
|
||||
#include <linux/module.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/ieee80211.h>
|
||||
#include <net/mac80211.h>
|
||||
#include <net/ipv6.h>
|
||||
#include "capwap.h"
|
||||
#include "nlsmartcapwap.h"
|
||||
#include "netlinkapp.h"
|
||||
|
||||
/* */
|
||||
static struct sc_capwap_session sc_acsession;
|
||||
|
||||
/* */
|
||||
int sc_capwap_init(void) {
|
||||
TRACEKMOD("### sc_capwap_init\n");
|
||||
|
||||
/* Init session */
|
||||
memset(&sc_acsession, 0, sizeof(struct sc_capwap_session));
|
||||
sc_capwap_initsession(&sc_acsession);
|
||||
|
||||
/* Init sockect */
|
||||
memset(&sc_localaddr, 0, sizeof(union capwap_addr));
|
||||
return sc_socket_init();
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_capwap_close(void) {
|
||||
TRACEKMOD("### sc_capwap_close\n");
|
||||
|
||||
/* */
|
||||
sc_socket_close();
|
||||
memset(&sc_localaddr, 0, sizeof(union capwap_addr));
|
||||
sc_capwap_freesession(&sc_acsession);
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_capwap_connect(const union capwap_addr* sockaddr, struct sc_capwap_sessionid_element* sessionid, uint16_t mtu) {
|
||||
TRACEKMOD("### sc_capwap_connect\n");
|
||||
|
||||
if ((sc_localaddr.ss.ss_family != AF_INET) && (sc_localaddr.ss.ss_family != AF_INET6)) {
|
||||
return -ENONET;
|
||||
}
|
||||
|
||||
/* AC address */
|
||||
if ((sockaddr->ss.ss_family == AF_INET6) && ipv6_addr_v4mapped(&sockaddr->sin6.sin6_addr)) {
|
||||
return -EINVAL;
|
||||
} else if ((sc_localaddr.ss.ss_family == AF_INET) && (sockaddr->ss.ss_family == AF_INET6)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* */
|
||||
memcpy(&sc_acsession.peeraddr, sockaddr, sizeof(union capwap_addr));
|
||||
memcpy(&sc_acsession.sessionid, sessionid, sizeof(struct sc_capwap_sessionid_element));
|
||||
sc_acsession.mtu = mtu;
|
||||
|
||||
return sc_capwap_sendkeepalive();
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_capwap_resetsession(void) {
|
||||
TRACEKMOD("### sc_capwap_resetsession\n");
|
||||
|
||||
/* */
|
||||
sc_capwap_freesession(&sc_acsession);
|
||||
|
||||
/* Reinit session */
|
||||
memset(&sc_acsession, 0, sizeof(struct sc_capwap_session));
|
||||
sc_capwap_initsession(&sc_acsession);
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_capwap_sendkeepalive(void) {
|
||||
int ret;
|
||||
int length;
|
||||
uint8_t buffer[CAPWAP_KEEP_ALIVE_MAX_SIZE];
|
||||
|
||||
TRACEKMOD("### sc_capwap_sendkeepalive\n");
|
||||
|
||||
/* Build keepalive */
|
||||
length = sc_capwap_createkeepalive(&sc_acsession.sessionid, buffer, CAPWAP_KEEP_ALIVE_MAX_SIZE);
|
||||
|
||||
/* Send packet */
|
||||
ret = sc_socket_send(SOCKET_UDP, buffer, length, &sc_acsession.peeraddr);
|
||||
TRACEKMOD("*** Send keep-alive result: %d\n", ret);
|
||||
if (ret > 0) {
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* */
|
||||
struct sc_capwap_session* sc_capwap_getsession(const union capwap_addr* sockaddr) {
|
||||
TRACEKMOD("### sc_capwap_getsession\n");
|
||||
|
||||
if (!sockaddr) {
|
||||
return &sc_acsession;
|
||||
} else if (sc_acsession.peeraddr.ss.ss_family == sockaddr->ss.ss_family) {
|
||||
if (sc_acsession.peeraddr.ss.ss_family == AF_INET) {
|
||||
if ((sc_acsession.peeraddr.sin.sin_port == sockaddr->sin.sin_port) && (sc_acsession.peeraddr.sin.sin_addr.s_addr == sockaddr->sin.sin_addr.s_addr)) {
|
||||
return &sc_acsession;
|
||||
}
|
||||
} else if (sc_acsession.peeraddr.ss.ss_family == AF_INET6) {
|
||||
if ((sc_acsession.peeraddr.sin6.sin6_port == sockaddr->sin6.sin6_port) && !ipv6_addr_cmp(&sc_acsession.peeraddr.sin6.sin6_addr, &sockaddr->sin6.sin6_addr)) {
|
||||
return &sc_acsession;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_capwap_recvpacket(struct sk_buff* skb) {
|
||||
union capwap_addr peeraddr;
|
||||
struct sc_capwap_session* session;
|
||||
|
||||
TRACEKMOD("### sc_capwap_recvpacket\n");
|
||||
|
||||
/* Get peer address */
|
||||
if (sc_socket_getpeeraddr(skb, &peeraddr)) {
|
||||
goto drop;
|
||||
}
|
||||
|
||||
/* Get session */
|
||||
session = sc_capwap_getsession(&peeraddr);
|
||||
if (!session) {
|
||||
TRACEKMOD("*** Session not found\n");
|
||||
goto drop;
|
||||
}
|
||||
|
||||
/* Remove UDP header */
|
||||
if (!skb_pull(skb, sizeof(struct udphdr))) {
|
||||
TRACEKMOD("*** Invalid packet\n");
|
||||
goto drop;
|
||||
}
|
||||
|
||||
/* Parsing packet */
|
||||
if (sc_capwap_parsingpacket(session, &peeraddr, skb)) {
|
||||
TRACEKMOD("*** Parsing error\n");
|
||||
goto drop;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
drop:
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
/* */
|
||||
struct sc_capwap_session* sc_capwap_recvunknownkeepalive(const union capwap_addr* sockaddr, const struct sc_capwap_sessionid_element* sessionid) {
|
||||
TRACEKMOD("### sc_capwap_recvunknownkeepalive\n");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_capwap_parsingdatapacket(struct sc_capwap_session* session, struct sk_buff* skb) {
|
||||
uint8_t* pos;
|
||||
uint8_t* dstaddress;
|
||||
struct net_device* dev;
|
||||
struct sc_capwap_header* header = (struct sc_capwap_header*)skb->data;
|
||||
int is80211 = (IS_FLAG_T_HEADER(header) ? 1 : 0);
|
||||
struct sc_capwap_radio_addr* radioaddr = NULL;
|
||||
int radioaddrsize = 0;
|
||||
struct sc_capwap_wireless_information* winfo = NULL;
|
||||
struct sc_capwap_destination_wlans* destwlan = NULL;
|
||||
int winfosize = 0;
|
||||
|
||||
TRACEKMOD("### sc_capwap_parsingdatapacket\n");
|
||||
|
||||
/* Retrieve optional attribute */
|
||||
pos = skb->data + sizeof(struct sc_capwap_header);
|
||||
if (IS_FLAG_M_HEADER(header)) {
|
||||
radioaddr = (struct sc_capwap_radio_addr*)pos;
|
||||
radioaddrsize = (sizeof(struct sc_capwap_radio_addr) + radioaddr->length + 3) & ~3;
|
||||
pos += radioaddrsize;
|
||||
}
|
||||
|
||||
if (IS_FLAG_W_HEADER(header)) {
|
||||
winfo = (struct sc_capwap_wireless_information*)pos;
|
||||
destwlan = (struct sc_capwap_destination_wlans*)(pos + sizeof(struct sc_capwap_wireless_information));
|
||||
winfosize = (sizeof(struct sc_capwap_wireless_information) + winfo->length + 3) & ~3;
|
||||
pos += winfosize;
|
||||
}
|
||||
|
||||
/* Body packet */
|
||||
skb_pull(skb, GET_HLEN_HEADER(header) * 4);
|
||||
|
||||
dstaddress = (is80211 ? ieee80211_get_DA((struct ieee80211_hdr*)skb->data) : (uint8_t*)((struct ethhdr*)skb->data)->h_dest);
|
||||
if (is_multicast_ether_addr(dstaddress)) {
|
||||
/* Accept only broadcast packet with wireless information */
|
||||
if (winfo) {
|
||||
uint8_t wlanid = 1;
|
||||
uint16_t bitmask = be16_to_cpu(destwlan->wlanidbitmap);
|
||||
while (bitmask) {
|
||||
if (bitmask & 0x01) {
|
||||
dev = sc_netlink_getdev_from_wlanid(GET_RID_HEADER(header), wlanid);
|
||||
if (dev) {
|
||||
struct sk_buff* clone = skb_copy_expand(skb, skb_headroom(skb), skb_tailroom(skb), GFP_KERNEL);
|
||||
if (!clone) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* */
|
||||
if (!is80211) {
|
||||
if (sc_capwap_8023_to_80211(clone, dev->dev_addr)) {
|
||||
kfree_skb(clone);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
TRACEKMOD("*** Send broadcast packet to interface: %d\n", dev->ifindex);
|
||||
|
||||
/* Send packet */
|
||||
local_bh_disable();
|
||||
ieee80211_inject_xmit(clone, dev);
|
||||
local_bh_enable();
|
||||
} else {
|
||||
TRACEKMOD("*** Unknown wlanid: %d\n", (int)wlanid);
|
||||
}
|
||||
}
|
||||
|
||||
/* Next */
|
||||
wlanid++;
|
||||
bitmask >>= 1;
|
||||
}
|
||||
} else {
|
||||
TRACEKMOD("*** Invalid broadcast packet\n");
|
||||
}
|
||||
|
||||
/* Free broadcast packet */
|
||||
kfree_skb(skb);
|
||||
} else {
|
||||
/* Accept only 802.11 frame or 802.3 frame with radio address */
|
||||
if (is80211 || (radioaddr && (radioaddr->length == MACADDRESS_EUI48_LENGTH))){
|
||||
if (!is80211) {
|
||||
if (sc_capwap_8023_to_80211(skb, radioaddr->addr)) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
/* */
|
||||
dev = sc_netlink_getdev_from_bssid(GET_RID_HEADER(header), ((struct ieee80211_hdr*)skb->data)->addr2);
|
||||
if (!dev) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
TRACEKMOD("** Send packet to interface: %d\n", dev->ifindex);
|
||||
|
||||
/* Send packet */
|
||||
local_bh_disable();
|
||||
ieee80211_inject_xmit(skb, dev);
|
||||
local_bh_enable();
|
||||
} else {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
error:
|
||||
TRACEKMOD("*** Invalid packet\n");
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_capwap_parsingmgmtpacket(struct sc_capwap_session* session, struct sk_buff* skb) {
|
||||
TRACEKMOD("### sc_capwap_parsingmgmtpacket\n");
|
||||
|
||||
/* Send packet with capwap header into userspace */
|
||||
sc_netlink_notify_recv_data(skb->data, skb->len);
|
||||
}
|
||||
|
@ -1,27 +1,27 @@
|
||||
#ifndef __KMOD_CAPWAP_PRIVATE_HEADER__
|
||||
#define __KMOD_CAPWAP_PRIVATE_HEADER__
|
||||
|
||||
/* */
|
||||
struct sc_capwap_workthread {
|
||||
struct task_struct* thread;
|
||||
|
||||
struct sk_buff_head queue;
|
||||
wait_queue_head_t waitevent;
|
||||
};
|
||||
|
||||
/* */
|
||||
int sc_capwap_init(void);
|
||||
void sc_capwap_close(void);
|
||||
|
||||
/* */
|
||||
int sc_capwap_connect(const union capwap_addr* sockaddr, struct sc_capwap_sessionid_element* sessionid, uint16_t mtu);
|
||||
void sc_capwap_resetsession(void);
|
||||
|
||||
/* */
|
||||
struct sc_capwap_session* sc_capwap_getsession(const union capwap_addr* sockaddr);
|
||||
|
||||
/* */
|
||||
int sc_capwap_sendkeepalive(void);
|
||||
|
||||
#endif /* __KMOD_CAPWAP_PRIVATE_HEADER__ */
|
||||
|
||||
#ifndef __KMOD_CAPWAP_PRIVATE_HEADER__
|
||||
#define __KMOD_CAPWAP_PRIVATE_HEADER__
|
||||
|
||||
/* */
|
||||
struct sc_capwap_workthread {
|
||||
struct task_struct* thread;
|
||||
|
||||
struct sk_buff_head queue;
|
||||
wait_queue_head_t waitevent;
|
||||
};
|
||||
|
||||
/* */
|
||||
int sc_capwap_init(void);
|
||||
void sc_capwap_close(void);
|
||||
|
||||
/* */
|
||||
int sc_capwap_connect(const union capwap_addr* sockaddr, struct sc_capwap_sessionid_element* sessionid, uint16_t mtu);
|
||||
void sc_capwap_resetsession(void);
|
||||
|
||||
/* */
|
||||
struct sc_capwap_session* sc_capwap_getsession(const union capwap_addr* sockaddr);
|
||||
|
||||
/* */
|
||||
int sc_capwap_sendkeepalive(void);
|
||||
|
||||
#endif /* __KMOD_CAPWAP_PRIVATE_HEADER__ */
|
||||
|
||||
|
@ -1,187 +1,187 @@
|
||||
#ifndef __KMOD_CAPWAP_RFC_HEADER__
|
||||
#define __KMOD_CAPWAP_RFC_HEADER__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
/* */
|
||||
#define CAPWAP_RADIOID_MAX_COUNT 31
|
||||
#define IS_VALID_RADIOID(x) ((x >= 1) && (x <= CAPWAP_RADIOID_MAX_COUNT))
|
||||
|
||||
#define CAPWAP_WLANID_MAX_COUNT 16
|
||||
#define IS_VALID_WLANID(x) ((x >= 1) && (x <= CAPWAP_WLANID_MAX_COUNT))
|
||||
|
||||
/* */
|
||||
#define CAPWAP_WIRELESS_BINDING_NONE 0
|
||||
#define CAPWAP_WIRELESS_BINDING_IEEE80211 1
|
||||
|
||||
/* */
|
||||
#define CAPWAP_ELEMENT_SESSIONID 35
|
||||
|
||||
/* */
|
||||
#define CAPWAP_KEEPALIVE_SIZE (sizeof(struct sc_capwap_dtls_header) + \
|
||||
sizeof(struct sc_capwap_header) + \
|
||||
sizeof(struct sc_capwap_data_message) + \
|
||||
sizeof(struct sc_capwap_message_element) + \
|
||||
sizeof(struct sc_capwap_sessionid_element))
|
||||
|
||||
/* Preamble */
|
||||
struct sc_capwap_preamble {
|
||||
#if defined(__BIG_ENDIAN_BITFIELD)
|
||||
uint8_t version: 4,
|
||||
type: 4;
|
||||
#elif defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
uint8_t type: 4,
|
||||
version: 4;
|
||||
#endif
|
||||
} __packed;
|
||||
|
||||
/* DTLS header */
|
||||
struct sc_capwap_dtls_header {
|
||||
struct sc_capwap_preamble preamble;
|
||||
uint8_t reserved[3];
|
||||
} __packed;
|
||||
|
||||
/* Plain header */
|
||||
struct sc_capwap_header {
|
||||
struct sc_capwap_preamble preamble;
|
||||
#if defined(__BIG_ENDIAN_BITFIELD)
|
||||
uint16_t hlen: 5,
|
||||
rid: 5,
|
||||
wbid: 5,
|
||||
flag_t: 1;
|
||||
uint8_t flag_f: 1,
|
||||
flag_l: 1,
|
||||
flag_w: 1,
|
||||
flag_m: 1,
|
||||
flag_k: 1,
|
||||
flag_res: 3;
|
||||
#elif defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
uint16_t _rid_hi: 3,
|
||||
hlen: 5,
|
||||
flag_t: 1,
|
||||
wbid: 5,
|
||||
_rid_lo: 2;
|
||||
uint8_t flag_res: 3,
|
||||
flag_k: 1,
|
||||
flag_m: 1,
|
||||
flag_w: 1,
|
||||
flag_l: 1,
|
||||
flag_f: 1;
|
||||
#endif
|
||||
__be16 frag_id;
|
||||
__be16 frag_off;
|
||||
} __packed;
|
||||
|
||||
/* Mac Address */
|
||||
#define CAPWAP_RADIO_EUI48_LENGTH_PADDED 8
|
||||
#define CAPWAP_RADIO_EUI64_LENGTH_PADDED 12
|
||||
#define CAPWAP_RADIO_MAX_LENGTH_PADDED 12
|
||||
struct sc_capwap_radio_addr {
|
||||
uint8_t length;
|
||||
uint8_t addr[0];
|
||||
} __packed;
|
||||
|
||||
/* Wireless Information */
|
||||
#define CAPWAP_WINFO_FRAMEINFO_LENGTH_PADDED 8
|
||||
#define CAPWAP_WINFO_DESTWLAN_LENGTH_PADDED 8
|
||||
#define CAPWAP_WINFO_MAX_LENGTH_PADDED 8
|
||||
struct sc_capwap_wireless_information {
|
||||
uint8_t length;
|
||||
} __packed;
|
||||
|
||||
/* IEEE802.11 Wireless Information */
|
||||
struct sc_capwap_ieee80211_frame_info {
|
||||
uint8_t rssi;
|
||||
uint8_t snr;
|
||||
__be16 rate;
|
||||
} __packed;
|
||||
|
||||
/* Destination WLANs */
|
||||
struct sc_capwap_destination_wlans {
|
||||
__be16 wlanidbitmap;
|
||||
__be16 reserved;
|
||||
} __packed;
|
||||
|
||||
/* */
|
||||
#define CAPWAP_HEADER_MAX_LENGTH (sizeof(struct sc_capwap_header) + CAPWAP_RADIO_MAX_LENGTH_PADDED + CAPWAP_WINFO_MAX_LENGTH_PADDED)
|
||||
|
||||
/* Data channel message */
|
||||
struct sc_capwap_data_message {
|
||||
__be16 length;
|
||||
} __packed;
|
||||
|
||||
/* Message element */
|
||||
struct sc_capwap_message_element {
|
||||
__be16 type;
|
||||
__be16 length;
|
||||
} __packed;
|
||||
|
||||
/* Session id message element */
|
||||
struct sc_capwap_sessionid_element {
|
||||
union {
|
||||
uint8_t id[16];
|
||||
uint32_t id32[4];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
/* */
|
||||
#define MACADDRESS_EUI48_LENGTH 6
|
||||
struct sc_capwap_macaddress_eui48 {
|
||||
uint8_t addr[MACADDRESS_EUI48_LENGTH];
|
||||
} __packed;
|
||||
|
||||
/* */
|
||||
#define MACADDRESS_EUI64_LENGTH 8
|
||||
struct sc_capwap_macaddress_eui64 {
|
||||
uint8_t addr[MACADDRESS_EUI64_LENGTH];
|
||||
} __packed;
|
||||
|
||||
/* Capwap preamble */
|
||||
#define CAPWAP_PROTOCOL_VERSION 0
|
||||
#define CAPWAP_PREAMBLE_HEADER 0
|
||||
#define CAPWAP_PREAMBLE_DTLS_HEADER 1
|
||||
|
||||
#define CAPWAP_WIRELESS_BINDING_NONE 0
|
||||
#define CAPWAP_WIRELESS_BINDING_IEEE80211 1
|
||||
|
||||
/* */
|
||||
#define CAPWAP_KEEP_ALIVE_MAX_SIZE (sizeof(struct sc_capwap_header) + sizeof(struct sc_capwap_data_message) + sizeof(struct sc_capwap_message_element) + sizeof(struct sc_capwap_sessionid_element))
|
||||
|
||||
/* */
|
||||
#define GET_VERSION_HEADER(x) ((x)->preamble.version)
|
||||
#define SET_VERSION_HEADER(x, y) ((x)->preamble.version = (uint8_t)(y))
|
||||
#define GET_TYPE_HEADER(x) ((x)->preamble.type)
|
||||
#define SET_TYPE_HEADER(x, y) ((x)->preamble.type = (uint8_t)(y))
|
||||
|
||||
#define GET_HLEN_HEADER(x) ((x)->hlen)
|
||||
#define SET_HLEN_HEADER(x, y) ((x)->hlen = (uint16_t)(y))
|
||||
#if defined(__BIG_ENDIAN_BITFIELD)
|
||||
#define GET_RID_HEADER(x) ((uint8_t)((x)->rid))
|
||||
#define SET_RID_HEADER(x, y) ((x)->rid = (uint16_t)(y))
|
||||
#elif defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
#define GET_RID_HEADER(x) ((uint8_t)((uint16_t)((x)->_rid_hi << 2 | (x)->_rid_lo)))
|
||||
#define SET_RID_HEADER(x, y) ({ (x)->_rid_hi = (uint16_t)((y) >> 2); (x)->_rid_lo = (uint16_t)((y) & 0x0003); })
|
||||
#endif
|
||||
#define GET_WBID_HEADER(x) ((uint8_t)((x)->wbid))
|
||||
#define SET_WBID_HEADER(x, y) ((x)->wbid = (uint16_t)(y))
|
||||
|
||||
#define IS_FLAG_T_HEADER(x) ((x)->flag_t)
|
||||
#define SET_FLAG_T_HEADER(x, y) ((x)->flag_t = ((y) ? 1 : 0))
|
||||
#define IS_FLAG_F_HEADER(x) ((x)->flag_f)
|
||||
#define SET_FLAG_F_HEADER(x, y) ((x)->flag_f = ((y) ? 1 : 0))
|
||||
#define IS_FLAG_L_HEADER(x) ((x)->flag_l)
|
||||
#define SET_FLAG_L_HEADER(x, y) ((x)->flag_l = ((y) ? 1 : 0))
|
||||
#define IS_FLAG_W_HEADER(x) ((x)->flag_w)
|
||||
#define SET_FLAG_W_HEADER(x, y) ((x)->flag_w = ((y) ? 1 : 0))
|
||||
#define IS_FLAG_M_HEADER(x) ((x)->flag_m)
|
||||
#define SET_FLAG_M_HEADER(x, y) ((x)->flag_m = ((y) ? 1 : 0))
|
||||
#define IS_FLAG_K_HEADER(x) ((x)->flag_k)
|
||||
#define SET_FLAG_K_HEADER(x, y) ((x)->flag_k = ((y) ? 1 : 0))
|
||||
|
||||
/* IEEE 802.11 Add WLAN */
|
||||
#define CAPWAP_ADD_WLAN_TUNNELMODE_LOCAL 0
|
||||
#define CAPWAP_ADD_WLAN_TUNNELMODE_8023 1
|
||||
#define CAPWAP_ADD_WLAN_TUNNELMODE_80211 2
|
||||
|
||||
#endif /* __KMOD_CAPWAP_RFC_HEADER__ */
|
||||
#ifndef __KMOD_CAPWAP_RFC_HEADER__
|
||||
#define __KMOD_CAPWAP_RFC_HEADER__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
/* */
|
||||
#define CAPWAP_RADIOID_MAX_COUNT 31
|
||||
#define IS_VALID_RADIOID(x) ((x >= 1) && (x <= CAPWAP_RADIOID_MAX_COUNT))
|
||||
|
||||
#define CAPWAP_WLANID_MAX_COUNT 16
|
||||
#define IS_VALID_WLANID(x) ((x >= 1) && (x <= CAPWAP_WLANID_MAX_COUNT))
|
||||
|
||||
/* */
|
||||
#define CAPWAP_WIRELESS_BINDING_NONE 0
|
||||
#define CAPWAP_WIRELESS_BINDING_IEEE80211 1
|
||||
|
||||
/* */
|
||||
#define CAPWAP_ELEMENT_SESSIONID 35
|
||||
|
||||
/* */
|
||||
#define CAPWAP_KEEPALIVE_SIZE (sizeof(struct sc_capwap_dtls_header) + \
|
||||
sizeof(struct sc_capwap_header) + \
|
||||
sizeof(struct sc_capwap_data_message) + \
|
||||
sizeof(struct sc_capwap_message_element) + \
|
||||
sizeof(struct sc_capwap_sessionid_element))
|
||||
|
||||
/* Preamble */
|
||||
struct sc_capwap_preamble {
|
||||
#if defined(__BIG_ENDIAN_BITFIELD)
|
||||
uint8_t version: 4,
|
||||
type: 4;
|
||||
#elif defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
uint8_t type: 4,
|
||||
version: 4;
|
||||
#endif
|
||||
} __packed;
|
||||
|
||||
/* DTLS header */
|
||||
struct sc_capwap_dtls_header {
|
||||
struct sc_capwap_preamble preamble;
|
||||
uint8_t reserved[3];
|
||||
} __packed;
|
||||
|
||||
/* Plain header */
|
||||
struct sc_capwap_header {
|
||||
struct sc_capwap_preamble preamble;
|
||||
#if defined(__BIG_ENDIAN_BITFIELD)
|
||||
uint16_t hlen: 5,
|
||||
rid: 5,
|
||||
wbid: 5,
|
||||
flag_t: 1;
|
||||
uint8_t flag_f: 1,
|
||||
flag_l: 1,
|
||||
flag_w: 1,
|
||||
flag_m: 1,
|
||||
flag_k: 1,
|
||||
flag_res: 3;
|
||||
#elif defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
uint16_t _rid_hi: 3,
|
||||
hlen: 5,
|
||||
flag_t: 1,
|
||||
wbid: 5,
|
||||
_rid_lo: 2;
|
||||
uint8_t flag_res: 3,
|
||||
flag_k: 1,
|
||||
flag_m: 1,
|
||||
flag_w: 1,
|
||||
flag_l: 1,
|
||||
flag_f: 1;
|
||||
#endif
|
||||
__be16 frag_id;
|
||||
__be16 frag_off;
|
||||
} __packed;
|
||||
|
||||
/* Mac Address */
|
||||
#define CAPWAP_RADIO_EUI48_LENGTH_PADDED 8
|
||||
#define CAPWAP_RADIO_EUI64_LENGTH_PADDED 12
|
||||
#define CAPWAP_RADIO_MAX_LENGTH_PADDED 12
|
||||
struct sc_capwap_radio_addr {
|
||||
uint8_t length;
|
||||
uint8_t addr[0];
|
||||
} __packed;
|
||||
|
||||
/* Wireless Information */
|
||||
#define CAPWAP_WINFO_FRAMEINFO_LENGTH_PADDED 8
|
||||
#define CAPWAP_WINFO_DESTWLAN_LENGTH_PADDED 8
|
||||
#define CAPWAP_WINFO_MAX_LENGTH_PADDED 8
|
||||
struct sc_capwap_wireless_information {
|
||||
uint8_t length;
|
||||
} __packed;
|
||||
|
||||
/* IEEE802.11 Wireless Information */
|
||||
struct sc_capwap_ieee80211_frame_info {
|
||||
uint8_t rssi;
|
||||
uint8_t snr;
|
||||
__be16 rate;
|
||||
} __packed;
|
||||
|
||||
/* Destination WLANs */
|
||||
struct sc_capwap_destination_wlans {
|
||||
__be16 wlanidbitmap;
|
||||
__be16 reserved;
|
||||
} __packed;
|
||||
|
||||
/* */
|
||||
#define CAPWAP_HEADER_MAX_LENGTH (sizeof(struct sc_capwap_header) + CAPWAP_RADIO_MAX_LENGTH_PADDED + CAPWAP_WINFO_MAX_LENGTH_PADDED)
|
||||
|
||||
/* Data channel message */
|
||||
struct sc_capwap_data_message {
|
||||
__be16 length;
|
||||
} __packed;
|
||||
|
||||
/* Message element */
|
||||
struct sc_capwap_message_element {
|
||||
__be16 type;
|
||||
__be16 length;
|
||||
} __packed;
|
||||
|
||||
/* Session id message element */
|
||||
struct sc_capwap_sessionid_element {
|
||||
union {
|
||||
uint8_t id[16];
|
||||
uint32_t id32[4];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
/* */
|
||||
#define MACADDRESS_EUI48_LENGTH 6
|
||||
struct sc_capwap_macaddress_eui48 {
|
||||
uint8_t addr[MACADDRESS_EUI48_LENGTH];
|
||||
} __packed;
|
||||
|
||||
/* */
|
||||
#define MACADDRESS_EUI64_LENGTH 8
|
||||
struct sc_capwap_macaddress_eui64 {
|
||||
uint8_t addr[MACADDRESS_EUI64_LENGTH];
|
||||
} __packed;
|
||||
|
||||
/* Capwap preamble */
|
||||
#define CAPWAP_PROTOCOL_VERSION 0
|
||||
#define CAPWAP_PREAMBLE_HEADER 0
|
||||
#define CAPWAP_PREAMBLE_DTLS_HEADER 1
|
||||
|
||||
#define CAPWAP_WIRELESS_BINDING_NONE 0
|
||||
#define CAPWAP_WIRELESS_BINDING_IEEE80211 1
|
||||
|
||||
/* */
|
||||
#define CAPWAP_KEEP_ALIVE_MAX_SIZE (sizeof(struct sc_capwap_header) + sizeof(struct sc_capwap_data_message) + sizeof(struct sc_capwap_message_element) + sizeof(struct sc_capwap_sessionid_element))
|
||||
|
||||
/* */
|
||||
#define GET_VERSION_HEADER(x) ((x)->preamble.version)
|
||||
#define SET_VERSION_HEADER(x, y) ((x)->preamble.version = (uint8_t)(y))
|
||||
#define GET_TYPE_HEADER(x) ((x)->preamble.type)
|
||||
#define SET_TYPE_HEADER(x, y) ((x)->preamble.type = (uint8_t)(y))
|
||||
|
||||
#define GET_HLEN_HEADER(x) ((x)->hlen)
|
||||
#define SET_HLEN_HEADER(x, y) ((x)->hlen = (uint16_t)(y))
|
||||
#if defined(__BIG_ENDIAN_BITFIELD)
|
||||
#define GET_RID_HEADER(x) ((uint8_t)((x)->rid))
|
||||
#define SET_RID_HEADER(x, y) ((x)->rid = (uint16_t)(y))
|
||||
#elif defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
#define GET_RID_HEADER(x) ((uint8_t)((uint16_t)((x)->_rid_hi << 2 | (x)->_rid_lo)))
|
||||
#define SET_RID_HEADER(x, y) ({ (x)->_rid_hi = (uint16_t)((y) >> 2); (x)->_rid_lo = (uint16_t)((y) & 0x0003); })
|
||||
#endif
|
||||
#define GET_WBID_HEADER(x) ((uint8_t)((x)->wbid))
|
||||
#define SET_WBID_HEADER(x, y) ((x)->wbid = (uint16_t)(y))
|
||||
|
||||
#define IS_FLAG_T_HEADER(x) ((x)->flag_t)
|
||||
#define SET_FLAG_T_HEADER(x, y) ((x)->flag_t = ((y) ? 1 : 0))
|
||||
#define IS_FLAG_F_HEADER(x) ((x)->flag_f)
|
||||
#define SET_FLAG_F_HEADER(x, y) ((x)->flag_f = ((y) ? 1 : 0))
|
||||
#define IS_FLAG_L_HEADER(x) ((x)->flag_l)
|
||||
#define SET_FLAG_L_HEADER(x, y) ((x)->flag_l = ((y) ? 1 : 0))
|
||||
#define IS_FLAG_W_HEADER(x) ((x)->flag_w)
|
||||
#define SET_FLAG_W_HEADER(x, y) ((x)->flag_w = ((y) ? 1 : 0))
|
||||
#define IS_FLAG_M_HEADER(x) ((x)->flag_m)
|
||||
#define SET_FLAG_M_HEADER(x, y) ((x)->flag_m = ((y) ? 1 : 0))
|
||||
#define IS_FLAG_K_HEADER(x) ((x)->flag_k)
|
||||
#define SET_FLAG_K_HEADER(x, y) ((x)->flag_k = ((y) ? 1 : 0))
|
||||
|
||||
/* IEEE 802.11 Add WLAN */
|
||||
#define CAPWAP_ADD_WLAN_TUNNELMODE_LOCAL 0
|
||||
#define CAPWAP_ADD_WLAN_TUNNELMODE_8023 1
|
||||
#define CAPWAP_ADD_WLAN_TUNNELMODE_80211 2
|
||||
|
||||
#endif /* __KMOD_CAPWAP_RFC_HEADER__ */
|
||||
|
@ -1,13 +1,13 @@
|
||||
#ifndef __KMOD_CONFIG_HEADER__
|
||||
#define __KMOD_CONFIG_HEADER__
|
||||
|
||||
#define DEBUGKMOD 1
|
||||
|
||||
#ifdef DEBUGKMOD
|
||||
#define TRACEKMOD(s, args...) printk(s, ##args)
|
||||
#else
|
||||
#define TRACEKMOD(s, args...)
|
||||
#endif
|
||||
|
||||
#endif /* __KMOD_CONFIG_HEADER__ */
|
||||
|
||||
#ifndef __KMOD_CONFIG_HEADER__
|
||||
#define __KMOD_CONFIG_HEADER__
|
||||
|
||||
#define DEBUGKMOD 1
|
||||
|
||||
#ifdef DEBUGKMOD
|
||||
#define TRACEKMOD(s, args...) printk(s, ##args)
|
||||
#else
|
||||
#define TRACEKMOD(s, args...)
|
||||
#endif
|
||||
|
||||
#endif /* __KMOD_CONFIG_HEADER__ */
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,19 +1,19 @@
|
||||
#ifndef __KMOD_WTP_NETLINKAPP_HEADER__
|
||||
#define __KMOD_WTP_NETLINKAPP_HEADER__
|
||||
|
||||
#include "capwap_rfc.h"
|
||||
#include "socket.h"
|
||||
|
||||
/* */
|
||||
int sc_netlink_init(void);
|
||||
void sc_netlink_exit(void);
|
||||
|
||||
/* */
|
||||
struct net_device* sc_netlink_getdev_from_wlanid(uint8_t radioid, uint8_t wlanid);
|
||||
struct net_device* sc_netlink_getdev_from_bssid(uint8_t radioid, const uint8_t* addr);
|
||||
|
||||
/* */
|
||||
int sc_netlink_notify_recv_keepalive(const union capwap_addr* sockaddr, struct sc_capwap_sessionid_element* sessionid);
|
||||
int sc_netlink_notify_recv_data(uint8_t* packet, int length);
|
||||
|
||||
#endif /* __KMOD_WTP_NETLINKAPP_HEADER__ */
|
||||
#ifndef __KMOD_WTP_NETLINKAPP_HEADER__
|
||||
#define __KMOD_WTP_NETLINKAPP_HEADER__
|
||||
|
||||
#include "capwap_rfc.h"
|
||||
#include "socket.h"
|
||||
|
||||
/* */
|
||||
int sc_netlink_init(void);
|
||||
void sc_netlink_exit(void);
|
||||
|
||||
/* */
|
||||
struct net_device* sc_netlink_getdev_from_wlanid(uint8_t radioid, uint8_t wlanid);
|
||||
struct net_device* sc_netlink_getdev_from_bssid(uint8_t radioid, const uint8_t* addr);
|
||||
|
||||
/* */
|
||||
int sc_netlink_notify_recv_keepalive(const union capwap_addr* sockaddr, struct sc_capwap_sessionid_element* sessionid);
|
||||
int sc_netlink_notify_recv_data(uint8_t* packet, int length);
|
||||
|
||||
#endif /* __KMOD_WTP_NETLINKAPP_HEADER__ */
|
||||
|
@ -1,66 +1,66 @@
|
||||
#ifndef __WTP_NLSMARTCAPWAP_HEADER__
|
||||
#define __WTP_NLSMARTCAPWAP_HEADER__
|
||||
|
||||
/* */
|
||||
#define NLSMARTCAPWAP_GENL_NAME "smartcapwap_wtp"
|
||||
|
||||
/* */
|
||||
#define NLSMARTCAPWAP_FLAGS_TUNNEL_8023 0x00000001
|
||||
|
||||
/* */
|
||||
enum nlsmartcapwap_attrs {
|
||||
NLSMARTCAPWAP_ATTR_UNSPEC,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_IFINDEX,
|
||||
NLSMARTCAPWAP_ATTR_RADIOID,
|
||||
NLSMARTCAPWAP_ATTR_WLANID,
|
||||
NLSMARTCAPWAP_ATTR_BINDING,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_FLAGS,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_MGMT_SUBTYPE_MASK,
|
||||
NLSMARTCAPWAP_ATTR_CTRL_SUBTYPE_MASK,
|
||||
NLSMARTCAPWAP_ATTR_DATA_SUBTYPE_MASK,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_ADDRESS,
|
||||
NLSMARTCAPWAP_ATTR_MTU,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_SESSION_ID,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_DTLS,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_DATA_FRAME,
|
||||
NLSMARTCAPWAP_ATTR_RSSI,
|
||||
NLSMARTCAPWAP_ATTR_SNR,
|
||||
NLSMARTCAPWAP_ATTR_RATE,
|
||||
|
||||
/* Last attribute */
|
||||
__NLSMARTCAPWAP_ATTR_AFTER_LAST,
|
||||
NLSMARTCAPWAP_ATTR_MAX = __NLSMARTCAPWAP_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/* */
|
||||
enum nlsmartcapwap_commands {
|
||||
NLSMARTCAPWAP_CMD_UNSPEC,
|
||||
|
||||
NLSMARTCAPWAP_CMD_LINK,
|
||||
|
||||
NLSMARTCAPWAP_CMD_BIND,
|
||||
NLSMARTCAPWAP_CMD_CONNECT,
|
||||
NLSMARTCAPWAP_CMD_RESET,
|
||||
|
||||
NLSMARTCAPWAP_CMD_SEND_KEEPALIVE,
|
||||
NLSMARTCAPWAP_CMD_RECV_KEEPALIVE,
|
||||
|
||||
NLSMARTCAPWAP_CMD_SEND_DATA,
|
||||
NLSMARTCAPWAP_CMD_RECV_DATA,
|
||||
|
||||
NLSMARTCAPWAP_CMD_JOIN_MAC80211_DEVICE,
|
||||
NLSMARTCAPWAP_CMD_LEAVE_MAC80211_DEVICE,
|
||||
|
||||
/* Last command */
|
||||
__NLSMARTCAPWAP_CMD_AFTER_LAST,
|
||||
NLSMARTCAPWAP_CMD_MAX = __NLSMARTCAPWAP_CMD_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
#endif /* __WTP_NLSMARTCAPWAP_HEADER__ */
|
||||
#ifndef __WTP_NLSMARTCAPWAP_HEADER__
|
||||
#define __WTP_NLSMARTCAPWAP_HEADER__
|
||||
|
||||
/* */
|
||||
#define NLSMARTCAPWAP_GENL_NAME "smartcapwap_wtp"
|
||||
|
||||
/* */
|
||||
#define NLSMARTCAPWAP_FLAGS_TUNNEL_8023 0x00000001
|
||||
|
||||
/* */
|
||||
enum nlsmartcapwap_attrs {
|
||||
NLSMARTCAPWAP_ATTR_UNSPEC,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_IFINDEX,
|
||||
NLSMARTCAPWAP_ATTR_RADIOID,
|
||||
NLSMARTCAPWAP_ATTR_WLANID,
|
||||
NLSMARTCAPWAP_ATTR_BINDING,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_FLAGS,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_MGMT_SUBTYPE_MASK,
|
||||
NLSMARTCAPWAP_ATTR_CTRL_SUBTYPE_MASK,
|
||||
NLSMARTCAPWAP_ATTR_DATA_SUBTYPE_MASK,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_ADDRESS,
|
||||
NLSMARTCAPWAP_ATTR_MTU,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_SESSION_ID,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_DTLS,
|
||||
|
||||
NLSMARTCAPWAP_ATTR_DATA_FRAME,
|
||||
NLSMARTCAPWAP_ATTR_RSSI,
|
||||
NLSMARTCAPWAP_ATTR_SNR,
|
||||
NLSMARTCAPWAP_ATTR_RATE,
|
||||
|
||||
/* Last attribute */
|
||||
__NLSMARTCAPWAP_ATTR_AFTER_LAST,
|
||||
NLSMARTCAPWAP_ATTR_MAX = __NLSMARTCAPWAP_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/* */
|
||||
enum nlsmartcapwap_commands {
|
||||
NLSMARTCAPWAP_CMD_UNSPEC,
|
||||
|
||||
NLSMARTCAPWAP_CMD_LINK,
|
||||
|
||||
NLSMARTCAPWAP_CMD_BIND,
|
||||
NLSMARTCAPWAP_CMD_CONNECT,
|
||||
NLSMARTCAPWAP_CMD_RESET,
|
||||
|
||||
NLSMARTCAPWAP_CMD_SEND_KEEPALIVE,
|
||||
NLSMARTCAPWAP_CMD_RECV_KEEPALIVE,
|
||||
|
||||
NLSMARTCAPWAP_CMD_SEND_DATA,
|
||||
NLSMARTCAPWAP_CMD_RECV_DATA,
|
||||
|
||||
NLSMARTCAPWAP_CMD_JOIN_MAC80211_DEVICE,
|
||||
NLSMARTCAPWAP_CMD_LEAVE_MAC80211_DEVICE,
|
||||
|
||||
/* Last command */
|
||||
__NLSMARTCAPWAP_CMD_AFTER_LAST,
|
||||
NLSMARTCAPWAP_CMD_MAX = __NLSMARTCAPWAP_CMD_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
#endif /* __WTP_NLSMARTCAPWAP_HEADER__ */
|
||||
|
@ -1,227 +1,227 @@
|
||||
#include "config.h"
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/net.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/udp.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/udp.h>
|
||||
#include "socket.h"
|
||||
#include "capwap.h"
|
||||
|
||||
/* Socket */
|
||||
#define SOCKET_COUNT 2
|
||||
static struct socket* sc_sockets[SOCKET_COUNT];
|
||||
|
||||
/* */
|
||||
int sc_socket_recvpacket(struct sock* sk, struct sk_buff* skb) {
|
||||
TRACEKMOD("### sc_socket_recvpacket\n");
|
||||
|
||||
/* */
|
||||
CAPWAP_SKB_CB(skb)->flags = SKB_CAPWAP_FLAG_FROM_DATA_CHANNEL;
|
||||
|
||||
/* */
|
||||
sc_capwap_recvpacket(skb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* */
|
||||
static int sc_socket_create(int type, union capwap_addr* sockaddr, uint16_t protocol) {
|
||||
int ret;
|
||||
|
||||
TRACEKMOD("### sc_socket_create\n");
|
||||
|
||||
/* Create socket */
|
||||
ret = sock_create_kern(sockaddr->ss.ss_family, SOCK_DGRAM, protocol, &sc_sockets[type]);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Bind to interface */
|
||||
ret = kernel_bind(sc_sockets[type], &sockaddr->sa, sizeof(union capwap_addr));
|
||||
if (ret) {
|
||||
goto failure;
|
||||
}
|
||||
|
||||
/* Set callback */
|
||||
udp_sk(sc_sockets[type]->sk)->encap_type = 1;
|
||||
udp_sk(sc_sockets[type]->sk)->encap_rcv = sc_socket_recvpacket;
|
||||
|
||||
/* */
|
||||
if (!((sockaddr->ss.ss_family == AF_INET) ? sockaddr->sin.sin_port : sockaddr->sin6.sin6_port)) {
|
||||
union capwap_addr localaddr;
|
||||
int localaddrsize = sizeof(union capwap_addr);
|
||||
|
||||
/* Retrieve port */
|
||||
ret = kernel_getsockname(sc_sockets[type], &localaddr.sa, &localaddrsize);
|
||||
if (ret) {
|
||||
goto failure;
|
||||
}
|
||||
|
||||
/* */
|
||||
if ((sockaddr->ss.ss_family == AF_INET) && (localaddr.ss.ss_family == AF_INET)) {
|
||||
sockaddr->sin.sin_port = localaddr.sin.sin_port;
|
||||
} else if ((sockaddr->ss.ss_family == AF_INET6) && (localaddr.ss.ss_family == AF_INET6)) {
|
||||
sockaddr->sin6.sin6_port = localaddr.sin6.sin6_port;
|
||||
} else {
|
||||
ret = -EFAULT;
|
||||
goto failure;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
failure:
|
||||
sock_release(sc_sockets[type]);
|
||||
sc_sockets[type] = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_socket_getpeeraddr(struct sk_buff* skb, union capwap_addr* peeraddr) {
|
||||
unsigned char* nethdr;
|
||||
|
||||
TRACEKMOD("### sc_socket_getpeeraddr\n");
|
||||
|
||||
/* */
|
||||
nethdr = skb_network_header(skb);
|
||||
if (!nethdr) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* */
|
||||
switch (ntohs(skb->protocol)) {
|
||||
case ETH_P_IP: {
|
||||
/* Validate IPv4 header */
|
||||
if ((nethdr[0] & 0xf0) != 0x40) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Retrieve address */
|
||||
peeraddr->sin.sin_family = AF_INET;
|
||||
peeraddr->sin.sin_addr.s_addr = ((struct iphdr*)nethdr)->saddr;
|
||||
peeraddr->sin.sin_port = udp_hdr(skb)->source;
|
||||
break;
|
||||
}
|
||||
|
||||
case ETH_P_IPV6: {
|
||||
/* Validate IPv6 header */
|
||||
if ((nethdr[0] & 0xf0) != 0x60) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Retrieve address */
|
||||
peeraddr->sin6.sin6_family = AF_INET6;
|
||||
memcpy(&peeraddr->sin6.sin6_addr, &((struct ipv6hdr*)nethdr)->saddr, sizeof(struct in6_addr));
|
||||
peeraddr->sin6.sin6_port = udp_hdr(skb)->source;
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_socket_send(int type, uint8_t* buffer, int length, union capwap_addr* sockaddr) {
|
||||
struct kvec vec;
|
||||
struct msghdr msg;
|
||||
|
||||
TRACEKMOD("### sc_socket_send\n");
|
||||
|
||||
/* */
|
||||
vec.iov_base = buffer;
|
||||
vec.iov_len = length;
|
||||
|
||||
/* */
|
||||
memset(&msg, 0, sizeof(struct msghdr));
|
||||
msg.msg_name = sockaddr;
|
||||
msg.msg_namelen = sizeof(union capwap_addr);
|
||||
msg.msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT;
|
||||
|
||||
/* */
|
||||
return kernel_sendmsg(sc_sockets[type], &msg, &vec, 1, length);
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_socket_init(void) {
|
||||
TRACEKMOD("### sc_socket_init\n");
|
||||
|
||||
memset(sc_sockets, 0, sizeof(sc_sockets));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_socket_bind(union capwap_addr* sockaddr) {
|
||||
int ret;
|
||||
|
||||
TRACEKMOD("### sc_socket_bind\n");
|
||||
|
||||
/* */
|
||||
if (sc_sockets[SOCKET_UDP] || sc_sockets[SOCKET_UDPLITE]) {
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/* UDP socket */
|
||||
ret = sc_socket_create(SOCKET_UDP, sockaddr, IPPROTO_UDP);
|
||||
if (ret) {
|
||||
goto failure;
|
||||
}
|
||||
|
||||
/* UDPLite socket */
|
||||
ret = sc_socket_create(SOCKET_UDPLITE, sockaddr, IPPROTO_UDPLITE);
|
||||
if (ret) {
|
||||
goto failure;
|
||||
}
|
||||
|
||||
/* */
|
||||
udp_encap_enable();
|
||||
if (sockaddr->ss.ss_family == AF_INET6) {
|
||||
udpv6_encap_enable();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
failure:
|
||||
sc_socket_close();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_socket_close(void) {
|
||||
TRACEKMOD("### sc_socket_close\n");
|
||||
|
||||
/* Close sockets */
|
||||
if (sc_sockets[SOCKET_UDP]) {
|
||||
kernel_sock_shutdown(sc_sockets[SOCKET_UDP], SHUT_RDWR);
|
||||
sock_release(sc_sockets[SOCKET_UDP]);
|
||||
}
|
||||
|
||||
if (sc_sockets[SOCKET_UDPLITE]) {
|
||||
kernel_sock_shutdown(sc_sockets[SOCKET_UDPLITE], SHUT_RDWR);
|
||||
sock_release(sc_sockets[SOCKET_UDPLITE]);
|
||||
}
|
||||
|
||||
memset(sc_sockets, 0, sizeof(sc_sockets));
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_addr_compare(const union capwap_addr* addr1, const union capwap_addr* addr2) {
|
||||
TRACEKMOD("### sc_addr_compare\n");
|
||||
|
||||
if (addr1->ss.ss_family == addr2->ss.ss_family) {
|
||||
if (addr1->ss.ss_family == AF_INET) {
|
||||
return (((addr1->sin.sin_addr.s_addr == addr2->sin.sin_addr.s_addr) && (addr1->sin.sin_port == addr2->sin.sin_port)) ? 0 : -1);
|
||||
} else if (addr1->ss.ss_family == AF_INET6) {
|
||||
return ((!memcmp(&addr1->sin6.sin6_addr, &addr2->sin6.sin6_addr, sizeof(struct in6_addr)) && (addr1->sin6.sin6_port == addr2->sin6.sin6_port)) ? 0 : -1);
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
#include "config.h"
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/net.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/udp.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/udp.h>
|
||||
#include "socket.h"
|
||||
#include "capwap.h"
|
||||
|
||||
/* Socket */
|
||||
#define SOCKET_COUNT 2
|
||||
static struct socket* sc_sockets[SOCKET_COUNT];
|
||||
|
||||
/* */
|
||||
int sc_socket_recvpacket(struct sock* sk, struct sk_buff* skb) {
|
||||
TRACEKMOD("### sc_socket_recvpacket\n");
|
||||
|
||||
/* */
|
||||
CAPWAP_SKB_CB(skb)->flags = SKB_CAPWAP_FLAG_FROM_DATA_CHANNEL;
|
||||
|
||||
/* */
|
||||
sc_capwap_recvpacket(skb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* */
|
||||
static int sc_socket_create(int type, union capwap_addr* sockaddr, uint16_t protocol) {
|
||||
int ret;
|
||||
|
||||
TRACEKMOD("### sc_socket_create\n");
|
||||
|
||||
/* Create socket */
|
||||
ret = sock_create_kern(sockaddr->ss.ss_family, SOCK_DGRAM, protocol, &sc_sockets[type]);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Bind to interface */
|
||||
ret = kernel_bind(sc_sockets[type], &sockaddr->sa, sizeof(union capwap_addr));
|
||||
if (ret) {
|
||||
goto failure;
|
||||
}
|
||||
|
||||
/* Set callback */
|
||||
udp_sk(sc_sockets[type]->sk)->encap_type = 1;
|
||||
udp_sk(sc_sockets[type]->sk)->encap_rcv = sc_socket_recvpacket;
|
||||
|
||||
/* */
|
||||
if (!((sockaddr->ss.ss_family == AF_INET) ? sockaddr->sin.sin_port : sockaddr->sin6.sin6_port)) {
|
||||
union capwap_addr localaddr;
|
||||
int localaddrsize = sizeof(union capwap_addr);
|
||||
|
||||
/* Retrieve port */
|
||||
ret = kernel_getsockname(sc_sockets[type], &localaddr.sa, &localaddrsize);
|
||||
if (ret) {
|
||||
goto failure;
|
||||
}
|
||||
|
||||
/* */
|
||||
if ((sockaddr->ss.ss_family == AF_INET) && (localaddr.ss.ss_family == AF_INET)) {
|
||||
sockaddr->sin.sin_port = localaddr.sin.sin_port;
|
||||
} else if ((sockaddr->ss.ss_family == AF_INET6) && (localaddr.ss.ss_family == AF_INET6)) {
|
||||
sockaddr->sin6.sin6_port = localaddr.sin6.sin6_port;
|
||||
} else {
|
||||
ret = -EFAULT;
|
||||
goto failure;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
failure:
|
||||
sock_release(sc_sockets[type]);
|
||||
sc_sockets[type] = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_socket_getpeeraddr(struct sk_buff* skb, union capwap_addr* peeraddr) {
|
||||
unsigned char* nethdr;
|
||||
|
||||
TRACEKMOD("### sc_socket_getpeeraddr\n");
|
||||
|
||||
/* */
|
||||
nethdr = skb_network_header(skb);
|
||||
if (!nethdr) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* */
|
||||
switch (ntohs(skb->protocol)) {
|
||||
case ETH_P_IP: {
|
||||
/* Validate IPv4 header */
|
||||
if ((nethdr[0] & 0xf0) != 0x40) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Retrieve address */
|
||||
peeraddr->sin.sin_family = AF_INET;
|
||||
peeraddr->sin.sin_addr.s_addr = ((struct iphdr*)nethdr)->saddr;
|
||||
peeraddr->sin.sin_port = udp_hdr(skb)->source;
|
||||
break;
|
||||
}
|
||||
|
||||
case ETH_P_IPV6: {
|
||||
/* Validate IPv6 header */
|
||||
if ((nethdr[0] & 0xf0) != 0x60) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Retrieve address */
|
||||
peeraddr->sin6.sin6_family = AF_INET6;
|
||||
memcpy(&peeraddr->sin6.sin6_addr, &((struct ipv6hdr*)nethdr)->saddr, sizeof(struct in6_addr));
|
||||
peeraddr->sin6.sin6_port = udp_hdr(skb)->source;
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_socket_send(int type, uint8_t* buffer, int length, union capwap_addr* sockaddr) {
|
||||
struct kvec vec;
|
||||
struct msghdr msg;
|
||||
|
||||
TRACEKMOD("### sc_socket_send\n");
|
||||
|
||||
/* */
|
||||
vec.iov_base = buffer;
|
||||
vec.iov_len = length;
|
||||
|
||||
/* */
|
||||
memset(&msg, 0, sizeof(struct msghdr));
|
||||
msg.msg_name = sockaddr;
|
||||
msg.msg_namelen = sizeof(union capwap_addr);
|
||||
msg.msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT;
|
||||
|
||||
/* */
|
||||
return kernel_sendmsg(sc_sockets[type], &msg, &vec, 1, length);
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_socket_init(void) {
|
||||
TRACEKMOD("### sc_socket_init\n");
|
||||
|
||||
memset(sc_sockets, 0, sizeof(sc_sockets));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_socket_bind(union capwap_addr* sockaddr) {
|
||||
int ret;
|
||||
|
||||
TRACEKMOD("### sc_socket_bind\n");
|
||||
|
||||
/* */
|
||||
if (sc_sockets[SOCKET_UDP] || sc_sockets[SOCKET_UDPLITE]) {
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/* UDP socket */
|
||||
ret = sc_socket_create(SOCKET_UDP, sockaddr, IPPROTO_UDP);
|
||||
if (ret) {
|
||||
goto failure;
|
||||
}
|
||||
|
||||
/* UDPLite socket */
|
||||
ret = sc_socket_create(SOCKET_UDPLITE, sockaddr, IPPROTO_UDPLITE);
|
||||
if (ret) {
|
||||
goto failure;
|
||||
}
|
||||
|
||||
/* */
|
||||
udp_encap_enable();
|
||||
if (sockaddr->ss.ss_family == AF_INET6) {
|
||||
udpv6_encap_enable();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
failure:
|
||||
sc_socket_close();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* */
|
||||
void sc_socket_close(void) {
|
||||
TRACEKMOD("### sc_socket_close\n");
|
||||
|
||||
/* Close sockets */
|
||||
if (sc_sockets[SOCKET_UDP]) {
|
||||
kernel_sock_shutdown(sc_sockets[SOCKET_UDP], SHUT_RDWR);
|
||||
sock_release(sc_sockets[SOCKET_UDP]);
|
||||
}
|
||||
|
||||
if (sc_sockets[SOCKET_UDPLITE]) {
|
||||
kernel_sock_shutdown(sc_sockets[SOCKET_UDPLITE], SHUT_RDWR);
|
||||
sock_release(sc_sockets[SOCKET_UDPLITE]);
|
||||
}
|
||||
|
||||
memset(sc_sockets, 0, sizeof(sc_sockets));
|
||||
}
|
||||
|
||||
/* */
|
||||
int sc_addr_compare(const union capwap_addr* addr1, const union capwap_addr* addr2) {
|
||||
TRACEKMOD("### sc_addr_compare\n");
|
||||
|
||||
if (addr1->ss.ss_family == addr2->ss.ss_family) {
|
||||
if (addr1->ss.ss_family == AF_INET) {
|
||||
return (((addr1->sin.sin_addr.s_addr == addr2->sin.sin_addr.s_addr) && (addr1->sin.sin_port == addr2->sin.sin_port)) ? 0 : -1);
|
||||
} else if (addr1->ss.ss_family == AF_INET6) {
|
||||
return ((!memcmp(&addr1->sin6.sin6_addr, &addr2->sin6.sin6_addr, sizeof(struct in6_addr)) && (addr1->sin6.sin6_port == addr2->sin6.sin6_port)) ? 0 : -1);
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -1,35 +1,35 @@
|
||||
#ifndef __KMOD_SOCKET_HEADER__
|
||||
#define __KMOD_SOCKET_HEADER__
|
||||
|
||||
#include <linux/socket.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/in6.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
/* */
|
||||
#define SOCKET_UDP 0
|
||||
#define SOCKET_UDPLITE 1
|
||||
|
||||
/* Universal socket address */
|
||||
union capwap_addr {
|
||||
struct sockaddr sa;
|
||||
struct sockaddr_in sin;
|
||||
struct sockaddr_in6 sin6;
|
||||
struct sockaddr_storage ss;
|
||||
};
|
||||
|
||||
/* */
|
||||
int sc_socket_init(void);
|
||||
void sc_socket_close(void);
|
||||
|
||||
/* */
|
||||
int sc_socket_bind(union capwap_addr* sockaddr);
|
||||
int sc_socket_send(int type, uint8_t* buffer, int length, union capwap_addr* sockaddr);
|
||||
|
||||
/* */
|
||||
int sc_socket_getpeeraddr(struct sk_buff* skb, union capwap_addr* peeraddr);
|
||||
|
||||
/* */
|
||||
int sc_addr_compare(const union capwap_addr* addr1, const union capwap_addr* addr2);
|
||||
|
||||
#endif /* __KMOD_SOCKET_HEADER__ */
|
||||
#ifndef __KMOD_SOCKET_HEADER__
|
||||
#define __KMOD_SOCKET_HEADER__
|
||||
|
||||
#include <linux/socket.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/in6.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
/* */
|
||||
#define SOCKET_UDP 0
|
||||
#define SOCKET_UDPLITE 1
|
||||
|
||||
/* Universal socket address */
|
||||
union capwap_addr {
|
||||
struct sockaddr sa;
|
||||
struct sockaddr_in sin;
|
||||
struct sockaddr_in6 sin6;
|
||||
struct sockaddr_storage ss;
|
||||
};
|
||||
|
||||
/* */
|
||||
int sc_socket_init(void);
|
||||
void sc_socket_close(void);
|
||||
|
||||
/* */
|
||||
int sc_socket_bind(union capwap_addr* sockaddr);
|
||||
int sc_socket_send(int type, uint8_t* buffer, int length, union capwap_addr* sockaddr);
|
||||
|
||||
/* */
|
||||
int sc_socket_getpeeraddr(struct sk_buff* skb, union capwap_addr* peeraddr);
|
||||
|
||||
/* */
|
||||
int sc_addr_compare(const union capwap_addr* addr1, const union capwap_addr* addr2);
|
||||
|
||||
#endif /* __KMOD_SOCKET_HEADER__ */
|
||||
|
@ -1,65 +1,65 @@
|
||||
#include "wtp.h"
|
||||
#include "wtp_radio.h"
|
||||
|
||||
/* */
|
||||
void wtp_create_radioopsstate_element(struct capwap_packet_txmng* txmngpacket) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < g_wtp.radios->count; i++) {
|
||||
struct wtp_radio* radio = (struct wtp_radio*)capwap_array_get_item_pointer(g_wtp.radios, i);
|
||||
struct capwap_radiooprstate_element radiooprstate;
|
||||
|
||||
radiooprstate.radioid = radio->radioid;
|
||||
radiooprstate.state = ((radio->status == WTP_RADIO_ENABLED) ? CAPWAP_RADIO_OPERATIONAL_STATE_ENABLED : CAPWAP_RADIO_OPERATIONAL_STATE_DISABLED);
|
||||
|
||||
if (radio->status == WTP_RADIO_ENABLED) {
|
||||
radiooprstate.cause = CAPWAP_RADIO_OPERATIONAL_CAUSE_NORMAL;
|
||||
} else if (radio->status == WTP_RADIO_DISABLED) {
|
||||
radiooprstate.cause = CAPWAP_RADIO_OPERATIONAL_CAUSE_ADMINSET;
|
||||
} else if (radio->status == WTP_RADIO_HWFAILURE) {
|
||||
radiooprstate.cause = CAPWAP_RADIO_OPERATIONAL_CAUSE_RADIOFAILURE;
|
||||
} else if (radio->status == WTP_RADIO_SWFAILURE) {
|
||||
radiooprstate.cause = CAPWAP_RADIO_OPERATIONAL_CAUSE_SOFTWAREFAILURE;
|
||||
} else {
|
||||
/* Unknown value */
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RADIOOPRSTATE, &radiooprstate);
|
||||
}
|
||||
}
|
||||
|
||||
/* */
|
||||
void wtp_create_radioadmstate_element(struct capwap_packet_txmng* txmngpacket) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < g_wtp.radios->count; i++) {
|
||||
struct wtp_radio* radio = (struct wtp_radio*)capwap_array_get_item_pointer(g_wtp.radios, i);
|
||||
struct capwap_radioadmstate_element radioadmstate;
|
||||
|
||||
radioadmstate.radioid = radio->radioid;
|
||||
radioadmstate.state = ((radio->status == WTP_RADIO_DISABLED) ? CAPWAP_RADIO_ADMIN_STATE_DISABLED : CAPWAP_RADIO_ADMIN_STATE_ENABLED);
|
||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RADIOADMSTATE, &radioadmstate);
|
||||
}
|
||||
}
|
||||
|
||||
/* */
|
||||
void wtp_create_80211_wtpradioinformation_element(struct capwap_packet_txmng* txmngpacket) {
|
||||
int i;
|
||||
struct wtp_radio* radio;
|
||||
struct capwap_80211_wtpradioinformation_element element;
|
||||
|
||||
for (i = 0; i < g_wtp.radios->count; i++) {
|
||||
radio = (struct wtp_radio*)capwap_array_get_item_pointer(g_wtp.radios, i);
|
||||
|
||||
/* Set message element */
|
||||
if (radio->status == WTP_RADIO_ENABLED) {
|
||||
memcpy(&element, &radio->radioinformation, sizeof(struct capwap_80211_wtpradioinformation_element));
|
||||
} else {
|
||||
memset(&element, 0, sizeof(struct capwap_80211_wtpradioinformation_element));
|
||||
element.radioid = radio->radioid;
|
||||
}
|
||||
|
||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION, &element);
|
||||
}
|
||||
}
|
||||
#include "wtp.h"
|
||||
#include "wtp_radio.h"
|
||||
|
||||
/* */
|
||||
void wtp_create_radioopsstate_element(struct capwap_packet_txmng* txmngpacket) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < g_wtp.radios->count; i++) {
|
||||
struct wtp_radio* radio = (struct wtp_radio*)capwap_array_get_item_pointer(g_wtp.radios, i);
|
||||
struct capwap_radiooprstate_element radiooprstate;
|
||||
|
||||
radiooprstate.radioid = radio->radioid;
|
||||
radiooprstate.state = ((radio->status == WTP_RADIO_ENABLED) ? CAPWAP_RADIO_OPERATIONAL_STATE_ENABLED : CAPWAP_RADIO_OPERATIONAL_STATE_DISABLED);
|
||||
|
||||
if (radio->status == WTP_RADIO_ENABLED) {
|
||||
radiooprstate.cause = CAPWAP_RADIO_OPERATIONAL_CAUSE_NORMAL;
|
||||
} else if (radio->status == WTP_RADIO_DISABLED) {
|
||||
radiooprstate.cause = CAPWAP_RADIO_OPERATIONAL_CAUSE_ADMINSET;
|
||||
} else if (radio->status == WTP_RADIO_HWFAILURE) {
|
||||
radiooprstate.cause = CAPWAP_RADIO_OPERATIONAL_CAUSE_RADIOFAILURE;
|
||||
} else if (radio->status == WTP_RADIO_SWFAILURE) {
|
||||
radiooprstate.cause = CAPWAP_RADIO_OPERATIONAL_CAUSE_SOFTWAREFAILURE;
|
||||
} else {
|
||||
/* Unknown value */
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RADIOOPRSTATE, &radiooprstate);
|
||||
}
|
||||
}
|
||||
|
||||
/* */
|
||||
void wtp_create_radioadmstate_element(struct capwap_packet_txmng* txmngpacket) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < g_wtp.radios->count; i++) {
|
||||
struct wtp_radio* radio = (struct wtp_radio*)capwap_array_get_item_pointer(g_wtp.radios, i);
|
||||
struct capwap_radioadmstate_element radioadmstate;
|
||||
|
||||
radioadmstate.radioid = radio->radioid;
|
||||
radioadmstate.state = ((radio->status == WTP_RADIO_DISABLED) ? CAPWAP_RADIO_ADMIN_STATE_DISABLED : CAPWAP_RADIO_ADMIN_STATE_ENABLED);
|
||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RADIOADMSTATE, &radioadmstate);
|
||||
}
|
||||
}
|
||||
|
||||
/* */
|
||||
void wtp_create_80211_wtpradioinformation_element(struct capwap_packet_txmng* txmngpacket) {
|
||||
int i;
|
||||
struct wtp_radio* radio;
|
||||
struct capwap_80211_wtpradioinformation_element element;
|
||||
|
||||
for (i = 0; i < g_wtp.radios->count; i++) {
|
||||
radio = (struct wtp_radio*)capwap_array_get_item_pointer(g_wtp.radios, i);
|
||||
|
||||
/* Set message element */
|
||||
if (radio->status == WTP_RADIO_ENABLED) {
|
||||
memcpy(&element, &radio->radioinformation, sizeof(struct capwap_80211_wtpradioinformation_element));
|
||||
} else {
|
||||
memset(&element, 0, sizeof(struct capwap_80211_wtpradioinformation_element));
|
||||
element.radioid = radio->radioid;
|
||||
}
|
||||
|
||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION, &element);
|
||||
}
|
||||
}
|
||||
|
1182
src/wtp/wtp_kmod.c
1182
src/wtp/wtp_kmod.c
File diff suppressed because it is too large
Load Diff
@ -1,65 +1,65 @@
|
||||
#ifndef __WTP_KMOD_HEADER__
|
||||
#define __WTP_KMOD_HEADER__
|
||||
|
||||
#include "wifi_drivers.h"
|
||||
|
||||
/* */
|
||||
#ifdef HAVE_LIBNL_10
|
||||
#define nl_sock nl_handle
|
||||
#endif
|
||||
|
||||
/* */
|
||||
#define WTP_KMOD_FLAGS_TUNNEL_NATIVE 0x00000000
|
||||
#define WTP_KMOD_FLAGS_TUNNEL_8023 0x00000001
|
||||
|
||||
/* */
|
||||
struct wtp_kmod_iface_handle {
|
||||
uint32_t flags;
|
||||
struct wifi_wlan* wlan;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wtp_kmod_handle {
|
||||
struct nl_sock* nl;
|
||||
int nl_fd;
|
||||
struct nl_cb* nl_cb;
|
||||
int nlsmartcapwap_id;
|
||||
|
||||
/* */
|
||||
struct nl_sock* nlmsg;
|
||||
struct nl_cb* nlmsg_cb;
|
||||
|
||||
/* */
|
||||
struct capwap_list* interfaces;
|
||||
};
|
||||
|
||||
/* */
|
||||
#define WTP_KMOD_EVENT_MAX_ITEMS 2
|
||||
struct wtp_kmod_event {
|
||||
void (*event_handler)(int fd, void** params, int paramscount);
|
||||
int paramscount;
|
||||
void* params[WTP_KMOD_EVENT_MAX_ITEMS];
|
||||
};
|
||||
|
||||
/* */
|
||||
int wtp_kmod_init(void);
|
||||
void wtp_kmod_free(void);
|
||||
|
||||
/* */
|
||||
int wtp_kmod_isconnected(void);
|
||||
int wtp_kmod_getfd(struct pollfd* fds, struct wtp_kmod_event* events, int count);
|
||||
|
||||
/* */
|
||||
int wtp_kmod_bind(uint16_t family);
|
||||
int wtp_kmod_connect(struct sockaddr_storage* sockaddr, struct capwap_sessionid_element* sessionid, uint16_t mtu);
|
||||
int wtp_kmod_resetsession(void);
|
||||
|
||||
/* */
|
||||
int wtp_kmod_send_keepalive(void);
|
||||
int wtp_kmod_send_data(uint8_t radioid, const uint8_t* frame, int length, uint8_t rssi, uint8_t snr, uint16_t rate);
|
||||
|
||||
/* */
|
||||
int wtp_kmod_join_mac80211_device(struct wifi_wlan* wlan, uint32_t flags);
|
||||
int wtp_kmod_leave_mac80211_device(struct wifi_wlan* wlan);
|
||||
|
||||
#endif /* __WTP_KMOD_HEADER__ */
|
||||
#ifndef __WTP_KMOD_HEADER__
|
||||
#define __WTP_KMOD_HEADER__
|
||||
|
||||
#include "wifi_drivers.h"
|
||||
|
||||
/* */
|
||||
#ifdef HAVE_LIBNL_10
|
||||
#define nl_sock nl_handle
|
||||
#endif
|
||||
|
||||
/* */
|
||||
#define WTP_KMOD_FLAGS_TUNNEL_NATIVE 0x00000000
|
||||
#define WTP_KMOD_FLAGS_TUNNEL_8023 0x00000001
|
||||
|
||||
/* */
|
||||
struct wtp_kmod_iface_handle {
|
||||
uint32_t flags;
|
||||
struct wifi_wlan* wlan;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wtp_kmod_handle {
|
||||
struct nl_sock* nl;
|
||||
int nl_fd;
|
||||
struct nl_cb* nl_cb;
|
||||
int nlsmartcapwap_id;
|
||||
|
||||
/* */
|
||||
struct nl_sock* nlmsg;
|
||||
struct nl_cb* nlmsg_cb;
|
||||
|
||||
/* */
|
||||
struct capwap_list* interfaces;
|
||||
};
|
||||
|
||||
/* */
|
||||
#define WTP_KMOD_EVENT_MAX_ITEMS 2
|
||||
struct wtp_kmod_event {
|
||||
void (*event_handler)(int fd, void** params, int paramscount);
|
||||
int paramscount;
|
||||
void* params[WTP_KMOD_EVENT_MAX_ITEMS];
|
||||
};
|
||||
|
||||
/* */
|
||||
int wtp_kmod_init(void);
|
||||
void wtp_kmod_free(void);
|
||||
|
||||
/* */
|
||||
int wtp_kmod_isconnected(void);
|
||||
int wtp_kmod_getfd(struct pollfd* fds, struct wtp_kmod_event* events, int count);
|
||||
|
||||
/* */
|
||||
int wtp_kmod_bind(uint16_t family);
|
||||
int wtp_kmod_connect(struct sockaddr_storage* sockaddr, struct capwap_sessionid_element* sessionid, uint16_t mtu);
|
||||
int wtp_kmod_resetsession(void);
|
||||
|
||||
/* */
|
||||
int wtp_kmod_send_keepalive(void);
|
||||
int wtp_kmod_send_data(uint8_t radioid, const uint8_t* frame, int length, uint8_t rssi, uint8_t snr, uint16_t rate);
|
||||
|
||||
/* */
|
||||
int wtp_kmod_join_mac80211_device(struct wifi_wlan* wlan, uint32_t flags);
|
||||
int wtp_kmod_leave_mac80211_device(struct wifi_wlan* wlan);
|
||||
|
||||
#endif /* __WTP_KMOD_HEADER__ */
|
||||
|
1578
src/wtp/wtp_radio.c
1578
src/wtp/wtp_radio.c
File diff suppressed because it is too large
Load Diff
@ -1,90 +1,90 @@
|
||||
#ifndef __WTP_RADIO_HEADER__
|
||||
#define __WTP_RADIO_HEADER__
|
||||
|
||||
#include "ieee80211.h"
|
||||
|
||||
/* */
|
||||
#define WTP_RADIO_ENABLED 0
|
||||
#define WTP_RADIO_DISABLED 1
|
||||
#define WTP_RADIO_HWFAILURE 2
|
||||
#define WTP_RADIO_SWFAILURE 3
|
||||
|
||||
/* */
|
||||
#define WTP_RADIO_ACL_HASH_SIZE 64
|
||||
|
||||
#define WTP_RADIO_ACL_STATION_ALLOW 0
|
||||
#define WTP_RADIO_ACL_STATION_DENY 1
|
||||
|
||||
/* */
|
||||
#define WTP_PREFIX_NAME_MAX_LENGTH (IFNAMSIZ - 6)
|
||||
#define WTP_PREFIX_DEFAULT_NAME "ap"
|
||||
|
||||
struct wtp_radio_wlan {
|
||||
uint8_t wlanid;
|
||||
struct wifi_wlan* wlanhandle;
|
||||
struct wtp_radio* radio;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wtp_radio_wlanpool {
|
||||
struct wifi_wlan* wlanhandle;
|
||||
struct wtp_radio* radio;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wtp_radio {
|
||||
uint8_t radioid;
|
||||
char device[IFNAMSIZ];
|
||||
struct wifi_device* devicehandle;
|
||||
|
||||
char wlanprefix[IFNAMSIZ];
|
||||
struct capwap_list* wlan;
|
||||
struct capwap_list* wlanpool;
|
||||
|
||||
int status;
|
||||
struct capwap_80211_antenna_element antenna;
|
||||
struct capwap_80211_directsequencecontrol_element directsequencecontrol;
|
||||
struct capwap_80211_macoperation_element macoperation;
|
||||
struct capwap_80211_multidomaincapability_element multidomaincapability;
|
||||
struct capwap_80211_ofdmcontrol_element ofdmcontrol;
|
||||
struct capwap_80211_rateset_element rateset;
|
||||
struct capwap_80211_supportedrates_element supportedrates;
|
||||
struct capwap_80211_txpower_element txpower;
|
||||
struct capwap_80211_txpowerlevel_element txpowerlevel;
|
||||
struct capwap_80211_wtpradioconf_element radioconfig;
|
||||
struct capwap_80211_wtpradioinformation_element radioinformation;
|
||||
struct capwap_80211_wtpqos_element qos;
|
||||
};
|
||||
|
||||
/* */
|
||||
void wtp_radio_init(void);
|
||||
void wtp_radio_close(void);
|
||||
void wtp_radio_free(void);
|
||||
|
||||
/* */
|
||||
struct wtp_radio* wtp_radio_create_phy(void);
|
||||
struct wtp_radio* wtp_radio_get_phy(uint8_t radioid);
|
||||
struct wtp_radio_wlan* wtp_radio_get_wlan(struct wtp_radio* radio, uint8_t wlanid);
|
||||
struct wtp_radio_wlan* wtp_radio_search_wlan(struct wtp_radio* radio, const uint8_t* bssid);
|
||||
|
||||
/* */
|
||||
void wtp_radio_receive_data_packet(uint8_t radioid, unsigned short binding, const uint8_t* frame, int length);
|
||||
|
||||
/* */
|
||||
int wtp_radio_setconfiguration(struct capwap_parsed_packet* packet);
|
||||
|
||||
/* */
|
||||
uint32_t wtp_radio_create_wlan(struct capwap_parsed_packet* packet, struct capwap_80211_assignbssid_element* bssid);
|
||||
uint32_t wtp_radio_update_wlan(struct capwap_parsed_packet* packet);
|
||||
uint32_t wtp_radio_delete_wlan(struct capwap_parsed_packet* packet);
|
||||
|
||||
/* */
|
||||
uint32_t wtp_radio_add_station(struct capwap_parsed_packet* packet);
|
||||
uint32_t wtp_radio_delete_station(struct capwap_parsed_packet* packet);
|
||||
|
||||
/* Station ACL */
|
||||
int wtp_radio_acl_station(const uint8_t* macaddress);
|
||||
void wtp_radio_acl_addstation(const uint8_t* macaddress);
|
||||
void wtp_radio_acl_deletestation(const uint8_t* macaddress);
|
||||
|
||||
#endif /* __WTP_RADIO_HEADER__ */
|
||||
#ifndef __WTP_RADIO_HEADER__
|
||||
#define __WTP_RADIO_HEADER__
|
||||
|
||||
#include "ieee80211.h"
|
||||
|
||||
/* */
|
||||
#define WTP_RADIO_ENABLED 0
|
||||
#define WTP_RADIO_DISABLED 1
|
||||
#define WTP_RADIO_HWFAILURE 2
|
||||
#define WTP_RADIO_SWFAILURE 3
|
||||
|
||||
/* */
|
||||
#define WTP_RADIO_ACL_HASH_SIZE 64
|
||||
|
||||
#define WTP_RADIO_ACL_STATION_ALLOW 0
|
||||
#define WTP_RADIO_ACL_STATION_DENY 1
|
||||
|
||||
/* */
|
||||
#define WTP_PREFIX_NAME_MAX_LENGTH (IFNAMSIZ - 6)
|
||||
#define WTP_PREFIX_DEFAULT_NAME "ap"
|
||||
|
||||
struct wtp_radio_wlan {
|
||||
uint8_t wlanid;
|
||||
struct wifi_wlan* wlanhandle;
|
||||
struct wtp_radio* radio;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wtp_radio_wlanpool {
|
||||
struct wifi_wlan* wlanhandle;
|
||||
struct wtp_radio* radio;
|
||||
};
|
||||
|
||||
/* */
|
||||
struct wtp_radio {
|
||||
uint8_t radioid;
|
||||
char device[IFNAMSIZ];
|
||||
struct wifi_device* devicehandle;
|
||||
|
||||
char wlanprefix[IFNAMSIZ];
|
||||
struct capwap_list* wlan;
|
||||
struct capwap_list* wlanpool;
|
||||
|
||||
int status;
|
||||
struct capwap_80211_antenna_element antenna;
|
||||
struct capwap_80211_directsequencecontrol_element directsequencecontrol;
|
||||
struct capwap_80211_macoperation_element macoperation;
|
||||
struct capwap_80211_multidomaincapability_element multidomaincapability;
|
||||
struct capwap_80211_ofdmcontrol_element ofdmcontrol;
|
||||
struct capwap_80211_rateset_element rateset;
|
||||
struct capwap_80211_supportedrates_element supportedrates;
|
||||
struct capwap_80211_txpower_element txpower;
|
||||
struct capwap_80211_txpowerlevel_element txpowerlevel;
|
||||
struct capwap_80211_wtpradioconf_element radioconfig;
|
||||
struct capwap_80211_wtpradioinformation_element radioinformation;
|
||||
struct capwap_80211_wtpqos_element qos;
|
||||
};
|
||||
|
||||
/* */
|
||||
void wtp_radio_init(void);
|
||||
void wtp_radio_close(void);
|
||||
void wtp_radio_free(void);
|
||||
|
||||
/* */
|
||||
struct wtp_radio* wtp_radio_create_phy(void);
|
||||
struct wtp_radio* wtp_radio_get_phy(uint8_t radioid);
|
||||
struct wtp_radio_wlan* wtp_radio_get_wlan(struct wtp_radio* radio, uint8_t wlanid);
|
||||
struct wtp_radio_wlan* wtp_radio_search_wlan(struct wtp_radio* radio, const uint8_t* bssid);
|
||||
|
||||
/* */
|
||||
void wtp_radio_receive_data_packet(uint8_t radioid, unsigned short binding, const uint8_t* frame, int length);
|
||||
|
||||
/* */
|
||||
int wtp_radio_setconfiguration(struct capwap_parsed_packet* packet);
|
||||
|
||||
/* */
|
||||
uint32_t wtp_radio_create_wlan(struct capwap_parsed_packet* packet, struct capwap_80211_assignbssid_element* bssid);
|
||||
uint32_t wtp_radio_update_wlan(struct capwap_parsed_packet* packet);
|
||||
uint32_t wtp_radio_delete_wlan(struct capwap_parsed_packet* packet);
|
||||
|
||||
/* */
|
||||
uint32_t wtp_radio_add_station(struct capwap_parsed_packet* packet);
|
||||
uint32_t wtp_radio_delete_station(struct capwap_parsed_packet* packet);
|
||||
|
||||
/* Station ACL */
|
||||
int wtp_radio_acl_station(const uint8_t* macaddress);
|
||||
void wtp_radio_acl_addstation(const uint8_t* macaddress);
|
||||
void wtp_radio_acl_deletestation(const uint8_t* macaddress);
|
||||
|
||||
#endif /* __WTP_RADIO_HEADER__ */
|
||||
|
Reference in New Issue
Block a user