ap_config.h revision a54fa5fb807eaeff45464139b5a7759f060cec68
177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek/*
277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * hostapd / Configuration definitions and helpers functions
377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * Copyright (c) 2003-2012, Jouni Malinen <j@w1.fi>
477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek *
577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * This software may be distributed under the terms of the BSD license.
677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * See README for more details.
777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek */
877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#ifndef HOSTAPD_CONFIG_H
1077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define HOSTAPD_CONFIG_H
1177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
1277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#include "common/defs.h"
1377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#include "ip_addr.h"
1477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#include "common/wpa_common.h"
1577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#include "common/ieee802_11_common.h"
1677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#include "wps/wps.h"
1777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
1877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define MAX_STA_COUNT 2007
1977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define MAX_VLAN_ID 4094
2077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
2177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenektypedef u8 macaddr[ETH_ALEN];
2277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
2377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct mac_acl_entry {
2477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	macaddr addr;
2577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int vlan_id;
2677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
2777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
2877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_radius_servers;
2977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct ft_remote_r0kh;
3077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct ft_remote_r1kh;
3177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
3277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define HOSTAPD_MAX_SSID_LEN 32
3377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
3477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define NUM_WEP_KEYS 4
3577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_wep_keys {
3677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 idx;
3777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 *key[NUM_WEP_KEYS];
3877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	size_t len[NUM_WEP_KEYS];
3977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int keys_set;
4077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	size_t default_len; /* key length used for dynamic key generation */
4177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
4277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
4377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenektypedef enum hostap_security_policy {
4477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	SECURITY_PLAINTEXT = 0,
4577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	SECURITY_STATIC_WEP = 1,
4677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	SECURITY_IEEE_802_1X = 2,
4777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	SECURITY_WPA_PSK = 3,
4877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	SECURITY_WPA = 4
4977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek} secpolicy;
5077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
5177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_ssid {
5277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 ssid[HOSTAPD_MAX_SSID_LEN];
5377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	size_t ssid_len;
5477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	unsigned int ssid_set:1;
5577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	unsigned int utf8_ssid:1;
5677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
5777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char vlan[IFNAMSIZ + 1];
5877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	secpolicy security_policy;
5977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
6077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_wpa_psk *wpa_psk;
6177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *wpa_passphrase;
6277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *wpa_psk_file;
6377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
6477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_wep_keys wep;
6577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
6677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define DYNAMIC_VLAN_DISABLED 0
6777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define DYNAMIC_VLAN_OPTIONAL 1
6877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define DYNAMIC_VLAN_REQUIRED 2
6977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int dynamic_vlan;
7077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define DYNAMIC_VLAN_NAMING_WITHOUT_DEVICE 0
7177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define DYNAMIC_VLAN_NAMING_WITH_DEVICE 1
7277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define DYNAMIC_VLAN_NAMING_END 2
7377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int vlan_naming;
7477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#ifdef CONFIG_FULL_DYNAMIC_VLAN
7577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *vlan_tagged_interface;
7677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#endif /* CONFIG_FULL_DYNAMIC_VLAN */
7777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_wep_keys **dyn_vlan_keys;
7877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	size_t max_dyn_vlan_keys;
7977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
8077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
8177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
8277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define VLAN_ID_WILDCARD -1
8377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
8477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_vlan {
8577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_vlan *next;
8677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int vlan_id; /* VLAN ID or -1 (VLAN_ID_WILDCARD) for wildcard entry */
8777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char ifname[IFNAMSIZ + 1];
8877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int dynamic_vlan;
8977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#ifdef CONFIG_FULL_DYNAMIC_VLAN
9077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
9177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define DVLAN_CLEAN_BR 	0x1
9277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define DVLAN_CLEAN_VLAN	0x2
9377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define DVLAN_CLEAN_VLAN_PORT	0x4
9477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define DVLAN_CLEAN_WLAN_PORT	0x8
9577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int clean;
9677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#endif /* CONFIG_FULL_DYNAMIC_VLAN */
9777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
9877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
9977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define PMK_LEN 32
10077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_sta_wpa_psk_short {
10177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_sta_wpa_psk_short *next;
10277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 psk[PMK_LEN];
10377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
10477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
10577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_wpa_psk {
10677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_wpa_psk *next;
10777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int group;
10877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 psk[PMK_LEN];
10977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 addr[ETH_ALEN];
11077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
11177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
11277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_eap_user {
11377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_eap_user *next;
11477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 *identity;
11577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	size_t identity_len;
11677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct {
11777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		int vendor;
11877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		u32 method;
11977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	} methods[EAP_MAX_METHODS];
12077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 *password;
12177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	size_t password_len;
12277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int phase2;
12377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int force_version;
12477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	unsigned int wildcard_prefix:1;
12577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	unsigned int password_hash:1; /* whether password is hashed with
12677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek				       * nt_password_hash() */
12777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int ttls_auth; /* EAP_TTLS_AUTH_* bitfield */
12877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
12977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
13077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_radius_attr {
13177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 type;
13277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct wpabuf *val;
13377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_radius_attr *next;
13477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
13577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
13677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
13777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define NUM_TX_QUEUES 4
13877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
13977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_tx_queue_params {
14077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int aifs;
14177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int cwmin;
14277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int cwmax;
14377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int burst; /* maximum burst time in 0.1 ms, i.e., 10 = 1 ms */
14477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
14577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
14677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
14777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define MAX_ROAMING_CONSORTIUM_LEN 15
14877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
14977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_roaming_consortium {
15077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 len;
15177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 oi[MAX_ROAMING_CONSORTIUM_LEN];
15277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
15377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
15477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_lang_string {
15577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 lang[3];
15677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 name_len;
15777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 name[252];
15877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
15977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
16077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define MAX_NAI_REALMS 10
16177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define MAX_NAI_REALMLEN 255
16277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define MAX_NAI_EAP_METHODS 5
16377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#define MAX_NAI_AUTH_TYPES 4
16477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_nai_realm_data {
16577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 encoding;
16677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char realm_buf[MAX_NAI_REALMLEN + 1];
16777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *realm[MAX_NAI_REALMS];
16877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 eap_method_count;
16977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_nai_realm_eap {
17077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		u8 eap_method;
17177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		u8 num_auths;
17277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		u8 auth_id[MAX_NAI_AUTH_TYPES];
17377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		u8 auth_val[MAX_NAI_AUTH_TYPES];
17477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	} eap_method[MAX_NAI_EAP_METHODS];
17577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
17677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
17777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek/**
17877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * struct hostapd_bss_config - Per-BSS configuration
17977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek */
18077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct hostapd_bss_config {
18177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char iface[IFNAMSIZ + 1];
18277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char bridge[IFNAMSIZ + 1];
18377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char wds_bridge[IFNAMSIZ + 1];
18477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
18577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	enum hostapd_logger_level logger_syslog_level, logger_stdout_level;
18677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
18777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	unsigned int logger_syslog; /* module bitfield */
18877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	unsigned int logger_stdout; /* module bitfield */
18977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
19077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *dump_log_name; /* file name for state dump (SIGUSR1) */
19177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
19277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int max_num_sta; /* maximum number of STAs in station table */
19377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
19477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int dtim_period;
19577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
19677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int ieee802_1x; /* use IEEE 802.1X */
19777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int eapol_version;
19877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int eap_server; /* Use internal EAP server instead of external
19977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek			 * RADIUS server */
20077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_eap_user *eap_user;
20177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *eap_user_sqlite;
20277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *eap_sim_db;
20377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_ip_addr own_ip_addr;
20477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *nas_identifier;
20577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_radius_servers *radius;
20677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int acct_interim_interval;
20777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int radius_request_cui;
20877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_radius_attr *radius_auth_req_attr;
20977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_radius_attr *radius_acct_req_attr;
21077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int radius_das_port;
21177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	unsigned int radius_das_time_window;
21277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int radius_das_require_event_timestamp;
21377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_ip_addr radius_das_client_addr;
21477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 *radius_das_shared_secret;
21577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	size_t radius_das_shared_secret_len;
21677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
21777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_ssid ssid;
21877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
21977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *eap_req_id_text; /* optional displayable message sent with
22077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek				* EAP Request-Identity */
22177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	size_t eap_req_id_text_len;
22277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int eapol_key_index_workaround;
22377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
22477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	size_t default_wep_key_len;
22577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int individual_wep_key_len;
22677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wep_rekeying_period;
22777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int broadcast_key_idx_min, broadcast_key_idx_max;
22877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int eap_reauth_period;
22977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
23077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int ieee802_11f; /* use IEEE 802.11f (IAPP) */
23177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char iapp_iface[IFNAMSIZ + 1]; /* interface used with IAPP broadcast
23277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek					* frames */
23377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
23477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	enum {
23577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		ACCEPT_UNLESS_DENIED = 0,
23677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		DENY_UNLESS_ACCEPTED = 1,
23777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		USE_EXTERNAL_RADIUS_AUTH = 2
23877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	} macaddr_acl;
23977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct mac_acl_entry *accept_mac;
24077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int num_accept_mac;
24177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct mac_acl_entry *deny_mac;
24277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int num_deny_mac;
24377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wds_sta;
24477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int isolate;
24577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
24677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int auth_algs; /* bitfield of allowed IEEE 802.11 authentication
24777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek			* algorithms, WPA_AUTH_ALG_{OPEN,SHARED,LEAP} */
24877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
24977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wpa; /* bitfield of WPA_PROTO_WPA, WPA_PROTO_RSN */
25077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wpa_key_mgmt;
25177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#ifdef CONFIG_IEEE80211W
25277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	enum mfp_options ieee80211w;
25377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	/* dot11AssociationSAQueryMaximumTimeout (in TUs) */
25477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	unsigned int assoc_sa_query_max_timeout;
25577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	/* dot11AssociationSAQueryRetryTimeout (in TUs) */
25677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int assoc_sa_query_retry_timeout;
25777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#endif /* CONFIG_IEEE80211W */
25877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	enum {
25977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		PSK_RADIUS_IGNORED = 0,
26077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		PSK_RADIUS_ACCEPTED = 1,
26177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek		PSK_RADIUS_REQUIRED = 2
26277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	} wpa_psk_radius;
26377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wpa_pairwise;
26477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wpa_group;
26577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wpa_group_rekey;
26677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wpa_strict_rekey;
26777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wpa_gmk_rekey;
26877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wpa_ptk_rekey;
26977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int rsn_pairwise;
27077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int rsn_preauth;
27177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *rsn_preauth_interfaces;
27277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int peerkey;
27377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
27477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#ifdef CONFIG_IEEE80211R
27577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	/* IEEE 802.11r - Fast BSS Transition */
27677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 mobility_domain[MOBILITY_DOMAIN_ID_LEN];
27777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 r1_key_holder[FT_R1KH_ID_LEN];
27877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u32 r0_key_lifetime;
27977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u32 reassociation_deadline;
28077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct ft_remote_r0kh *r0kh_list;
28177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct ft_remote_r1kh *r1kh_list;
28277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int pmk_r1_push;
28377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int ft_over_ds;
28477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#endif /* CONFIG_IEEE80211R */
28577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
28677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *ctrl_interface; /* directory for UNIX domain sockets */
28777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#ifndef CONFIG_NATIVE_WINDOWS
28877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	gid_t ctrl_interface_gid;
28977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#endif /* CONFIG_NATIVE_WINDOWS */
29077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int ctrl_interface_gid_set;
29177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
29277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *ca_cert;
29377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *server_cert;
29477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *private_key;
29577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *private_key_passwd;
29677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int check_crl;
29777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *dh_file;
29877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 *pac_opaque_encr_key;
29977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u8 *eap_fast_a_id;
30077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	size_t eap_fast_a_id_len;
30177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *eap_fast_a_id_info;
30277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int eap_fast_prov;
30377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int pac_key_lifetime;
30477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int pac_key_refresh_time;
30577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int eap_sim_aka_result_ind;
30677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int tnc;
30777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int fragment_size;
30877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u16 pwd_group;
30977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
31077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *radius_server_clients;
31177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int radius_server_auth_port;
31277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int radius_server_ipv6;
31377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
31477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	char *test_socket; /* UNIX domain socket path for driver_test */
31577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
31677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int use_pae_group_addr; /* Whether to send EAPOL frames to PAE group
31777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek				 * address instead of individual address
31877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek				 * (for driver_wired.c).
31977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek				 */
32077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
32177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int ap_max_inactivity;
32277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int ignore_broadcast_ssid;
32377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
32477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wmm_enabled;
32577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int wmm_uapsd;
32677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
32777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	struct hostapd_vlan *vlan, *vlan_tail;
32877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
32977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	macaddr bssid;
33077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
33177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	/*
33277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	 * Maximum listen interval that STAs can use when associating with this
33377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	 * BSS. If a STA tries to use larger value, the association will be
33477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	 * denied with status code 51.
33577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	 */
33677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	u16 max_listen_interval;
33777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
33877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek	int disable_pmksa_caching;
339	int okc; /* Opportunistic Key Caching */
340
341	int wps_state;
342#ifdef CONFIG_WPS
343	int ap_setup_locked;
344	u8 uuid[16];
345	char *wps_pin_requests;
346	char *device_name;
347	char *manufacturer;
348	char *model_name;
349	char *model_number;
350	char *serial_number;
351	u8 device_type[WPS_DEV_TYPE_LEN];
352	char *config_methods;
353	u8 os_version[4];
354	char *ap_pin;
355	int skip_cred_build;
356	u8 *extra_cred;
357	size_t extra_cred_len;
358	int wps_cred_processing;
359	u8 *ap_settings;
360	size_t ap_settings_len;
361	char *upnp_iface;
362	char *friendly_name;
363	char *manufacturer_url;
364	char *model_description;
365	char *model_url;
366	char *upc;
367	struct wpabuf *wps_vendor_ext[MAX_WPS_VENDOR_EXTENSIONS];
368	int wps_nfc_dev_pw_id;
369	struct wpabuf *wps_nfc_dh_pubkey;
370	struct wpabuf *wps_nfc_dh_privkey;
371	struct wpabuf *wps_nfc_dev_pw;
372#endif /* CONFIG_WPS */
373	int pbc_in_m1;
374
375#define P2P_ENABLED BIT(0)
376#define P2P_GROUP_OWNER BIT(1)
377#define P2P_GROUP_FORMATION BIT(2)
378#define P2P_MANAGE BIT(3)
379#define P2P_ALLOW_CROSS_CONNECTION BIT(4)
380	int p2p;
381
382	int disassoc_low_ack;
383	int skip_inactivity_poll;
384
385#define TDLS_PROHIBIT BIT(0)
386#define TDLS_PROHIBIT_CHAN_SWITCH BIT(1)
387	int tdls;
388	int disable_11n;
389	int disable_11ac;
390
391	/* IEEE 802.11v */
392	int time_advertisement;
393	char *time_zone;
394	int wnm_sleep_mode;
395	int bss_transition;
396
397	/* IEEE 802.11u - Interworking */
398	int interworking;
399	int access_network_type;
400	int internet;
401	int asra;
402	int esr;
403	int uesa;
404	int venue_info_set;
405	u8 venue_group;
406	u8 venue_type;
407	u8 hessid[ETH_ALEN];
408
409	/* IEEE 802.11u - Roaming Consortium list */
410	unsigned int roaming_consortium_count;
411	struct hostapd_roaming_consortium *roaming_consortium;
412
413	/* IEEE 802.11u - Venue Name duples */
414	unsigned int venue_name_count;
415	struct hostapd_lang_string *venue_name;
416
417	/* IEEE 802.11u - Network Authentication Type */
418	u8 *network_auth_type;
419	size_t network_auth_type_len;
420
421	/* IEEE 802.11u - IP Address Type Availability */
422	u8 ipaddr_type_availability;
423	u8 ipaddr_type_configured;
424
425	/* IEEE 802.11u - 3GPP Cellular Network */
426	u8 *anqp_3gpp_cell_net;
427	size_t anqp_3gpp_cell_net_len;
428
429	/* IEEE 802.11u - Domain Name */
430	u8 *domain_name;
431	size_t domain_name_len;
432
433	unsigned int nai_realm_count;
434	struct hostapd_nai_realm_data *nai_realm_data;
435
436	u16 gas_comeback_delay;
437	int gas_frag_limit;
438
439#ifdef CONFIG_HS20
440	int hs20;
441	int disable_dgaf;
442	unsigned int hs20_oper_friendly_name_count;
443	struct hostapd_lang_string *hs20_oper_friendly_name;
444	u8 *hs20_wan_metrics;
445	u8 *hs20_connection_capability;
446	size_t hs20_connection_capability_len;
447	u8 *hs20_operating_class;
448	u8 hs20_operating_class_len;
449#endif /* CONFIG_HS20 */
450
451	u8 wps_rf_bands; /* RF bands for WPS (WPS_RF_*) */
452
453#ifdef CONFIG_RADIUS_TEST
454	char *dump_msk_file;
455#endif /* CONFIG_RADIUS_TEST */
456
457	struct wpabuf *vendor_elements;
458
459	unsigned int sae_anti_clogging_threshold;
460	int *sae_groups;
461};
462
463
464/**
465 * struct hostapd_config - Per-radio interface configuration
466 */
467struct hostapd_config {
468	struct hostapd_bss_config *bss, *last_bss;
469	size_t num_bss;
470
471	u16 beacon_int;
472	int rts_threshold;
473	int fragm_threshold;
474	u8 send_probe_response;
475	u8 channel;
476	enum hostapd_hw_mode hw_mode; /* HOSTAPD_MODE_IEEE80211A, .. */
477	enum {
478		LONG_PREAMBLE = 0,
479		SHORT_PREAMBLE = 1
480	} preamble;
481
482	int *supported_rates;
483	int *basic_rates;
484
485	const struct wpa_driver_ops *driver;
486
487	int ap_table_max_size;
488	int ap_table_expiration_time;
489
490	char country[3]; /* first two octets: country code as described in
491			  * ISO/IEC 3166-1. Third octet:
492			  * ' ' (ascii 32): all environments
493			  * 'O': Outdoor environemnt only
494			  * 'I': Indoor environment only
495			  */
496
497	int ieee80211d;
498
499	struct hostapd_tx_queue_params tx_queue[NUM_TX_QUEUES];
500
501	/*
502	 * WMM AC parameters, in same order as 802.1D, i.e.
503	 * 0 = BE (best effort)
504	 * 1 = BK (background)
505	 * 2 = VI (video)
506	 * 3 = VO (voice)
507	 */
508	struct hostapd_wmm_ac_params wmm_ac_params[4];
509
510	int ht_op_mode_fixed;
511	u16 ht_capab;
512	int ieee80211n;
513	int secondary_channel;
514	int require_ht;
515	u32 vht_capab;
516	int ieee80211ac;
517	int require_vht;
518	u8 vht_oper_chwidth;
519	u8 vht_oper_centr_freq_seg0_idx;
520	u8 vht_oper_centr_freq_seg1_idx;
521};
522
523
524int hostapd_mac_comp(const void *a, const void *b);
525int hostapd_mac_comp_empty(const void *a);
526struct hostapd_config * hostapd_config_defaults(void);
527void hostapd_config_defaults_bss(struct hostapd_bss_config *bss);
528void hostapd_config_free(struct hostapd_config *conf);
529int hostapd_maclist_found(struct mac_acl_entry *list, int num_entries,
530			  const u8 *addr, int *vlan_id);
531int hostapd_rate_found(int *list, int rate);
532int hostapd_wep_key_cmp(struct hostapd_wep_keys *a,
533			struct hostapd_wep_keys *b);
534const u8 * hostapd_get_psk(const struct hostapd_bss_config *conf,
535			   const u8 *addr, const u8 *prev_psk);
536int hostapd_setup_wpa_psk(struct hostapd_bss_config *conf);
537const char * hostapd_get_vlan_id_ifname(struct hostapd_vlan *vlan,
538					int vlan_id);
539struct hostapd_radius_attr *
540hostapd_config_get_radius_attr(struct hostapd_radius_attr *attr, u8 type);
541
542#endif /* HOSTAPD_CONFIG_H */
543