Added ACL of stations

This commit is contained in:
vemax78 2014-01-18 19:13:10 +01:00
parent 9dbd940a00
commit 254ef26ed6
4 changed files with 68 additions and 8 deletions

View File

@ -317,6 +317,7 @@ static void nl80211_do_mgmt_probe_request_event(struct nl80211_wlan_handle* wlan
/* */ /* */
static void nl80211_do_mgmt_authentication_event(struct nl80211_wlan_handle* wlanhandle, const struct ieee80211_header_mgmt* mgmt, int mgmtlength) { static void nl80211_do_mgmt_authentication_event(struct nl80211_wlan_handle* wlanhandle, const struct ieee80211_header_mgmt* mgmt, int mgmtlength) {
int acl;
int ielength; int ielength;
struct ieee80211_ie_items ieitems; struct ieee80211_ie_items ieitems;
int responselength; int responselength;
@ -327,6 +328,17 @@ static void nl80211_do_mgmt_authentication_event(struct nl80211_wlan_handle* wla
struct ieee80211_authentication_params ieee80211_params; struct ieee80211_authentication_params ieee80211_params;
struct wlan_send_frame_params wlan_params; struct wlan_send_frame_params wlan_params;
/* Ignore authentication packet from same AP */
if (!memcmp(mgmt->sa, wlanhandle->address, ETH_ALEN)) {
return;
}
/* Get ACL Station */
acl = wtp_radio_acl_station(mgmt->sa);
if (acl == WTP_RADIO_ACL_STATION_DENY) {
return;
}
/* Information Elements packet length */ /* Information Elements packet length */
ielength = mgmtlength - (sizeof(struct ieee80211_header) + sizeof(mgmt->authetication)); ielength = mgmtlength - (sizeof(struct ieee80211_header) + sizeof(mgmt->authetication));
if (ielength < 0) { if (ielength < 0) {
@ -338,14 +350,6 @@ static void nl80211_do_mgmt_authentication_event(struct nl80211_wlan_handle* wla
return; return;
} }
/* Ignore authentication packet from same AP */
if (!memcmp(mgmt->sa, wlanhandle->address, ETH_ALEN)) {
return;
}
/* ACL Station */
/* TODO */
/* Create station reference */ /* Create station reference */
/* TODO */ /* TODO */

View File

@ -140,6 +140,10 @@ struct wtp_t {
struct wifi_event* events; struct wifi_event* events;
int eventscount; int eventscount;
/* Radio ACL */
int defaultaclstations;
struct capwap_hash* aclstations;
/* Dtls */ /* Dtls */
int enabledtls; int enabledtls;
unsigned char dtlsdatapolicy; unsigned char dtlsdatapolicy;

View File

@ -1,4 +1,5 @@
#include "wtp.h" #include "wtp.h"
#include "capwap_hash.h"
#include "wtp_radio.h" #include "wtp_radio.h"
/* */ /* */
@ -48,9 +49,21 @@ static void wtp_radio_destroy_wlan(struct wtp_radio_wlan* wlan) {
memset(wlan, 0, sizeof(struct wtp_radio_wlan)); memset(wlan, 0, sizeof(struct wtp_radio_wlan));
} }
/* */
unsigned long wtp_radio_acl_item_gethash(const void* key, unsigned long keysize, unsigned long hashsize) {
uint8_t* macaddress = (uint8_t*)key;
ASSERT(keysize == ETH_ALEN);
return ((macaddress[3] ^ macaddress[4] ^ macaddress[5]) >> 2);
}
/* */ /* */
void wtp_radio_init(void) { void wtp_radio_init(void) {
g_wtp.radios = capwap_array_create(sizeof(struct wtp_radio), 0, 1); g_wtp.radios = capwap_array_create(sizeof(struct wtp_radio), 0, 1);
g_wtp.defaultaclstations = WTP_RADIO_ACL_STATION_ALLOW;
g_wtp.aclstations = capwap_hash_create(WTP_RADIO_ACL_HASH_SIZE, WTP_RADIO_ACL_KEY_SIZE, wtp_radio_acl_item_gethash, NULL, NULL);
} }
/* */ /* */
@ -88,6 +101,7 @@ void wtp_radio_free(void) {
} }
capwap_array_free(g_wtp.radios); capwap_array_free(g_wtp.radios);
capwap_hash_free(g_wtp.aclstations);
} }
/* */ /* */
@ -560,3 +574,29 @@ uint32_t wtp_radio_delete_wlan(struct capwap_parsed_packet* packet) {
/* TODO */ /* TODO */
return CAPWAP_RESULTCODE_SUCCESS; return CAPWAP_RESULTCODE_SUCCESS;
} }
/* */
int wtp_radio_acl_station(const uint8_t* macaddress) {
ASSERT(macaddress != NULL);
/* Check if exist ACL for station */
if (capwap_hash_hasitem(g_wtp.aclstations, macaddress)) {
return ((g_wtp.defaultaclstations == WTP_RADIO_ACL_STATION_ALLOW) ? WTP_RADIO_ACL_STATION_DENY : WTP_RADIO_ACL_STATION_ALLOW);
}
/* Default ACL station */
return g_wtp.defaultaclstations;
}
/* */
void wtp_radio_acl_addstation(const uint8_t* macaddress) {
ASSERT(macaddress != NULL);
capwap_hash_add(g_wtp.aclstations, macaddress, NULL);
}
void wtp_radio_acl_deletestation(const uint8_t* macaddress) {
ASSERT(macaddress != NULL);
capwap_hash_delete(g_wtp.aclstations, macaddress);
}

View File

@ -9,6 +9,13 @@
#define WTP_RADIO_HWFAILURE 2 #define WTP_RADIO_HWFAILURE 2
#define WTP_RADIO_SWFAILURE 3 #define WTP_RADIO_SWFAILURE 3
/* */
#define WTP_RADIO_ACL_HASH_SIZE 64
#define WTP_RADIO_ACL_KEY_SIZE ETH_ALEN
#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_NAME_MAX_LENGTH (IFNAMSIZ - 6)
#define WTP_PREFIX_DEFAULT_NAME "ap" #define WTP_PREFIX_DEFAULT_NAME "ap"
@ -76,4 +83,9 @@ uint32_t wtp_radio_create_wlan(struct capwap_parsed_packet* packet, struct capwa
uint32_t wtp_radio_update_wlan(struct capwap_parsed_packet* packet); 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_delete_wlan(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__ */ #endif /* __WTP_RADIO_HEADER__ */