diff --git a/README.md b/README.md
index dd7bf2f..351b846 100644
--- a/README.md
+++ b/README.md
@@ -14,14 +14,14 @@
This is a pure Realtek release, not from vendor but from all the Realtek multichip "bases"
we've seen, this must be the newest, most stable and effective one.
-The performance and code quality has been improved and thats about time.
+The performance and code quality has been improved.
# HowTo build/install
1. You will need to blacklist another driver in order to use this one instead of the kernel provided.
We included a "realtek_blacklist.conf" file in the folder:
2. "cp realtek_blacklist.conf /etc/modprobe.d/"
3. "make && make install"
-4. "rmmod 8188eu && insmod 8188eu.ko"
+4. Reboot in order to blacklist and load the new module.
# MONITOR MODE howto
Use these steps to enter monitor mode.
@@ -61,12 +61,6 @@ unmanaged-devices=mac:A7:A7:A7:A7:A7
* Finish up the elimination of the wrapper _rtw_memset.
I didn't have more time after "rtw_beamforming.c"
-* Check code with checkpatch.pl (found in "tools")
-
-* There is a bug in monitor mode related to Network-Manager.
- This needs priority because it causes interferrence.
-
* Add more VID/PIDS for all 3 chipsets supported.
-* Remove unused functions
-
-more tba..
+
+
diff --git a/control_ap.sh b/control_ap.sh
deleted file mode 100755
index 72d3c02..0000000
--- a/control_ap.sh
+++ /dev/null
@@ -1,162 +0,0 @@
-#!/bin/sh
-# Script to start/stop a hostapd-based access point
-#
-# Sample start call "control_ap start wlan0 eth0"
-# Stop with "control_ap stop"
-#
-
-case "$1" in
-start)
- if [ $# -ne 3 ]
- then
- echo "Usage: $0 start AP_iface NET_iface"
- exit 1
- fi
-;;
-stop)
- if [ $# -ne 1 ]
- then
- echo "Usage: $0 stop"
- exit 1
- fi
-;;
-*)
- echo "Usage:"
- echo "$0 start AP-iface net_iface"
- echo "or"
- echo "$0 stop"
- exit 1
- ;;
-esac
-
-# Symbols for needed programs
-
-IPTABLES=/sbin/iptables
-IFCONFIG=/sbin/ifconfig
-DHCPD=/usr/sbin/dhcpd
-HOSTAPD=$(pwd)/hostapd-0.8/hostapd/hostapd
-
-# Symbols for AP and external interfaces
-
-NET_AP=$2
-NET_EXT=$3
-
-# First 3 octets of IP address for the AP
-
-AP_ADDR=192.168.0
-
-# IP address for nameserver
-
-NAME_SERVER=8.8.8.8
-
-# AP Channel, SSID, Encryption method, driver, and Encryption secret
-
-AP_CHANNEL=11
-AP_SSID=rtwap
-WPA_SECRET="12345678"
-ENCRYPT_MODE=2
-DRIVER=rtl871xdrv
-
-case "$1" in
-start)
- echo "Starting AP mode for $NET_AP at address $AP_ADDR.1"
- # Disable packet forwarding
- echo 0 > /proc/sys/net/ipv4/ip_forward
- # Stop any existing hostapd and dhcpd daemons
- killall -q hostapd
- killall -q dhcpd
- #Set up forwarding
- $IPTABLES -t nat -A POSTROUTING -o $NET_EXT -j MASQUERADE
- $IPTABLES -A FORWARD -i $NET_EXT -o $NET_AP -m state \
- --state RELATED,ESTABLISHED -j ACCEPT
- $IPTABLES -A FORWARD -i $NET_AP -o $NET_EXT -j ACCEPT
- # Get the AP interface in the right state
- $IFCONFIG $NET_AP down
- $IFCONFIG $NET_AP up
- $IFCONFIG $NET_AP $AP_ADDR.1
- # dhcpd needs to have a leases file available - create it if needed
- if [ ! -f /var/lib/dhcp/db/dhcpd.leases ]; then
- mkdir -p /var/lib/dhcp/db
- touch /var/lib/dhcp/db/dhcpd.leases
- fi
- # Write the DHCP server configuration file
- echo "option domain-name-servers $NAME_SERVER;" > ~/dhcpd.conf
- echo "default-lease-time 600;" >> ~/dhcpd.conf
- echo "max-lease-time 7200;" >> ~/dhcpd.conf
- echo "ddns-update-style none; ddns-updates off;" >> ~/dhcpd.conf
- echo "subnet $AP_ADDR.0 netmask 255.255.255.0 {" >> ~/dhcpd.conf
- echo " range $AP_ADDR.200 $AP_ADDR.229;" >> ~/dhcpd.conf
- echo " option subnet-mask 255.255.255.0;" >> ~/dhcpd.conf
- echo " option broadcast-address $AP_ADDR.255;" >> ~/dhcpd.conf
- echo " option routers $AP_ADDR.1;" >> ~/dhcpd.conf
- echo "}" >> ~/dhcpd.conf
- # Bring up the DHCP server
- $DHCPD -cf ~/dhcpd.conf $NET_AP
- # Write the hostapd configuration file
- cat > ~/hostapd.conf << EOF
-auth_algs=1
-beacon_int=100
-country_code=US
-ctrl_interface_group=0
-ctrl_interface=/var/run/hostapd
-dtim_period=2
-dump_file=/tmp/hostapd.dump
-fragm_threshold=2346
-#ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40][MAX-AMSDU-7935][DSSS_CCK-40]
-#ieee80211d=1
-ieee80211n=1
-ignore_broadcast_ssid=0
-logger_stdout=-1
-logger_stdout_level=2
-logger_syslog=-1
-logger_syslog_level=2
-macaddr_acl=0
-max_num_sta=255
-rts_threshold=2347
-wmm_ac_be_acm=0
-wmm_ac_be_aifs=3
-wmm_ac_be_cwmax=10
-wmm_ac_be_cwmin=4
-wmm_ac_be_txop_limit=0
-wmm_ac_bk_acm=0
-wmm_ac_bk_aifs=7
-wmm_ac_bk_cwmax=10
-wmm_ac_bk_cwmin=4
-wmm_ac_bk_txop_limit=0
-wmm_ac_vi_acm=0
-wmm_ac_vi_aifs=2
-wmm_ac_vi_cwmax=4
-wmm_ac_vi_cwmin=3
-wmm_ac_vi_txop_limit=94
-wmm_ac_vo_acm=0
-wmm_ac_vo_aifs=2
-wmm_ac_vo_cwmax=3
-wmm_ac_vo_cwmin=2
-wmm_ac_vo_txop_limit=47
-wmm_enabled=1
-EOF
- echo "interface=$NET_AP" >> ~/hostapd.conf
- echo "ssid=$AP_SSID" >> ~/hostapd.conf
- echo "driver=$DRIVER" >> ~/hostapd.conf
- echo "hw_mode=g" >> ~/hostapd.conf
- echo "channel=$AP_CHANNEL" >> ~/hostapd.conf
- echo "wpa=$ENCRYPT_MODE" >> ~/hostapd.conf
- echo "wpa_key_mgmt=WPA-PSK" >> ~/hostapd.conf
- echo "wpa_pairwise=TKIP CCMP" >> ~/hostapd.conf
- echo "rsn_pairwise=CCMP" >> ~/hostapd.conf
- echo "wpa_passphrase=$WPA_SECRET" >> ~/hostapd.conf
- # Enable packet forwarding
- echo 1 > /proc/sys/net/ipv4/ip_forward
- # Bring up hostapd
- $HOSTAPD -dd -B ~/hostapd.conf
- ;;
-stop)
- echo "Stopping AP mode"
- # Stop hostapd and dhcpd daemons
- killall hostapd
- killall dhcpd
- rm -f ~/hostapd.conf
- rm -f ~/dhcpd.conf
- ;;
-esac
-
diff --git a/hostapd-0.8/COPYING b/hostapd-0.8/COPYING
deleted file mode 100644
index 14f5453..0000000
--- a/hostapd-0.8/COPYING
+++ /dev/null
@@ -1,340 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C) 19yy
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) 19yy name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- , 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/hostapd-0.8/README b/hostapd-0.8/README
deleted file mode 100644
index 94ef1a7..0000000
--- a/hostapd-0.8/README
+++ /dev/null
@@ -1,72 +0,0 @@
-wpa_supplicant and hostapd
---------------------------
-
-Copyright (c) 2002-2011, Jouni Malinen and contributors
-All Rights Reserved.
-
-These programs are dual-licensed under both the GPL version 2 and BSD
-license (the one with advertisement clause removed). Either license
-may be used at your option.
-
-
-This package may include either wpa_supplicant, hostapd, or both. See
-README file respective subdirectories (wpa_supplicant/README or
-hostapd/README) for more details.
-
-Source code files were moved around in v0.6.x releases and compared to
-earlier releases, the programs are now built by first going to a
-subdirectory (wpa_supplicant or hostapd) and creating build
-configuration (.config) and running 'make' there (for Linux/BSD/cygwin
-builds).
-
-
-License
--------
-
-GPL v2:
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License version 2 as
-published by the Free Software Foundation.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-(this copy of the license is in COPYING file)
-
-
-Alternatively, this software may be distributed, used, and modified
-under the terms of BSD license:
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-3. Neither the name(s) of the above-listed copyright holder(s) nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/hostapd-0.8/hostapd/Android.mk b/hostapd-0.8/hostapd/Android.mk
deleted file mode 100644
index aa9d5ba..0000000
--- a/hostapd-0.8/hostapd/Android.mk
+++ /dev/null
@@ -1,816 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-WPA_BUILD_HOSTAPD := false
-ifneq ($(TARGET_SIMULATOR),true)
- ifneq ($(BOARD_HOSTAPD_DRIVER),)
- WPA_BUILD_HOSTAPD := true
- CONFIG_DRIVER_$(BOARD_HOSTAPD_DRIVER) := y
- endif
-endif
-
-include $(LOCAL_PATH)/.config
-
-# To ignore possible wrong network configurations
-L_CFLAGS = -DWPA_IGNORE_CONFIG_ERRORS
-
-# To force sizeof(enum) = 4
-ifeq ($(TARGET_ARCH),arm)
-L_CFLAGS += -mabi=aapcs-linux
-endif
-
-# To allow non-ASCII characters in SSID
-L_CFLAGS += -DWPA_UNICODE_SSID
-
-# OpenSSL is configured without engines on Android
-L_CFLAGS += -DOPENSSL_NO_ENGINE
-
-INCLUDES = $(LOCAL_PATH)
-INCLUDES += $(LOCAL_PATH)/src
-INCLUDES += $(LOCAL_PATH)/src/utils
-INCLUDES += external/openssl/include
-INCLUDES += frameworks/base/cmds/keystore
-ifdef CONFIG_DRIVER_NL80211
-INCLUDES += external/libnl_2/include
-endif
-
-
-ifndef CONFIG_OS
-ifdef CONFIG_NATIVE_WINDOWS
-CONFIG_OS=win32
-else
-CONFIG_OS=unix
-endif
-endif
-
-ifeq ($(CONFIG_OS), internal)
-L_CFLAGS += -DOS_NO_C_LIB_DEFINES
-endif
-
-ifdef CONFIG_NATIVE_WINDOWS
-L_CFLAGS += -DCONFIG_NATIVE_WINDOWS
-LIBS += -lws2_32
-endif
-
-OBJS = main.c
-OBJS += config_file.c
-
-OBJS += src/ap/hostapd.c
-OBJS += src/ap/wpa_auth_glue.c
-OBJS += src/ap/drv_callbacks.c
-OBJS += src/ap/ap_drv_ops.c
-OBJS += src/ap/utils.c
-OBJS += src/ap/authsrv.c
-OBJS += src/ap/ieee802_1x.c
-OBJS += src/ap/ap_config.c
-OBJS += src/ap/ieee802_11_auth.c
-OBJS += src/ap/sta_info.c
-OBJS += src/ap/wpa_auth.c
-OBJS += src/ap/tkip_countermeasures.c
-OBJS += src/ap/ap_mlme.c
-OBJS += src/ap/wpa_auth_ie.c
-OBJS += src/ap/preauth_auth.c
-OBJS += src/ap/pmksa_cache_auth.c
-OBJS_d =
-OBJS_p =
-LIBS =
-LIBS_c =
-HOBJS =
-LIBS_h =
-
-NEED_RC4=y
-NEED_AES=y
-NEED_MD5=y
-NEED_SHA1=y
-
-OBJS += src/drivers/drivers.c
-L_CFLAGS += -DHOSTAPD
-
-ifdef CONFIG_WPA_TRACE
-L_CFLAGS += -DWPA_TRACE
-OBJS += src/utils/trace.c
-HOBJS += src/utils/trace.c
-LDFLAGS += -rdynamic
-L_CFLAGS += -funwind-tables
-ifdef CONFIG_WPA_TRACE_BFD
-L_CFLAGS += -DWPA_TRACE_BFD
-LIBS += -lbfd
-LIBS_c += -lbfd
-LIBS_h += -lbfd
-endif
-endif
-
-OBJS += src/utils/eloop.c
-OBJS += src/utils/common.c
-OBJS += src/utils/wpa_debug.c
-OBJS += src/utils/wpabuf.c
-OBJS += src/utils/os_$(CONFIG_OS).c
-OBJS += src/utils/ip_addr.c
-
-OBJS += src/common/ieee802_11_common.c
-OBJS += src/common/wpa_common.c
-
-OBJS += src/eapol_auth/eapol_auth_sm.c
-
-
-ifndef CONFIG_NO_DUMP_STATE
-# define HOSTAPD_DUMP_STATE to include SIGUSR1 handler for dumping state to
-# a file (undefine it, if you want to save in binary size)
-L_CFLAGS += -DHOSTAPD_DUMP_STATE
-OBJS += dump_state.c
-OBJS += src/eapol_auth/eapol_auth_dump.c
-endif
-
-ifdef CONFIG_NO_RADIUS
-L_CFLAGS += -DCONFIG_NO_RADIUS
-CONFIG_NO_ACCOUNTING=y
-else
-OBJS += src/radius/radius.c
-OBJS += src/radius/radius_client.c
-endif
-
-ifdef CONFIG_NO_ACCOUNTING
-L_CFLAGS += -DCONFIG_NO_ACCOUNTING
-else
-OBJS += src/ap/accounting.c
-endif
-
-ifdef CONFIG_NO_VLAN
-L_CFLAGS += -DCONFIG_NO_VLAN
-else
-OBJS += src/ap/vlan_init.c
-endif
-
-ifdef CONFIG_NO_CTRL_IFACE
-L_CFLAGS += -DCONFIG_NO_CTRL_IFACE
-else
-OBJS += ctrl_iface.c
-OBJS += src/ap/ctrl_iface_ap.c
-endif
-
-OBJS += src/crypto/md5.c
-
-L_CFLAGS += -DCONFIG_CTRL_IFACE -DCONFIG_CTRL_IFACE_UNIX
-
-ifdef CONFIG_IAPP
-L_CFLAGS += -DCONFIG_IAPP
-OBJS += src/ap/iapp.c
-endif
-
-ifdef CONFIG_RSN_PREAUTH
-L_CFLAGS += -DCONFIG_RSN_PREAUTH
-CONFIG_L2_PACKET=y
-endif
-
-ifdef CONFIG_PEERKEY
-L_CFLAGS += -DCONFIG_PEERKEY
-OBJS += src/ap/peerkey_auth.c
-endif
-
-ifdef CONFIG_IEEE80211W
-L_CFLAGS += -DCONFIG_IEEE80211W
-NEED_SHA256=y
-NEED_AES_OMAC1=y
-endif
-
-ifdef CONFIG_IEEE80211R
-L_CFLAGS += -DCONFIG_IEEE80211R
-OBJS += src/ap/wpa_auth_ft.c
-NEED_SHA256=y
-NEED_AES_OMAC1=y
-NEED_AES_UNWRAP=y
-endif
-
-ifdef CONFIG_IEEE80211N
-L_CFLAGS += -DCONFIG_IEEE80211N
-endif
-
-include $(LOCAL_PATH)/src/drivers/drivers.mk
-
-OBJS += $(DRV_AP_OBJS)
-L_CFLAGS += $(DRV_AP_CFLAGS)
-LDFLAGS += $(DRV_AP_LDFLAGS)
-LIBS += $(DRV_AP_LIBS)
-
-ifdef CONFIG_L2_PACKET
-ifdef CONFIG_DNET_PCAP
-ifdef CONFIG_L2_FREEBSD
-LIBS += -lpcap
-OBJS += src/l2_packet/l2_packet_freebsd.c
-else
-LIBS += -ldnet -lpcap
-OBJS += src/l2_packet/l2_packet_pcap.c
-endif
-else
-OBJS += src/l2_packet/l2_packet_linux.c
-endif
-else
-OBJS += src/l2_packet/l2_packet_none.c
-endif
-
-
-ifdef CONFIG_EAP_MD5
-L_CFLAGS += -DEAP_SERVER_MD5
-OBJS += src/eap_server/eap_server_md5.c
-CHAP=y
-endif
-
-ifdef CONFIG_EAP_TLS
-L_CFLAGS += -DEAP_SERVER_TLS
-OBJS += src/eap_server/eap_server_tls.c
-TLS_FUNCS=y
-endif
-
-ifdef CONFIG_EAP_PEAP
-L_CFLAGS += -DEAP_SERVER_PEAP
-OBJS += src/eap_server/eap_server_peap.c
-OBJS += src/eap_common/eap_peap_common.c
-TLS_FUNCS=y
-CONFIG_EAP_MSCHAPV2=y
-endif
-
-ifdef CONFIG_EAP_TTLS
-L_CFLAGS += -DEAP_SERVER_TTLS
-OBJS += src/eap_server/eap_server_ttls.c
-TLS_FUNCS=y
-CHAP=y
-endif
-
-ifdef CONFIG_EAP_MSCHAPV2
-L_CFLAGS += -DEAP_SERVER_MSCHAPV2
-OBJS += src/eap_server/eap_server_mschapv2.c
-MS_FUNCS=y
-endif
-
-ifdef CONFIG_EAP_GTC
-L_CFLAGS += -DEAP_SERVER_GTC
-OBJS += src/eap_server/eap_server_gtc.c
-endif
-
-ifdef CONFIG_EAP_SIM
-L_CFLAGS += -DEAP_SERVER_SIM
-OBJS += src/eap_server/eap_server_sim.c
-CONFIG_EAP_SIM_COMMON=y
-NEED_AES_CBC=y
-endif
-
-ifdef CONFIG_EAP_AKA
-L_CFLAGS += -DEAP_SERVER_AKA
-OBJS += src/eap_server/eap_server_aka.c
-CONFIG_EAP_SIM_COMMON=y
-NEED_SHA256=y
-NEED_AES_CBC=y
-endif
-
-ifdef CONFIG_EAP_AKA_PRIME
-L_CFLAGS += -DEAP_SERVER_AKA_PRIME
-endif
-
-ifdef CONFIG_EAP_SIM_COMMON
-OBJS += src/eap_common/eap_sim_common.c
-# Example EAP-SIM/AKA interface for GSM/UMTS authentication. This can be
-# replaced with another file implementating the interface specified in
-# eap_sim_db.h.
-OBJS += src/eap_server/eap_sim_db.c
-NEED_FIPS186_2_PRF=y
-endif
-
-ifdef CONFIG_EAP_PAX
-L_CFLAGS += -DEAP_SERVER_PAX
-OBJS += src/eap_server/eap_server_pax.c src/eap_common/eap_pax_common.c
-endif
-
-ifdef CONFIG_EAP_PSK
-L_CFLAGS += -DEAP_SERVER_PSK
-OBJS += src/eap_server/eap_server_psk.c src/eap_common/eap_psk_common.c
-NEED_AES_OMAC1=y
-NEED_AES_ENCBLOCK=y
-NEED_AES_EAX=y
-endif
-
-ifdef CONFIG_EAP_SAKE
-L_CFLAGS += -DEAP_SERVER_SAKE
-OBJS += src/eap_server/eap_server_sake.c src/eap_common/eap_sake_common.c
-endif
-
-ifdef CONFIG_EAP_GPSK
-L_CFLAGS += -DEAP_SERVER_GPSK
-OBJS += src/eap_server/eap_server_gpsk.c src/eap_common/eap_gpsk_common.c
-ifdef CONFIG_EAP_GPSK_SHA256
-L_CFLAGS += -DEAP_SERVER_GPSK_SHA256
-endif
-NEED_SHA256=y
-NEED_AES_OMAC1=y
-endif
-
-ifdef CONFIG_EAP_PWD
-L_CFLAGS += -DEAP_SERVER_PWD
-OBJS += src/eap_server/eap_server_pwd.c src/eap_common/eap_pwd_common.c
-NEED_SHA256=y
-endif
-
-ifdef CONFIG_EAP_VENDOR_TEST
-L_CFLAGS += -DEAP_SERVER_VENDOR_TEST
-OBJS += src/eap_server/eap_server_vendor_test.c
-endif
-
-ifdef CONFIG_EAP_FAST
-L_CFLAGS += -DEAP_SERVER_FAST
-OBJS += src/eap_server/eap_server_fast.c
-OBJS += src/eap_common/eap_fast_common.c
-TLS_FUNCS=y
-NEED_T_PRF=y
-NEED_AES_UNWRAP=y
-endif
-
-ifdef CONFIG_WPS
-ifdef CONFIG_WPS2
-L_CFLAGS += -DCONFIG_WPS2
-endif
-
-L_CFLAGS += -DCONFIG_WPS -DEAP_SERVER_WSC
-OBJS += src/utils/uuid.c
-OBJS += src/ap/wps_hostapd.c
-OBJS += src/eap_server/eap_server_wsc.c src/eap_common/eap_wsc_common.c
-OBJS += src/wps/wps.c
-OBJS += src/wps/wps_common.c
-OBJS += src/wps/wps_attr_parse.c
-OBJS += src/wps/wps_attr_build.c
-OBJS += src/wps/wps_attr_process.c
-OBJS += src/wps/wps_dev_attr.c
-OBJS += src/wps/wps_enrollee.c
-OBJS += src/wps/wps_registrar.c
-NEED_DH_GROUPS=y
-NEED_SHA256=y
-NEED_BASE64=y
-NEED_AES_CBC=y
-NEED_MODEXP=y
-CONFIG_EAP=y
-
-ifdef CONFIG_WPS_UFD
-L_CFLAGS += -DCONFIG_WPS_UFD
-OBJS += src/wps/wps_ufd.c
-NEED_WPS_OOB=y
-endif
-
-ifdef CONFIG_WPS_NFC
-L_CFLAGS += -DCONFIG_WPS_NFC
-OBJS += src/wps/ndef.c
-OBJS += src/wps/wps_nfc.c
-NEED_WPS_OOB=y
-ifdef CONFIG_WPS_NFC_PN531
-PN531_PATH ?= /usr/local/src/nfc
-L_CFLAGS += -DCONFIG_WPS_NFC_PN531
-L_CFLAGS += -I${PN531_PATH}/inc
-OBJS += src/wps/wps_nfc_pn531.c
-LIBS += ${PN531_PATH}/lib/wpsnfc.dll
-LIBS += ${PN531_PATH}/lib/libnfc_mapping_pn53x.dll
-endif
-endif
-
-ifdef NEED_WPS_OOB
-L_CFLAGS += -DCONFIG_WPS_OOB
-endif
-
-ifdef CONFIG_WPS_UPNP
-L_CFLAGS += -DCONFIG_WPS_UPNP
-OBJS += src/wps/wps_upnp.c
-OBJS += src/wps/wps_upnp_ssdp.c
-OBJS += src/wps/wps_upnp_web.c
-OBJS += src/wps/wps_upnp_event.c
-OBJS += src/wps/wps_upnp_ap.c
-OBJS += src/wps/upnp_xml.c
-OBJS += src/wps/httpread.c
-OBJS += src/wps/http_client.c
-OBJS += src/wps/http_server.c
-endif
-
-ifdef CONFIG_WPS_STRICT
-L_CFLAGS += -DCONFIG_WPS_STRICT
-OBJS += src/wps/wps_validate.c
-endif
-
-ifdef CONFIG_WPS_TESTING
-L_CFLAGS += -DCONFIG_WPS_TESTING
-endif
-
-endif
-
-ifdef CONFIG_EAP_IKEV2
-L_CFLAGS += -DEAP_SERVER_IKEV2
-OBJS += src/eap_server/eap_server_ikev2.c src/eap_server/ikev2.c
-OBJS += src/eap_common/eap_ikev2_common.c src/eap_common/ikev2_common.c
-NEED_DH_GROUPS=y
-NEED_DH_GROUPS_ALL=y
-NEED_MODEXP=y
-NEED_CIPHER=y
-endif
-
-ifdef CONFIG_EAP_TNC
-L_CFLAGS += -DEAP_SERVER_TNC
-OBJS += src/eap_server/eap_server_tnc.c
-OBJS += src/eap_server/tncs.c
-NEED_BASE64=y
-ifndef CONFIG_DRIVER_BSD
-LIBS += -ldl
-endif
-endif
-
-# Basic EAP functionality is needed for EAPOL
-OBJS += eap_register.c
-OBJS += src/eap_server/eap_server.c
-OBJS += src/eap_common/eap_common.c
-OBJS += src/eap_server/eap_server_methods.c
-OBJS += src/eap_server/eap_server_identity.c
-L_CFLAGS += -DEAP_SERVER_IDENTITY
-
-ifdef CONFIG_EAP
-L_CFLAGS += -DEAP_SERVER
-endif
-
-ifdef CONFIG_PKCS12
-L_CFLAGS += -DPKCS12_FUNCS
-endif
-
-ifdef MS_FUNCS
-OBJS += src/crypto/ms_funcs.c
-NEED_DES=y
-NEED_MD4=y
-endif
-
-ifdef CHAP
-OBJS += src/eap_common/chap.c
-endif
-
-ifdef TLS_FUNCS
-NEED_DES=y
-# Shared TLS functions (needed for EAP_TLS, EAP_PEAP, and EAP_TTLS)
-L_CFLAGS += -DEAP_TLS_FUNCS
-OBJS += src/eap_server/eap_server_tls_common.c
-NEED_TLS_PRF=y
-endif
-
-ifndef CONFIG_TLS
-CONFIG_TLS=openssl
-endif
-
-ifeq ($(CONFIG_TLS), openssl)
-ifdef TLS_FUNCS
-OBJS += src/crypto/tls_openssl.c
-LIBS += -lssl
-endif
-OBJS += src/crypto/crypto_openssl.c
-HOBJS += src/crypto/crypto_openssl.c
-ifdef NEED_FIPS186_2_PRF
-OBJS += src/crypto/fips_prf_openssl.c
-endif
-LIBS += -lcrypto
-LIBS_h += -lcrypto
-endif
-
-ifeq ($(CONFIG_TLS), gnutls)
-ifdef TLS_FUNCS
-OBJS += src/crypto/tls_gnutls.c
-LIBS += -lgnutls -lgpg-error
-ifdef CONFIG_GNUTLS_EXTRA
-L_CFLAGS += -DCONFIG_GNUTLS_EXTRA
-LIBS += -lgnutls-extra
-endif
-endif
-OBJS += src/crypto/crypto_gnutls.c
-HOBJS += src/crypto/crypto_gnutls.c
-ifdef NEED_FIPS186_2_PRF
-OBJS += src/crypto/fips_prf_gnutls.c
-endif
-LIBS += -lgcrypt
-LIBS_h += -lgcrypt
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-CONFIG_INTERNAL_DH_GROUP5=y
-endif
-
-ifeq ($(CONFIG_TLS), schannel)
-ifdef TLS_FUNCS
-OBJS += src/crypto/tls_schannel.c
-endif
-OBJS += src/crypto/crypto_cryptoapi.c
-OBJS_p += src/crypto/crypto_cryptoapi.c
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-CONFIG_INTERNAL_DH_GROUP5=y
-endif
-
-ifeq ($(CONFIG_TLS), nss)
-ifdef TLS_FUNCS
-OBJS += src/crypto/tls_nss.c
-LIBS += -lssl3
-endif
-OBJS += src/crypto/crypto_nss.c
-ifdef NEED_FIPS186_2_PRF
-OBJS += src/crypto/fips_prf_nss.c
-endif
-LIBS += -lnss3
-LIBS_h += -lnss3
-CONFIG_INTERNAL_MD4=y
-CONFIG_INTERNAL_DH_GROUP5=y
-endif
-
-ifeq ($(CONFIG_TLS), internal)
-ifndef CONFIG_CRYPTO
-CONFIG_CRYPTO=internal
-endif
-ifdef TLS_FUNCS
-OBJS += src/crypto/crypto_internal-rsa.c
-OBJS += src/crypto/tls_internal.c
-OBJS += src/tls/tlsv1_common.c
-OBJS += src/tls/tlsv1_record.c
-OBJS += src/tls/tlsv1_cred.c
-OBJS += src/tls/tlsv1_server.c
-OBJS += src/tls/tlsv1_server_write.c
-OBJS += src/tls/tlsv1_server_read.c
-OBJS += src/tls/asn1.c
-OBJS += src/tls/rsa.c
-OBJS += src/tls/x509v3.c
-OBJS += src/tls/pkcs1.c
-OBJS += src/tls/pkcs5.c
-OBJS += src/tls/pkcs8.c
-NEED_SHA256=y
-NEED_BASE64=y
-NEED_TLS_PRF=y
-NEED_MODEXP=y
-NEED_CIPHER=y
-L_CFLAGS += -DCONFIG_TLS_INTERNAL
-L_CFLAGS += -DCONFIG_TLS_INTERNAL_SERVER
-endif
-ifdef NEED_CIPHER
-NEED_DES=y
-OBJS += src/crypto/crypto_internal-cipher.c
-endif
-ifdef NEED_MODEXP
-OBJS += src/crypto/crypto_internal-modexp.c
-OBJS += src/tls/bignum.c
-endif
-ifeq ($(CONFIG_CRYPTO), libtomcrypt)
-OBJS += src/crypto/crypto_libtomcrypt.c
-LIBS += -ltomcrypt -ltfm
-LIBS_h += -ltomcrypt -ltfm
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-CONFIG_INTERNAL_DH_GROUP5=y
-endif
-ifeq ($(CONFIG_CRYPTO), internal)
-OBJS += src/crypto/crypto_internal.c
-NEED_AES_DEC=y
-L_CFLAGS += -DCONFIG_CRYPTO_INTERNAL
-ifdef CONFIG_INTERNAL_LIBTOMMATH
-L_CFLAGS += -DCONFIG_INTERNAL_LIBTOMMATH
-ifdef CONFIG_INTERNAL_LIBTOMMATH_FAST
-L_CFLAGS += -DLTM_FAST
-endif
-else
-LIBS += -ltommath
-LIBS_h += -ltommath
-endif
-CONFIG_INTERNAL_AES=y
-CONFIG_INTERNAL_DES=y
-CONFIG_INTERNAL_SHA1=y
-CONFIG_INTERNAL_MD4=y
-CONFIG_INTERNAL_MD5=y
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-CONFIG_INTERNAL_DH_GROUP5=y
-endif
-ifeq ($(CONFIG_CRYPTO), cryptoapi)
-OBJS += src/crypto/crypto_cryptoapi.c
-OBJS_p += src/crypto/crypto_cryptoapi.c
-L_CFLAGS += -DCONFIG_CRYPTO_CRYPTOAPI
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-endif
-endif
-
-ifeq ($(CONFIG_TLS), none)
-ifdef TLS_FUNCS
-OBJS += src/crypto/tls_none.c
-L_CFLAGS += -DEAP_TLS_NONE
-CONFIG_INTERNAL_AES=y
-CONFIG_INTERNAL_SHA1=y
-CONFIG_INTERNAL_MD5=y
-endif
-OBJS += src/crypto/crypto_none.c
-OBJS_p += src/crypto/crypto_none.c
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-endif
-
-ifndef TLS_FUNCS
-OBJS += src/crypto/tls_none.c
-ifeq ($(CONFIG_TLS), internal)
-CONFIG_INTERNAL_AES=y
-CONFIG_INTERNAL_SHA1=y
-CONFIG_INTERNAL_MD5=y
-CONFIG_INTERNAL_RC4=y
-endif
-endif
-
-AESOBJS = # none so far
-ifdef CONFIG_INTERNAL_AES
-AESOBJS += src/crypto/aes-internal.c src/crypto/aes-internal-enc.c
-endif
-
-AESOBJS += src/crypto/aes-wrap.c
-ifdef NEED_AES_EAX
-AESOBJS += src/crypto/aes-eax.c
-NEED_AES_CTR=y
-endif
-ifdef NEED_AES_CTR
-AESOBJS += src/crypto/aes-ctr.c
-endif
-ifdef NEED_AES_ENCBLOCK
-AESOBJS += src/crypto/aes-encblock.c
-endif
-ifdef NEED_AES_OMAC1
-AESOBJS += src/crypto/aes-omac1.c
-endif
-ifdef NEED_AES_UNWRAP
-NEED_AES_DEC=y
-AESOBJS += src/crypto/aes-unwrap.c
-endif
-ifdef NEED_AES_CBC
-NEED_AES_DEC=y
-AESOBJS += src/crypto/aes-cbc.c
-endif
-ifdef NEED_AES_DEC
-ifdef CONFIG_INTERNAL_AES
-AESOBJS += src/crypto/aes-internal-dec.c
-endif
-endif
-ifdef NEED_AES
-OBJS += $(AESOBJS)
-endif
-
-SHA1OBJS =
-ifdef NEED_SHA1
-SHA1OBJS += src/crypto/sha1.c
-ifdef CONFIG_INTERNAL_SHA1
-SHA1OBJS += src/crypto/sha1-internal.c
-ifdef NEED_FIPS186_2_PRF
-SHA1OBJS += src/crypto/fips_prf_internal.c
-endif
-endif
-SHA1OBJS += src/crypto/sha1-pbkdf2.c
-ifdef NEED_T_PRF
-SHA1OBJS += src/crypto/sha1-tprf.c
-endif
-ifdef NEED_TLS_PRF
-SHA1OBJS += src/crypto/sha1-tlsprf.c
-endif
-endif
-
-ifdef NEED_SHA1
-OBJS += $(SHA1OBJS)
-endif
-
-ifdef NEED_MD5
-ifdef CONFIG_INTERNAL_MD5
-OBJS += src/crypto/md5-internal.c
-HOBJS += src/crypto/md5-internal.c
-endif
-endif
-
-ifdef NEED_MD4
-ifdef CONFIG_INTERNAL_MD4
-OBJS += src/crypto/md4-internal.c
-endif
-endif
-
-ifdef NEED_DES
-ifdef CONFIG_INTERNAL_DES
-OBJS += src/crypto/des-internal.c
-endif
-endif
-
-ifdef NEED_RC4
-ifdef CONFIG_INTERNAL_RC4
-OBJS += src/crypto/rc4.c
-endif
-endif
-
-ifdef NEED_SHA256
-OBJS += src/crypto/sha256.c
-ifdef CONFIG_INTERNAL_SHA256
-OBJS += src/crypto/sha256-internal.c
-endif
-endif
-
-ifdef NEED_DH_GROUPS
-OBJS += src/crypto/dh_groups.c
-endif
-ifdef NEED_DH_GROUPS_ALL
-L_CFLAGS += -DALL_DH_GROUPS
-endif
-ifdef CONFIG_INTERNAL_DH_GROUP5
-ifdef NEED_DH_GROUPS
-OBJS += src/crypto/dh_group5.c
-endif
-endif
-
-ifdef CONFIG_NO_RANDOM_POOL
-L_CFLAGS += -DCONFIG_NO_RANDOM_POOL
-else
-OBJS += src/crypto/random.c
-HOBJS += src/crypto/random.c
-HOBJS += $(SHA1OBJS)
-HOBJS += src/crypto/md5.c
-endif
-
-ifdef CONFIG_RADIUS_SERVER
-L_CFLAGS += -DRADIUS_SERVER
-OBJS += src/radius/radius_server.c
-endif
-
-ifdef CONFIG_IPV6
-L_CFLAGS += -DCONFIG_IPV6
-endif
-
-ifdef CONFIG_DRIVER_RADIUS_ACL
-L_CFLAGS += -DCONFIG_DRIVER_RADIUS_ACL
-endif
-
-ifdef CONFIG_FULL_DYNAMIC_VLAN
-# define CONFIG_FULL_DYNAMIC_VLAN to have hostapd manipulate bridges
-# and vlan interfaces for the vlan feature.
-L_CFLAGS += -DCONFIG_FULL_DYNAMIC_VLAN
-endif
-
-ifdef NEED_BASE64
-OBJS += src/utils/base64.c
-endif
-
-ifdef NEED_AP_MLME
-OBJS += src/ap/beacon.c
-OBJS += src/ap/wmm.c
-OBJS += src/ap/ap_list.c
-OBJS += src/ap/ieee802_11.c
-OBJS += src/ap/hw_features.c
-L_CFLAGS += -DNEED_AP_MLME
-endif
-ifdef CONFIG_IEEE80211N
-OBJS += src/ap/ieee802_11_ht.c
-endif
-
-ifdef CONFIG_P2P_MANAGER
-L_CFLAGS += -DCONFIG_P2P_MANAGER
-OBJS += src/ap/p2p_hostapd.c
-endif
-
-ifdef CONFIG_NO_STDOUT_DEBUG
-L_CFLAGS += -DCONFIG_NO_STDOUT_DEBUG
-endif
-
-ifdef CONFIG_DEBUG_FILE
-L_CFLAGS += -DCONFIG_DEBUG_FILE
-endif
-
-ifdef CONFIG_ANDROID_LOG
-L_CFLAGS += -DCONFIG_ANDROID_LOG
-endif
-
-OBJS_c = hostapd_cli.c src/common/wpa_ctrl.c src/utils/os_$(CONFIG_OS).c
-ifdef CONFIG_WPA_TRACE
-OBJS_c += src/utils/trace.c
-OBJS_c += src/utils/wpa_debug.c
-endif
-
-ifeq ($(WPA_BUILD_HOSTAPD),true)
-
-########################
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := hostapd_cli
-LOCAL_MODULE_TAGS := debug
-LOCAL_SHARED_LIBRARIES := libc libcutils
-LOCAL_CFLAGS := $(L_CFLAGS)
-LOCAL_SRC_FILES := $(OBJS_c)
-LOCAL_C_INCLUDES := $(INCLUDES)
-include $(BUILD_EXECUTABLE)
-
-########################
-include $(CLEAR_VARS)
-LOCAL_MODULE := hostapd
-LOCAL_MODULE_TAGS := optional
-ifdef CONFIG_DRIVER_CUSTOM
-LOCAL_STATIC_LIBRARIES := libCustomWifi
-endif
-ifneq ($(BOARD_HOSTAPD_PRIVATE_LIB),)
-LOCAL_STATIC_LIBRARIES += $(BOARD_HOSTAPD_PRIVATE_LIB)
-endif
-LOCAL_SHARED_LIBRARIES := libc libcutils libcrypto libssl
-ifdef CONFIG_DRIVER_NL80211
-LOCAL_SHARED_LIBRARIES += libnl_2
-endif
-LOCAL_CFLAGS := $(L_CFLAGS)
-LOCAL_SRC_FILES := $(OBJS)
-LOCAL_C_INCLUDES := $(INCLUDES)
-include $(BUILD_EXECUTABLE)
-
-endif # ifeq ($(WPA_BUILD_HOSTAPD),true)
diff --git a/hostapd-0.8/hostapd/ChangeLog b/hostapd-0.8/hostapd/ChangeLog
deleted file mode 100644
index a8417d6..0000000
--- a/hostapd-0.8/hostapd/ChangeLog
+++ /dev/null
@@ -1,647 +0,0 @@
-ChangeLog for hostapd
-
-2010-04-18 - v0.7.2
- * fix WPS internal Registrar use when an external Registrar is also
- active
- * bsd: Cleaned up driver wrapper and added various low-level
- configuration options
- * TNC: fixed issues with fragmentation
- * EAP-TNC: add Flags field into fragment acknowledgement (needed to
- interoperate with other implementations; may potentially breaks
- compatibility with older wpa_supplicant/hostapd versions)
- * cleaned up driver wrapper API for multi-BSS operations
- * nl80211: fix multi-BSS and VLAN operations
- * fix number of issues with IEEE 802.11r/FT; this version is not
- backwards compatible with old versions
- * add SA Query Request processing in AP mode (IEEE 802.11w)
- * fix IGTK PN in group rekeying (IEEE 802.11w)
- * fix WPS PBC session overlap detection to use correct attribute
- * hostapd_notif_Assoc() can now be called with all IEs to simplify
- driver wrappers
- * work around interoperability issue with some WPS External Registrar
- implementations
- * nl80211: fix WPS IE update
- * hostapd_cli: add support for action script operations (run a script
- on hostapd events)
- * fix DH padding with internal crypto code (mainly, for WPS)
- * fix WPS association with both WPS IE and WPA/RSN IE present with
- driver wrappers that use hostapd MLME (e.g., nl80211)
-
-2010-01-16 - v0.7.1
- * cleaned up driver wrapper API (struct wpa_driver_ops); the new API
- is not fully backwards compatible, so out-of-tree driver wrappers
- will need modifications
- * cleaned up various module interfaces
- * merge hostapd and wpa_supplicant developers' documentation into a
- single document
- * fixed HT Capabilities IE with nl80211 drivers
- * moved generic AP functionality code into src/ap
- * WPS: handle Selected Registrar as union of info from all Registrars
- * remove obsolte Prism54.org driver wrapper
- * added internal debugging mechanism with backtrace support and memory
- allocation/freeing validation, etc. tests (CONFIG_WPA_TRACE=y)
- * EAP-FAST server: piggyback Phase 2 start with the end of Phase 1
- * WPS: add support for dynamically selecting whether to provision the
- PSK as an ASCII passphrase or PSK
- * added support for WDS (4-address frame) mode with per-station virtual
- interfaces (wds_sta=1 in config file; only supported with
- driver=nl80211 for now)
- * fixed WPS Probe Request processing to handle missing required
- attribute
- * fixed PKCS#12 use with OpenSSL 1.0.0
- * detect bridge interface automatically so that bridge parameter in
- hostapd.conf becomes optional (though, it may now be used to
- automatically add then WLAN interface into a bridge with
- driver=nl80211)
-
-2009-11-21 - v0.7.0
- * increased hostapd_cli ping interval to 5 seconds and made this
- configurable with a new command line options (-G)
- * driver_nl80211: use Linux socket filter to improve performance
- * added support for external Registrars with WPS (UPnP transport)
- * 802.11n: scan for overlapping BSSes before starting 20/40 MHz channel
- * driver_nl80211: fixed STA accounting data collection (TX/RX bytes
- reported correctly; TX/RX packets not yet available from kernel)
- * added support for WPS USBA out-of-band mechanism with USB Flash
- Drives (UFD) (CONFIG_WPS_UFD=y)
- * fixed EAPOL/EAP reauthentication when using an external RADIUS
- authentication server
- * fixed TNC with EAP-TTLS
- * fixed IEEE 802.11r key derivation function to match with the standard
- (note: this breaks interoperability with previous version) [Bug 303]
- * fixed SHA-256 based key derivation function to match with the
- standard when using CCMP (for IEEE 802.11r and IEEE 802.11w)
- (note: this breaks interoperability with previous version) [Bug 307]
- * added number of code size optimizations to remove unnecessary
- functionality from the program binary based on build configuration
- (part of this automatic; part configurable with CONFIG_NO_* build
- options)
- * use shared driver wrapper files with wpa_supplicant
- * driver_nl80211: multiple updates to provide support for new Linux
- nl80211/mac80211 functionality
- * updated management frame protection to use IEEE Std 802.11w-2009
- * fixed number of small WPS issues and added workarounds to
- interoperate with common deployed broken implementations
- * added some IEEE 802.11n co-existance rules to disable 40 MHz channels
- or modify primary/secondary channels if needed based on neighboring
- networks
- * added support for NFC out-of-band mechanism with WPS
- * added preliminary support for IEEE 802.11r RIC processing
-
-2009-01-06 - v0.6.7
- * added support for Wi-Fi Protected Setup (WPS)
- (hostapd can now be configured to act as an integrated WPS Registrar
- and provision credentials for WPS Enrollees using PIN and PBC
- methods; external wireless Registrar can configure the AP, but
- external WLAN Manager Registrars are not supported); WPS support can
- be enabled by adding CONFIG_WPS=y into .config and setting the
- runtime configuration variables in hostapd.conf (see WPS section in
- the example configuration file); new hostapd_cli commands wps_pin and
- wps_pbc are used to configure WPS negotiation; see README-WPS for
- more details
- * added IEEE 802.11n HT capability configuration (ht_capab)
- * added support for generating Country IE based on nl80211 regulatory
- information (added if ieee80211d=1 in configuration)
- * fixed WEP authentication (both Open System and Shared Key) with
- mac80211
- * added support for EAP-AKA' (draft-arkko-eap-aka-kdf)
- * added support for using driver_test over UDP socket
- * changed EAP-GPSK to use the IANA assigned EAP method type 51
- * updated management frame protection to use IEEE 802.11w/D7.0
- * fixed retransmission of EAP requests if no response is received
-
-2008-11-23 - v0.6.6
- * added a new configuration option, wpa_ptk_rekey, that can be used to
- enforce frequent PTK rekeying, e.g., to mitigate some attacks against
- TKIP deficiencies
- * updated OpenSSL code for EAP-FAST to use an updated version of the
- session ticket overriding API that was included into the upstream
- OpenSSL 0.9.9 tree on 2008-11-15 (no additional OpenSSL patch is
- needed with that version anymore)
- * changed channel flags configuration to read the information from
- the driver (e.g., via driver_nl80211 when using mac80211) instead of
- using hostapd as the source of the regulatory information (i.e.,
- information from CRDA is now used with mac80211); this allows 5 GHz
- channels to be used with hostapd (if allowed in the current
- regulatory domain)
- * fixed EAP-TLS message processing for the last TLS message if it is
- large enough to require fragmentation (e.g., if a large Session
- Ticket data is included)
- * fixed listen interval configuration for nl80211 drivers
-
-2008-11-01 - v0.6.5
- * added support for SHA-256 as X.509 certificate digest when using the
- internal X.509/TLSv1 implementation
- * fixed EAP-FAST PAC-Opaque padding (0.6.4 broke this for some peer
- identity lengths)
- * fixed internal TLSv1 implementation for abbreviated handshake (used
- by EAP-FAST server)
- * added support for setting VLAN ID for STAs based on local MAC ACL
- (accept_mac_file) as an alternative for RADIUS server-based
- configuration
- * updated management frame protection to use IEEE 802.11w/D6.0
- (adds a new association ping to protect against unauthenticated
- authenticate or (re)associate request frames dropping association)
- * added support for using SHA256-based stronger key derivation for WPA2
- (IEEE 802.11w)
- * added new "driver wrapper" for RADIUS-only configuration
- (driver=none in hostapd.conf; CONFIG_DRIVER_NONE=y in .config)
- * fixed WPA/RSN IE validation to verify that the proto (WPA vs. WPA2)
- is enabled in configuration
- * changed EAP-FAST configuration to use separate fields for A-ID and
- A-ID-Info (eap_fast_a_id_info) to allow A-ID to be set to a fixed
- 16-octet len binary value for better interoperability with some peer
- implementations; eap_fast_a_id is now configured as a hex string
- * driver_nl80211: Updated to match the current Linux mac80211 AP mode
- configuration (wireless-testing.git and Linux kernel releases
- starting from 2.6.29)
-
-2008-08-10 - v0.6.4
- * added peer identity into EAP-FAST PAC-Opaque and skip Phase 2
- Identity Request if identity is already known
- * added support for EAP Sequences in EAP-FAST Phase 2
- * added support for EAP-TNC (Trusted Network Connect)
- (this version implements the EAP-TNC method and EAP-TTLS/EAP-FAST
- changes needed to run two methods in sequence (IF-T) and the IF-IMV
- and IF-TNCCS interfaces from TNCS)
- * added support for optional cryptobinding with PEAPv0
- * added fragmentation support for EAP-TNC
- * added support for fragmenting EAP-TTLS/PEAP/FAST Phase 2 (tunneled)
- data
- * added support for opportunistic key caching (OKC)
-
-2008-02-22 - v0.6.3
- * fixed Reassociation Response callback processing when using internal
- MLME (driver_{hostap,nl80211,test}.c)
- * updated FT support to use the latest draft, IEEE 802.11r/D9.0
- * copy optional Proxy-State attributes into RADIUS response when acting
- as a RADIUS authentication server
- * fixed EAPOL state machine to handle a case in which no response is
- received from the RADIUS authentication server; previous version
- could have triggered a crash in some cases after a timeout
- * fixed EAP-SIM/AKA realm processing to allow decorated usernames to
- be used
- * added a workaround for EAP-SIM/AKA peers that include incorrect null
- termination in the username
- * fixed EAP-SIM/AKA protected result indication to include AT_COUNTER
- attribute in notification messages only when using fast
- reauthentication
- * fixed EAP-SIM Start response processing for fast reauthentication
- case
- * added support for pending EAP processing in EAP-{PEAP,TTLS,FAST}
- phase 2 to allow EAP-SIM and EAP-AKA to be used as the Phase 2 method
-
-2008-01-01 - v0.6.2
- * fixed EAP-SIM and EAP-AKA message parser to validate attribute
- lengths properly to avoid potential crash caused by invalid messages
- * added data structure for storing allocated buffers (struct wpabuf);
- this does not affect hostapd usage, but many of the APIs changed
- and various interfaces (e.g., EAP) is not compatible with old
- versions
- * added support for protecting EAP-AKA/Identity messages with
- AT_CHECKCODE (optional feature in RFC 4187)
- * added support for protected result indication with AT_RESULT_IND for
- EAP-SIM and EAP-AKA (eap_sim_aka_result_ind=1)
- * added support for configuring EAP-TTLS phase 2 non-EAP methods in
- EAP server configuration; previously all four were enabled for every
- phase 2 user, now all four are disabled by default and need to be
- enabled with new method names TTLS-PAP, TTLS-CHAP, TTLS-MSCHAP,
- TTLS-MSCHAPV2
- * removed old debug printing mechanism and the related 'debug'
- parameter in the configuration file; debug verbosity is now set with
- -d (or -dd) command line arguments
- * added support for EAP-IKEv2 (draft-tschofenig-eap-ikev2-15.txt);
- only shared key/password authentication is supported in this version
-
-2007-11-24 - v0.6.1
- * added experimental, integrated TLSv1 server implementation with the
- needed X.509/ASN.1/RSA/bignum processing (this can be enabled by
- setting CONFIG_TLS=internal and CONFIG_INTERNAL_LIBTOMMATH=y in
- .config); this can be useful, e.g., if the target system does not
- have a suitable TLS library and a minimal code size is required
- * added support for EAP-FAST server method to the integrated EAP
- server
- * updated EAP Generalized Pre-Shared Key (EAP-GPSK) to use the latest
- draft (draft-ietf-emu-eap-gpsk-07.txt)
- * added a new configuration parameter, rsn_pairwise, to allow different
- pairwise cipher suites to be enabled for WPA and RSN/WPA2
- (note: if wpa_pairwise differs from rsn_pairwise, the driver will
- either need to support this or will have to use the WPA/RSN IEs from
- hostapd; currently, the included madwifi and bsd driver interfaces do
- not have support for this)
- * updated FT support to use the latest draft, IEEE 802.11r/D8.0
-
-2007-05-28 - v0.6.0
- * added experimental IEEE 802.11r/D6.0 support
- * updated EAP-SAKE to RFC 4763 and the IANA-allocated EAP type 48
- * updated EAP-PSK to use the IANA-allocated EAP type 47
- * fixed EAP-PSK bit ordering of the Flags field
- * fixed configuration reloading (SIGHUP) to re-initialize WPA PSKs
- by reading wpa_psk_file [Bug 181]
- * fixed EAP-TTLS AVP parser processing for too short AVP lengths
- * fixed IPv6 connection to RADIUS accounting server
- * updated EAP Generalized Pre-Shared Key (EAP-GPSK) to use the latest
- draft (draft-ietf-emu-eap-gpsk-04.txt)
- * hlr_auc_gw: read GSM triplet file into memory and rotate through the
- entries instead of only using the same three triplets every time
- (this does not work properly with tests using multiple clients, but
- provides bit better triplet data for testing a single client; anyway,
- if a better quality triplets are needed, GSM-Milenage should be used
- instead of hardcoded triplet file)
- * fixed EAP-MSCHAPv2 server to use a space between S and M parameters
- in Success Request [Bug 203]
- * added support for sending EAP-AKA Notifications in error cases
- * updated to use IEEE 802.11w/D2.0 for management frame protection
- (still experimental)
- * RADIUS server: added support for processing duplicate messages
- (retransmissions from RADIUS client) by replying with the previous
- reply
-
-2006-11-24 - v0.5.6
- * added support for configuring and controlling multiple BSSes per
- radio interface (bss= in hostapd.conf); this is only
- available with Devicescape and test driver interfaces
- * fixed PMKSA cache update in the end of successful RSN
- pre-authentication
- * added support for dynamic VLAN configuration (i.e., selecting VLAN-ID
- for each STA based on RADIUS Access-Accept attributes); this requires
- VLAN support from the kernel driver/802.11 stack and this is
- currently only available with Devicescape and test driver interfaces
- * driver_madwifi: fixed configuration of unencrypted modes (plaintext
- and IEEE 802.1X without WEP)
- * removed STAKey handshake since PeerKey handshake has replaced it in
- IEEE 802.11ma and there are no known deployments of STAKey
- * updated EAP Generalized Pre-Shared Key (EAP-GPSK) to use the latest
- draft (draft-ietf-emu-eap-gpsk-01.txt)
- * added preliminary implementation of IEEE 802.11w/D1.0 (management
- frame protection)
- (Note: this requires driver support to work properly.)
- (Note2: IEEE 802.11w is an unapproved draft and subject to change.)
- * hlr_auc_gw: added support for GSM-Milenage (for EAP-SIM)
- * hlr_auc_gw: added support for reading per-IMSI Milenage keys and
- parameters from a text file to make it possible to implement proper
- GSM/UMTS authentication server for multiple SIM/USIM cards using
- EAP-SIM/EAP-AKA
- * fixed session timeout processing with drivers that do not use
- ieee802_11.c (e.g., madwifi)
-
-2006-08-27 - v0.5.5
- * added 'hostapd_cli new_sta ' command for adding a new STA into
- hostapd (e.g., to initialize wired network authentication based on an
- external signal)
- * fixed hostapd to add PMKID KDE into 4-Way Handshake Message 1 when
- using WPA2 even if PMKSA caching is not used
- * added -P argument for hostapd to write the current process
- id into a file
- * added support for RADIUS Authentication Server MIB (RFC 2619)
-
-2006-06-20 - v0.5.4
- * fixed nt_password_hash build [Bug 144]
- * added PeerKey handshake implementation for IEEE 802.11e
- direct link setup (DLS) to replace STAKey handshake
- * added support for EAP Generalized Pre-Shared Key (EAP-GPSK,
- draft-clancy-emu-eap-shared-secret-00.txt)
- * fixed a segmentation fault when RSN pre-authentication was completed
- successfully [Bug 152]
-
-2006-04-27 - v0.5.3
- * do not build nt_password_hash and hlr_auc_gw by default to avoid
- requiring a TLS library for a successful build; these programs can be
- build with 'make nt_password_hash' and 'make hlr_auc_gw'
- * added a new configuration option, eapol_version, that can be used to
- set EAPOL version to 1 (default is 2) to work around broken client
- implementations that drop EAPOL frames which use version number 2
- [Bug 89]
- * added support for EAP-SAKE (no EAP method number allocated yet, so
- this is using the same experimental type 255 as EAP-PSK)
- * fixed EAP-MSCHAPv2 message length validation
-
-2006-03-19 - v0.5.2
- * fixed stdarg use in hostapd_logger(): if both stdout and syslog
- logging was enabled, hostapd could trigger a segmentation fault in
- vsyslog on some CPU -- C library combinations
- * moved HLR/AuC gateway implementation for EAP-SIM/AKA into an external
- program to make it easier to use for implementing real SS7 gateway;
- eap_sim_db is not anymore used as a file name for GSM authentication
- triplets; instead, it is path to UNIX domain socket that will be used
- to communicate with the external gateway program (e.g., hlr_auc_gw)
- * added example HLR/AuC gateway implementation, hlr_auc_gw, that uses
- local information (GSM authentication triplets from a text file and
- hardcoded AKA authentication data); this can be used to test EAP-SIM
- and EAP-AKA
- * added Milenage algorithm (example 3GPP AKA algorithm) to hlr_auc_gw
- to make it possible to test EAP-AKA with real USIM cards (this is
- disabled by default; define AKA_USE_MILENAGE when building hlr_auc_gw
- to enable this)
- * driver_madwifi: added support for getting station RSN IE from
- madwifi-ng svn r1453 and newer; this fixes RSN that was apparently
- broken with earlier change (r1357) in the driver
- * changed EAP method registration to use a dynamic list of methods
- instead of a static list generated at build time
- * fixed WPA message 3/4 not to encrypt Key Data field (WPA IE)
- [Bug 125]
- * added ap_max_inactivity configuration parameter
-
-2006-01-29 - v0.5.1
- * driver_test: added better support for multiple APs and STAs by using
- a directory with sockets that include MAC address for each device in
- the name (test_socket=DIR:/tmp/test)
- * added support for EAP expanded type (vendor specific EAP methods)
-
-2005-12-18 - v0.5.0 (beginning of 0.5.x development releases)
- * added experimental STAKey handshake implementation for IEEE 802.11e
- direct link setup (DLS); note: this is disabled by default in both
- build and runtime configuration (can be enabled with CONFIG_STAKEY=y
- and stakey=1)
- * added support for EAP methods to use callbacks to external programs
- by buffering a pending request and processing it after the EAP method
- is ready to continue
- * improved EAP-SIM database interface to allow external request to GSM
- HLR/AuC without blocking hostapd process
- * added support for using EAP-SIM pseudonyms and fast re-authentication
- * added support for EAP-AKA in the integrated EAP authenticator
- * added support for matching EAP identity prefixes (e.g., "1"*) in EAP
- user database to allow EAP-SIM/AKA selection without extra roundtrip
- for EAP-Nak negotiation
- * added support for storing EAP user password as NtPasswordHash instead
- of plaintext password when using MSCHAP or MSCHAPv2 for
- authentication (hash:<16-octet hex value>); added nt_password_hash
- tool for hashing password to generate NtPasswordHash
-
-2005-11-20 - v0.4.7 (beginning of 0.4.x stable releases)
- * driver_wired: fixed EAPOL sending to optionally use PAE group address
- as the destination instead of supplicant MAC address; this is
- disabled by default, but should be enabled with use_pae_group_addr=1
- in configuration file if the wired interface is used by only one
- device at the time (common switch configuration)
- * driver_madwifi: configure driver to use TKIP countermeasures in order
- to get correct behavior (IEEE 802.11 association failing; previously,
- association succeeded, but hostpad forced disassociation immediately)
- * driver_madwifi: added support for madwifi-ng
-
-2005-10-27 - v0.4.6
- * added support for replacing user identity from EAP with RADIUS
- User-Name attribute from Access-Accept message, if that is included,
- for the RADIUS accounting messages (e.g., for EAP-PEAP/TTLS to get
- tunneled identity into accounting messages when the RADIUS server
- does not support better way of doing this with Class attribute)
- * driver_madwifi: fixed EAPOL packet receive for configuration where
- ath# is part of a bridge interface
- * added a configuration file and log analyzer script for logwatch
- * fixed EAPOL state machine step function to process all state
- transitions before processing new events; this resolves a race
- condition in which EAPOL-Start message could trigger hostapd to send
- two EAP-Response/Identity frames to the authentication server
-
-2005-09-25 - v0.4.5
- * added client CA list to the TLS certificate request in order to make
- it easier for the client to select which certificate to use
- * added experimental support for EAP-PSK
- * added support for WE-19 (hostap, madwifi)
-
-2005-08-21 - v0.4.4
- * fixed build without CONFIG_RSN_PREAUTH
- * fixed FreeBSD build
-
-2005-06-26 - v0.4.3
- * fixed PMKSA caching to copy User-Name and Class attributes so that
- RADIUS accounting gets correct information
- * start RADIUS accounting only after successful completion of WPA
- 4-Way Handshake if WPA-PSK is used
- * fixed PMKSA caching for the case where STA (re)associates without
- first disassociating
-
-2005-06-12 - v0.4.2
- * EAP-PAX is now registered as EAP type 46
- * fixed EAP-PAX MAC calculation
- * fixed EAP-PAX CK and ICK key derivation
- * renamed eap_authenticator configuration variable to eap_server to
- better match with RFC 3748 (EAP) terminology
- * driver_test: added support for testing hostapd with wpa_supplicant
- by using test driver interface without any kernel drivers or network
- cards
-
-2005-05-22 - v0.4.1
- * fixed RADIUS server initialization when only auth or acct server
- is configured and the other one is left empty
- * driver_madwifi: added support for RADIUS accounting
- * driver_madwifi: added preliminary support for compiling against 'BSD'
- branch of madwifi CVS tree
- * driver_madwifi: fixed pairwise key removal to allow WPA reauth
- without disassociation
- * added support for reading additional certificates from PKCS#12 files
- and adding them to the certificate chain
- * fixed RADIUS Class attribute processing to only use Access-Accept
- packets to update Class; previously, other RADIUS authentication
- packets could have cleared Class attribute
- * added support for more than one Class attribute in RADIUS packets
- * added support for verifying certificate revocation list (CRL) when
- using integrated EAP authenticator for EAP-TLS; new hostapd.conf
- options 'check_crl'; CRL must be included in the ca_cert file for now
-
-2005-04-25 - v0.4.0 (beginning of 0.4.x development releases)
- * added support for including network information into
- EAP-Request/Identity message (ASCII-0 (nul) in eap_message)
- (e.g., to implement draft-adrange-eap-network-discovery-07.txt)
- * fixed a bug which caused some RSN pre-authentication cases to use
- freed memory and potentially crash hostapd
- * fixed private key loading for cases where passphrase is not set
- * added support for sending TLS alerts and aborting authentication
- when receiving a TLS alert
- * fixed WPA2 to add PMKSA cache entry when using integrated EAP
- authenticator
- * fixed PMKSA caching (EAP authentication was not skipped correctly
- with the new state machine changes from IEEE 802.1X draft)
- * added support for RADIUS over IPv6; own_ip_addr, auth_server_addr,
- and acct_server_addr can now be IPv6 addresses (CONFIG_IPV6=y needs
- to be added to .config to include IPv6 support); for RADIUS server,
- radius_server_ipv6=1 needs to be set in hostapd.conf and addresses
- in RADIUS clients file can then use IPv6 format
- * added experimental support for EAP-PAX
- * replaced hostapd control interface library (hostapd_ctrl.[ch]) with
- the same implementation that wpa_supplicant is using (wpa_ctrl.[ch])
-
-2005-02-12 - v0.3.7 (beginning of 0.3.x stable releases)
-
-2005-01-23 - v0.3.5
- * added support for configuring a forced PEAP version based on the
- Phase 1 identity
- * fixed PEAPv1 to use tunneled EAP-Success/Failure instead of EAP-TLV
- to terminate authentication
- * fixed EAP identifier duplicate processing with the new IEEE 802.1X
- draft
- * clear accounting data in the driver when starting a new accounting
- session
- * driver_madwifi: filter wireless events based on ifindex to allow more
- than one network interface to be used
- * fixed WPA message 2/4 processing not to cancel timeout for TimeoutEvt
- setting if the packet does not pass MIC verification (e.g., due to
- incorrect PSK); previously, message 1/4 was not tried again if an
- invalid message 2/4 was received
- * fixed reconfiguration of RADIUS client retransmission timer when
- adding a new message to the pending list; previously, timer was not
- updated at this point and if there was a pending message with long
- time for the next retry, the new message needed to wait that long for
- its first retry, too
-
-2005-01-09 - v0.3.4
- * added support for configuring multiple allowed EAP types for Phase 2
- authentication (EAP-PEAP, EAP-TTLS)
- * fixed EAPOL-Start processing to trigger WPA reauthentication
- (previously, only EAPOL authentication was done)
-
-2005-01-02 - v0.3.3
- * added support for EAP-PEAP in the integrated EAP authenticator
- * added support for EAP-GTC in the integrated EAP authenticator
- * added support for configuring list of EAP methods for Phase 1 so that
- the integrated EAP authenticator can, e.g., use the wildcard entry
- for EAP-TLS and EAP-PEAP
- * added support for EAP-TTLS in the integrated EAP authenticator
- * added support for EAP-SIM in the integrated EAP authenticator
- * added support for using hostapd as a RADIUS authentication server
- with the integrated EAP authenticator taking care of EAP
- authentication (new hostapd.conf options: radius_server_clients and
- radius_server_auth_port); this is not included in default build; use
- CONFIG_RADIUS_SERVER=y in .config to include
-
-2004-12-19 - v0.3.2
- * removed 'daemonize' configuration file option since it has not really
- been used at all for more than year
- * driver_madwifi: fixed group key setup and added get_ssid method
- * added support for EAP-MSCHAPv2 in the integrated EAP authenticator
-
-2004-12-12 - v0.3.1
- * added support for integrated EAP-TLS authentication (new hostapd.conf
- variables: ca_cert, server_cert, private_key, private_key_passwd);
- this enabled dynamic keying (WPA2/WPA/IEEE 802.1X/WEP) without
- external RADIUS server
- * added support for reading PKCS#12 (PFX) files (as a replacement for
- PEM/DER) to get certificate and private key (CONFIG_PKCS12)
-
-2004-12-05 - v0.3.0 (beginning of 0.3.x development releases)
- * added support for Acct-{Input,Output}-Gigawords
- * added support for Event-Timestamp (in RADIUS Accounting-Requests)
- * added support for RADIUS Authentication Client MIB (RFC2618)
- * added support for RADIUS Accounting Client MIB (RFC2620)
- * made EAP re-authentication period configurable (eap_reauth_period)
- * fixed EAPOL reauthentication to trigger WPA/WPA2 reauthentication
- * fixed EAPOL state machine to stop if STA is removed during
- eapol_sm_step(); this fixes at least one segfault triggering bug with
- IEEE 802.11i pre-authentication
- * added support for multiple WPA pre-shared keys (e.g., one for each
- client MAC address or keys shared by a group of clients);
- new hostapd.conf field wpa_psk_file for setting path to a text file
- containing PSKs, see hostapd.wpa_psk for an example
- * added support for multiple driver interfaces to allow hostapd to be
- used with other drivers
- * added wired authenticator driver interface (driver=wired in
- hostapd.conf, see wired.conf for example configuration)
- * added madwifi driver interface (driver=madwifi in hostapd.conf, see
- madwifi.conf for example configuration; Note: include files from
- madwifi project is needed for building and a configuration file,
- .config, needs to be created in hostapd directory with
- CONFIG_DRIVER_MADWIFI=y to include this driver interface in hostapd
- build)
- * fixed an alignment issue that could cause SHA-1 to fail on some
- platforms (e.g., Intel ixp425 with a compiler that does not 32-bit
- align variables)
- * fixed RADIUS reconnection after an error in sending interim
- accounting packets
- * added hostapd control interface for external programs and an example
- CLI, hostapd_cli (like wpa_cli for wpa_supplicant)
- * started adding dot11, dot1x, radius MIBs ('hostapd_cli mib',
- 'hostapd_cli sta ')
- * finished update from IEEE 802.1X-2001 to IEEE 802.1X-REV (now d11)
- * added support for strict GTK rekeying (wpa_strict_rekey in
- hostapd.conf)
- * updated IAPP to use UDP port 3517 and multicast address 224.0.1.178
- (instead of broadcast) for IAPP ADD-notify (moved from draft 3 to
- IEEE 802.11F-2003)
- * added Prism54 driver interface (driver=prism54 in hostapd.conf;
- note: .config needs to be created in hostapd directory with
- CONFIG_DRIVER_PRISM54=y to include this driver interface in hostapd
- build)
- * dual-licensed hostapd (GPLv2 and BSD licenses)
- * fixed RADIUS accounting to generate a new session id for cases where
- a station reassociates without first being complete deauthenticated
- * fixed STA disassociation handler to mark next timeout state to
- deauthenticate the station, i.e., skip long wait for inactivity poll
- and extra disassociation, if the STA disassociates without
- deauthenticating
- * added integrated EAP authenticator that can be used instead of
- external RADIUS authentication server; currently, only EAP-MD5 is
- supported, so this cannot yet be used for key distribution; the EAP
- method interface is generic, though, so adding new EAP methods should
- be straightforward; new hostapd.conf variables: 'eap_authenticator'
- and 'eap_user_file'; this obsoletes "minimal authentication server"
- ('minimal_eap' in hostapd.conf) which is now removed
- * added support for FreeBSD and driver interface for the BSD net80211
- layer (driver=bsd in hostapd.conf and CONFIG_DRIVER_BSD=y in
- .config); please note that some of the required kernel mods have not
- yet been committed
-
-2004-07-17 - v0.2.4 (beginning of 0.2.x stable releases)
- * fixed some accounting cases where Accounting-Start was sent when
- IEEE 802.1X port was being deauthorized
-
-2004-06-20 - v0.2.3
- * modified RADIUS client to re-connect the socket in case of certain
- error codes that are generated when a network interface state is
- changes (e.g., when IP address changes or the interface is set UP)
- * fixed couple of cases where EAPOL state for a station was freed
- twice causing a segfault for hostapd
- * fixed couple of bugs in processing WPA deauthentication (freed data
- was used)
-
-2004-05-31 - v0.2.2
- * fixed WPA/WPA2 group rekeying to use key index correctly (GN/GM)
- * fixed group rekeying to send zero TSC in EAPOL-Key messages to fix
- cases where STAs dropped multicast frames as replay attacks
- * added support for copying RADIUS Attribute 'Class' from
- authentication messages into accounting messages
- * send canned EAP failure if RADIUS server sends Access-Reject without
- EAP message (previously, Supplicant was not notified in this case)
- * fixed mixed WPA-PSK and WPA-EAP mode to work with WPA-PSK (i.e., do
- not start EAPOL state machines if the STA selected to use WPA-PSK)
-
-2004-05-06 - v0.2.1
- * added WPA and IEEE 802.11i/RSN (WPA2) Authenticator functionality
- - based on IEEE 802.11i/D10.0 but modified to interoperate with WPA
- (i.e., IEEE 802.11i/D3.0)
- - supports WPA-only, RSN-only, and mixed WPA/RSN mode
- - both WPA-PSK and WPA-RADIUS/EAP are supported
- - PMKSA caching and pre-authentication
- - new hostapd.conf variables: wpa, wpa_psk, wpa_passphrase,
- wpa_key_mgmt, wpa_pairwise, wpa_group_rekey, wpa_gmk_rekey,
- rsn_preauth, rsn_preauth_interfaces
- * fixed interim accounting to remove any pending accounting messages
- to the STA before sending a new one
-
-2004-02-15 - v0.2.0
- * added support for Acct-Interim-Interval:
- - draft-ietf-radius-acct-interim-01.txt
- - use Acct-Interim-Interval attribute from Access-Accept if local
- 'radius_acct_interim_interval' is not set
- - allow different update intervals for each STA
- * fixed event loop to call signal handlers only after returning from
- the real signal handler
- * reset sta->timeout_next after successful association to make sure
- that the previously registered inactivity timer will not remove the
- STA immediately (e.g., if STA deauthenticates and re-associates
- before the timer is triggered).
- * added new hostapd.conf variable, nas_identifier, that can be used to
- add an optional RADIUS Attribute, NAS-Identifier, into authentication
- and accounting messages
- * added support for Accounting-On and Accounting-Off messages
- * fixed accounting session handling to send Accounting-Start only once
- per session and not to send Accounting-Stop if the session was not
- initialized properly
- * fixed Accounting-Stop statistics in cases where the message was
- previously sent after the kernel entry for the STA (and/or IEEE
- 802.1X data) was removed
-
-
-Note:
-
-Older changes up to and including v0.1.0 are included in the ChangeLog
-of the Host AP driver.
diff --git a/hostapd-0.8/hostapd/Makefile b/hostapd-0.8/hostapd/Makefile
deleted file mode 100644
index d05975b..0000000
--- a/hostapd-0.8/hostapd/Makefile
+++ /dev/null
@@ -1,836 +0,0 @@
-ifndef CC
-CC=gcc
-endif
-
-ifndef CFLAGS
-CFLAGS = -MMD -O2 -Wall -g
-endif
-
-CFLAGS += -I../src
-CFLAGS += -I../src/utils
-
-# Uncomment following line and set the path to your kernel tree include
-# directory if your C library does not include all header files.
-# CFLAGS += -DUSE_KERNEL_HEADERS -I/usr/src/linux/include
-
--include .config
-
-ifndef CONFIG_OS
-ifdef CONFIG_NATIVE_WINDOWS
-CONFIG_OS=win32
-else
-CONFIG_OS=unix
-endif
-endif
-
-ifeq ($(CONFIG_OS), internal)
-CFLAGS += -DOS_NO_C_LIB_DEFINES
-endif
-
-ifdef CONFIG_NATIVE_WINDOWS
-CFLAGS += -DCONFIG_NATIVE_WINDOWS
-LIBS += -lws2_32
-endif
-
-OBJS += main.o
-OBJS += config_file.o
-
-OBJS += ../src/ap/hostapd.o
-OBJS += ../src/ap/wpa_auth_glue.o
-OBJS += ../src/ap/drv_callbacks.o
-OBJS += ../src/ap/ap_drv_ops.o
-OBJS += ../src/ap/utils.o
-OBJS += ../src/ap/authsrv.o
-OBJS += ../src/ap/ieee802_1x.o
-OBJS += ../src/ap/ap_config.o
-OBJS += ../src/ap/ieee802_11_auth.o
-OBJS += ../src/ap/sta_info.o
-OBJS += ../src/ap/wpa_auth.o
-OBJS += ../src/ap/tkip_countermeasures.o
-OBJS += ../src/ap/ap_mlme.o
-OBJS += ../src/ap/wpa_auth_ie.o
-OBJS += ../src/ap/preauth_auth.o
-OBJS += ../src/ap/pmksa_cache_auth.o
-
-NEED_RC4=y
-NEED_AES=y
-NEED_MD5=y
-NEED_SHA1=y
-
-OBJS += ../src/drivers/drivers.o
-CFLAGS += -DHOSTAPD
-
-ifdef CONFIG_WPA_TRACE
-CFLAGS += -DWPA_TRACE
-OBJS += ../src/utils/trace.o
-HOBJS += ../src/utils/trace.o
-LDFLAGS += -rdynamic
-CFLAGS += -funwind-tables
-ifdef CONFIG_WPA_TRACE_BFD
-CFLAGS += -DWPA_TRACE_BFD
-LIBS += -lbfd
-LIBS_c += -lbfd
-LIBS_h += -lbfd
-endif
-endif
-
-OBJS += ../src/utils/eloop.o
-OBJS += ../src/utils/common.o
-OBJS += ../src/utils/wpa_debug.o
-OBJS += ../src/utils/wpabuf.o
-OBJS += ../src/utils/os_$(CONFIG_OS).o
-OBJS += ../src/utils/ip_addr.o
-
-OBJS += ../src/common/ieee802_11_common.o
-OBJS += ../src/common/wpa_common.o
-
-OBJS += ../src/eapol_auth/eapol_auth_sm.o
-
-
-ifndef CONFIG_NO_DUMP_STATE
-# define HOSTAPD_DUMP_STATE to include SIGUSR1 handler for dumping state to
-# a file (undefine it, if you want to save in binary size)
-CFLAGS += -DHOSTAPD_DUMP_STATE
-OBJS += dump_state.o
-OBJS += ../src/eapol_auth/eapol_auth_dump.o
-endif
-
-ifdef CONFIG_NO_RADIUS
-CFLAGS += -DCONFIG_NO_RADIUS
-CONFIG_NO_ACCOUNTING=y
-else
-OBJS += ../src/radius/radius.o
-OBJS += ../src/radius/radius_client.o
-endif
-
-ifdef CONFIG_NO_ACCOUNTING
-CFLAGS += -DCONFIG_NO_ACCOUNTING
-else
-OBJS += ../src/ap/accounting.o
-endif
-
-ifdef CONFIG_NO_VLAN
-CFLAGS += -DCONFIG_NO_VLAN
-else
-OBJS += ../src/ap/vlan_init.o
-endif
-
-ifdef CONFIG_NO_CTRL_IFACE
-CFLAGS += -DCONFIG_NO_CTRL_IFACE
-else
-OBJS += ctrl_iface.o
-OBJS += ../src/ap/ctrl_iface_ap.o
-endif
-
-OBJS += ../src/crypto/md5.o
-
-CFLAGS += -DCONFIG_CTRL_IFACE -DCONFIG_CTRL_IFACE_UNIX
-
-ifdef CONFIG_IAPP
-CFLAGS += -DCONFIG_IAPP
-OBJS += ../src/ap/iapp.o
-endif
-
-ifdef CONFIG_RSN_PREAUTH
-CFLAGS += -DCONFIG_RSN_PREAUTH
-CONFIG_L2_PACKET=y
-endif
-
-ifdef CONFIG_PEERKEY
-CFLAGS += -DCONFIG_PEERKEY
-OBJS += ../src/ap/peerkey_auth.o
-endif
-
-ifdef CONFIG_IEEE80211W
-CFLAGS += -DCONFIG_IEEE80211W
-NEED_SHA256=y
-NEED_AES_OMAC1=y
-endif
-
-ifdef CONFIG_IEEE80211R
-CFLAGS += -DCONFIG_IEEE80211R
-OBJS += ../src/ap/wpa_auth_ft.o
-NEED_SHA256=y
-NEED_AES_OMAC1=y
-NEED_AES_UNWRAP=y
-endif
-
-ifdef CONFIG_IEEE80211N
-CFLAGS += -DCONFIG_IEEE80211N
-endif
-
-include ../src/drivers/drivers.mak
-OBJS += $(DRV_AP_OBJS)
-CFLAGS += $(DRV_AP_CFLAGS)
-LDFLAGS += $(DRV_AP_LDFLAGS)
-LIBS += $(DRV_AP_LIBS)
-
-ifdef CONFIG_L2_PACKET
-ifdef CONFIG_DNET_PCAP
-ifdef CONFIG_L2_FREEBSD
-LIBS += -lpcap
-OBJS += ../src/l2_packet/l2_packet_freebsd.o
-else
-LIBS += -ldnet -lpcap
-OBJS += ../src/l2_packet/l2_packet_pcap.o
-endif
-else
-OBJS += ../src/l2_packet/l2_packet_linux.o
-endif
-else
-OBJS += ../src/l2_packet/l2_packet_none.o
-endif
-
-
-ifdef CONFIG_EAP_MD5
-CFLAGS += -DEAP_SERVER_MD5
-OBJS += ../src/eap_server/eap_server_md5.o
-CHAP=y
-endif
-
-ifdef CONFIG_EAP_TLS
-CFLAGS += -DEAP_SERVER_TLS
-OBJS += ../src/eap_server/eap_server_tls.o
-TLS_FUNCS=y
-endif
-
-ifdef CONFIG_EAP_PEAP
-CFLAGS += -DEAP_SERVER_PEAP
-OBJS += ../src/eap_server/eap_server_peap.o
-OBJS += ../src/eap_common/eap_peap_common.o
-TLS_FUNCS=y
-CONFIG_EAP_MSCHAPV2=y
-endif
-
-ifdef CONFIG_EAP_TTLS
-CFLAGS += -DEAP_SERVER_TTLS
-OBJS += ../src/eap_server/eap_server_ttls.o
-TLS_FUNCS=y
-CHAP=y
-endif
-
-ifdef CONFIG_EAP_MSCHAPV2
-CFLAGS += -DEAP_SERVER_MSCHAPV2
-OBJS += ../src/eap_server/eap_server_mschapv2.o
-MS_FUNCS=y
-endif
-
-ifdef CONFIG_EAP_GTC
-CFLAGS += -DEAP_SERVER_GTC
-OBJS += ../src/eap_server/eap_server_gtc.o
-endif
-
-ifdef CONFIG_EAP_SIM
-CFLAGS += -DEAP_SERVER_SIM
-OBJS += ../src/eap_server/eap_server_sim.o
-CONFIG_EAP_SIM_COMMON=y
-NEED_AES_CBC=y
-endif
-
-ifdef CONFIG_EAP_AKA
-CFLAGS += -DEAP_SERVER_AKA
-OBJS += ../src/eap_server/eap_server_aka.o
-CONFIG_EAP_SIM_COMMON=y
-NEED_SHA256=y
-NEED_AES_CBC=y
-endif
-
-ifdef CONFIG_EAP_AKA_PRIME
-CFLAGS += -DEAP_SERVER_AKA_PRIME
-endif
-
-ifdef CONFIG_EAP_SIM_COMMON
-OBJS += ../src/eap_common/eap_sim_common.o
-# Example EAP-SIM/AKA interface for GSM/UMTS authentication. This can be
-# replaced with another file implementating the interface specified in
-# eap_sim_db.h.
-OBJS += ../src/eap_server/eap_sim_db.o
-NEED_FIPS186_2_PRF=y
-endif
-
-ifdef CONFIG_EAP_PAX
-CFLAGS += -DEAP_SERVER_PAX
-OBJS += ../src/eap_server/eap_server_pax.o ../src/eap_common/eap_pax_common.o
-endif
-
-ifdef CONFIG_EAP_PSK
-CFLAGS += -DEAP_SERVER_PSK
-OBJS += ../src/eap_server/eap_server_psk.o ../src/eap_common/eap_psk_common.o
-NEED_AES_OMAC1=y
-NEED_AES_ENCBLOCK=y
-NEED_AES_EAX=y
-endif
-
-ifdef CONFIG_EAP_SAKE
-CFLAGS += -DEAP_SERVER_SAKE
-OBJS += ../src/eap_server/eap_server_sake.o ../src/eap_common/eap_sake_common.o
-endif
-
-ifdef CONFIG_EAP_GPSK
-CFLAGS += -DEAP_SERVER_GPSK
-OBJS += ../src/eap_server/eap_server_gpsk.o ../src/eap_common/eap_gpsk_common.o
-ifdef CONFIG_EAP_GPSK_SHA256
-CFLAGS += -DEAP_SERVER_GPSK_SHA256
-endif
-NEED_SHA256=y
-NEED_AES_OMAC1=y
-endif
-
-ifdef CONFIG_EAP_PWD
-CFLAGS += -DEAP_SERVER_PWD
-OBJS += ../src/eap_server/eap_server_pwd.o ../src/eap_common/eap_pwd_common.o
-NEED_SHA256=y
-endif
-
-ifdef CONFIG_EAP_VENDOR_TEST
-CFLAGS += -DEAP_SERVER_VENDOR_TEST
-OBJS += ../src/eap_server/eap_server_vendor_test.o
-endif
-
-ifdef CONFIG_EAP_FAST
-CFLAGS += -DEAP_SERVER_FAST
-OBJS += ../src/eap_server/eap_server_fast.o
-OBJS += ../src/eap_common/eap_fast_common.o
-TLS_FUNCS=y
-NEED_T_PRF=y
-NEED_AES_UNWRAP=y
-endif
-
-ifdef CONFIG_WPS
-ifdef CONFIG_WPS2
-CFLAGS += -DCONFIG_WPS2
-endif
-
-CFLAGS += -DCONFIG_WPS -DEAP_SERVER_WSC
-OBJS += ../src/utils/uuid.o
-OBJS += ../src/ap/wps_hostapd.o
-OBJS += ../src/eap_server/eap_server_wsc.o ../src/eap_common/eap_wsc_common.o
-OBJS += ../src/wps/wps.o
-OBJS += ../src/wps/wps_common.o
-OBJS += ../src/wps/wps_attr_parse.o
-OBJS += ../src/wps/wps_attr_build.o
-OBJS += ../src/wps/wps_attr_process.o
-OBJS += ../src/wps/wps_dev_attr.o
-OBJS += ../src/wps/wps_enrollee.o
-OBJS += ../src/wps/wps_registrar.o
-NEED_DH_GROUPS=y
-NEED_SHA256=y
-NEED_BASE64=y
-NEED_AES_CBC=y
-NEED_MODEXP=y
-CONFIG_EAP=y
-
-ifdef CONFIG_WPS_UFD
-CFLAGS += -DCONFIG_WPS_UFD
-OBJS += ../src/wps/wps_ufd.o
-NEED_WPS_OOB=y
-endif
-
-ifdef CONFIG_WPS_NFC
-CFLAGS += -DCONFIG_WPS_NFC
-OBJS += ../src/wps/ndef.o
-OBJS += ../src/wps/wps_nfc.o
-NEED_WPS_OOB=y
-ifdef CONFIG_WPS_NFC_PN531
-PN531_PATH ?= /usr/local/src/nfc
-CFLAGS += -DCONFIG_WPS_NFC_PN531
-CFLAGS += -I${PN531_PATH}/inc
-OBJS += ../src/wps/wps_nfc_pn531.o
-LIBS += ${PN531_PATH}/lib/wpsnfc.dll
-LIBS += ${PN531_PATH}/lib/libnfc_mapping_pn53x.dll
-endif
-endif
-
-ifdef NEED_WPS_OOB
-CFLAGS += -DCONFIG_WPS_OOB
-endif
-
-ifdef CONFIG_WPS_UPNP
-CFLAGS += -DCONFIG_WPS_UPNP
-OBJS += ../src/wps/wps_upnp.o
-OBJS += ../src/wps/wps_upnp_ssdp.o
-OBJS += ../src/wps/wps_upnp_web.o
-OBJS += ../src/wps/wps_upnp_event.o
-OBJS += ../src/wps/wps_upnp_ap.o
-OBJS += ../src/wps/upnp_xml.o
-OBJS += ../src/wps/httpread.o
-OBJS += ../src/wps/http_client.o
-OBJS += ../src/wps/http_server.o
-endif
-
-ifdef CONFIG_WPS_STRICT
-CFLAGS += -DCONFIG_WPS_STRICT
-OBJS += ../src/wps/wps_validate.o
-endif
-
-ifdef CONFIG_WPS_TESTING
-CFLAGS += -DCONFIG_WPS_TESTING
-endif
-
-endif
-
-ifdef CONFIG_EAP_IKEV2
-CFLAGS += -DEAP_SERVER_IKEV2
-OBJS += ../src/eap_server/eap_server_ikev2.o ../src/eap_server/ikev2.o
-OBJS += ../src/eap_common/eap_ikev2_common.o ../src/eap_common/ikev2_common.o
-NEED_DH_GROUPS=y
-NEED_DH_GROUPS_ALL=y
-NEED_MODEXP=y
-NEED_CIPHER=y
-endif
-
-ifdef CONFIG_EAP_TNC
-CFLAGS += -DEAP_SERVER_TNC
-OBJS += ../src/eap_server/eap_server_tnc.o
-OBJS += ../src/eap_server/tncs.o
-NEED_BASE64=y
-ifndef CONFIG_DRIVER_BSD
-LIBS += -ldl
-endif
-endif
-
-# Basic EAP functionality is needed for EAPOL
-OBJS += eap_register.o
-OBJS += ../src/eap_server/eap_server.o
-OBJS += ../src/eap_common/eap_common.o
-OBJS += ../src/eap_server/eap_server_methods.o
-OBJS += ../src/eap_server/eap_server_identity.o
-CFLAGS += -DEAP_SERVER_IDENTITY
-
-ifdef CONFIG_EAP
-CFLAGS += -DEAP_SERVER
-endif
-
-ifdef CONFIG_PKCS12
-CFLAGS += -DPKCS12_FUNCS
-endif
-
-ifdef MS_FUNCS
-OBJS += ../src/crypto/ms_funcs.o
-NEED_DES=y
-NEED_MD4=y
-endif
-
-ifdef CHAP
-OBJS += ../src/eap_common/chap.o
-endif
-
-ifdef TLS_FUNCS
-NEED_DES=y
-# Shared TLS functions (needed for EAP_TLS, EAP_PEAP, and EAP_TTLS)
-CFLAGS += -DEAP_TLS_FUNCS
-OBJS += ../src/eap_server/eap_server_tls_common.o
-NEED_TLS_PRF=y
-endif
-
-ifndef CONFIG_TLS
-CONFIG_TLS=openssl
-endif
-
-ifeq ($(CONFIG_TLS), openssl)
-ifdef TLS_FUNCS
-OBJS += ../src/crypto/tls_openssl.o
-LIBS += -lssl
-endif
-OBJS += ../src/crypto/crypto_openssl.o
-HOBJS += ../src/crypto/crypto_openssl.o
-ifdef NEED_FIPS186_2_PRF
-OBJS += ../src/crypto/fips_prf_openssl.o
-endif
-LIBS += -lcrypto
-LIBS_h += -lcrypto
-endif
-
-ifeq ($(CONFIG_TLS), gnutls)
-ifdef TLS_FUNCS
-OBJS += ../src/crypto/tls_gnutls.o
-LIBS += -lgnutls -lgpg-error
-ifdef CONFIG_GNUTLS_EXTRA
-CFLAGS += -DCONFIG_GNUTLS_EXTRA
-LIBS += -lgnutls-extra
-endif
-endif
-OBJS += ../src/crypto/crypto_gnutls.o
-HOBJS += ../src/crypto/crypto_gnutls.o
-ifdef NEED_FIPS186_2_PRF
-OBJS += ../src/crypto/fips_prf_gnutls.o
-endif
-LIBS += -lgcrypt
-LIBS_h += -lgcrypt
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-CONFIG_INTERNAL_DH_GROUP5=y
-endif
-
-ifeq ($(CONFIG_TLS), schannel)
-ifdef TLS_FUNCS
-OBJS += ../src/crypto/tls_schannel.o
-endif
-OBJS += ../src/crypto/crypto_cryptoapi.o
-OBJS_p += ../src/crypto/crypto_cryptoapi.o
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-CONFIG_INTERNAL_DH_GROUP5=y
-endif
-
-ifeq ($(CONFIG_TLS), nss)
-ifdef TLS_FUNCS
-OBJS += ../src/crypto/tls_nss.o
-LIBS += -lssl3
-endif
-OBJS += ../src/crypto/crypto_nss.o
-ifdef NEED_FIPS186_2_PRF
-OBJS += ../src/crypto/fips_prf_nss.o
-endif
-LIBS += -lnss3
-LIBS_h += -lnss3
-CONFIG_INTERNAL_MD4=y
-CONFIG_INTERNAL_DH_GROUP5=y
-endif
-
-ifeq ($(CONFIG_TLS), internal)
-ifndef CONFIG_CRYPTO
-CONFIG_CRYPTO=internal
-endif
-ifdef TLS_FUNCS
-OBJS += ../src/crypto/crypto_internal-rsa.o
-OBJS += ../src/crypto/tls_internal.o
-OBJS += ../src/tls/tlsv1_common.o
-OBJS += ../src/tls/tlsv1_record.o
-OBJS += ../src/tls/tlsv1_cred.o
-OBJS += ../src/tls/tlsv1_server.o
-OBJS += ../src/tls/tlsv1_server_write.o
-OBJS += ../src/tls/tlsv1_server_read.o
-OBJS += ../src/tls/asn1.o
-OBJS += ../src/tls/rsa.o
-OBJS += ../src/tls/x509v3.o
-OBJS += ../src/tls/pkcs1.o
-OBJS += ../src/tls/pkcs5.o
-OBJS += ../src/tls/pkcs8.o
-NEED_SHA256=y
-NEED_BASE64=y
-NEED_TLS_PRF=y
-NEED_MODEXP=y
-NEED_CIPHER=y
-CFLAGS += -DCONFIG_TLS_INTERNAL
-CFLAGS += -DCONFIG_TLS_INTERNAL_SERVER
-endif
-ifdef NEED_CIPHER
-NEED_DES=y
-OBJS += ../src/crypto/crypto_internal-cipher.o
-endif
-ifdef NEED_MODEXP
-OBJS += ../src/crypto/crypto_internal-modexp.o
-OBJS += ../src/tls/bignum.o
-endif
-ifeq ($(CONFIG_CRYPTO), libtomcrypt)
-OBJS += ../src/crypto/crypto_libtomcrypt.o
-LIBS += -ltomcrypt -ltfm
-LIBS_h += -ltomcrypt -ltfm
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-CONFIG_INTERNAL_DH_GROUP5=y
-endif
-ifeq ($(CONFIG_CRYPTO), internal)
-OBJS += ../src/crypto/crypto_internal.o
-NEED_AES_DEC=y
-CFLAGS += -DCONFIG_CRYPTO_INTERNAL
-ifdef CONFIG_INTERNAL_LIBTOMMATH
-CFLAGS += -DCONFIG_INTERNAL_LIBTOMMATH
-ifdef CONFIG_INTERNAL_LIBTOMMATH_FAST
-CFLAGS += -DLTM_FAST
-endif
-else
-LIBS += -ltommath
-LIBS_h += -ltommath
-endif
-CONFIG_INTERNAL_AES=y
-CONFIG_INTERNAL_DES=y
-CONFIG_INTERNAL_SHA1=y
-CONFIG_INTERNAL_MD4=y
-CONFIG_INTERNAL_MD5=y
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-CONFIG_INTERNAL_DH_GROUP5=y
-endif
-ifeq ($(CONFIG_CRYPTO), cryptoapi)
-OBJS += ../src/crypto/crypto_cryptoapi.o
-OBJS_p += ../src/crypto/crypto_cryptoapi.o
-CFLAGS += -DCONFIG_CRYPTO_CRYPTOAPI
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-endif
-endif
-
-ifeq ($(CONFIG_TLS), none)
-ifdef TLS_FUNCS
-OBJS += ../src/crypto/tls_none.o
-CFLAGS += -DEAP_TLS_NONE
-CONFIG_INTERNAL_AES=y
-CONFIG_INTERNAL_SHA1=y
-CONFIG_INTERNAL_MD5=y
-endif
-OBJS += ../src/crypto/crypto_none.o
-OBJS_p += ../src/crypto/crypto_none.o
-CONFIG_INTERNAL_SHA256=y
-CONFIG_INTERNAL_RC4=y
-endif
-
-ifndef TLS_FUNCS
-OBJS += ../src/crypto/tls_none.o
-ifeq ($(CONFIG_TLS), internal)
-CONFIG_INTERNAL_AES=y
-CONFIG_INTERNAL_SHA1=y
-CONFIG_INTERNAL_MD5=y
-CONFIG_INTERNAL_RC4=y
-endif
-endif
-
-AESOBJS = # none so far
-ifdef CONFIG_INTERNAL_AES
-AESOBJS += ../src/crypto/aes-internal.o ../src/crypto/aes-internal-enc.o
-endif
-
-AESOBJS += ../src/crypto/aes-wrap.o
-ifdef NEED_AES_EAX
-AESOBJS += ../src/crypto/aes-eax.o
-NEED_AES_CTR=y
-endif
-ifdef NEED_AES_CTR
-AESOBJS += ../src/crypto/aes-ctr.o
-endif
-ifdef NEED_AES_ENCBLOCK
-AESOBJS += ../src/crypto/aes-encblock.o
-endif
-ifdef NEED_AES_OMAC1
-AESOBJS += ../src/crypto/aes-omac1.o
-endif
-ifdef NEED_AES_UNWRAP
-NEED_AES_DEC=y
-AESOBJS += ../src/crypto/aes-unwrap.o
-endif
-ifdef NEED_AES_CBC
-NEED_AES_DEC=y
-AESOBJS += ../src/crypto/aes-cbc.o
-endif
-ifdef NEED_AES_DEC
-ifdef CONFIG_INTERNAL_AES
-AESOBJS += ../src/crypto/aes-internal-dec.o
-endif
-endif
-ifdef NEED_AES
-OBJS += $(AESOBJS)
-endif
-
-ifdef NEED_SHA1
-SHA1OBJS += ../src/crypto/sha1.o
-ifdef CONFIG_INTERNAL_SHA1
-SHA1OBJS += ../src/crypto/sha1-internal.o
-ifdef NEED_FIPS186_2_PRF
-SHA1OBJS += ../src/crypto/fips_prf_internal.o
-endif
-endif
-SHA1OBJS += ../src/crypto/sha1-pbkdf2.o
-ifdef NEED_T_PRF
-SHA1OBJS += ../src/crypto/sha1-tprf.o
-endif
-ifdef NEED_TLS_PRF
-SHA1OBJS += ../src/crypto/sha1-tlsprf.o
-endif
-endif
-
-ifdef NEED_SHA1
-OBJS += $(SHA1OBJS)
-endif
-
-ifdef NEED_MD5
-ifdef CONFIG_INTERNAL_MD5
-OBJS += ../src/crypto/md5-internal.o
-HOBJS += ../src/crypto/md5-internal.o
-endif
-endif
-
-ifdef NEED_MD4
-ifdef CONFIG_INTERNAL_MD4
-OBJS += ../src/crypto/md4-internal.o
-endif
-endif
-
-ifdef NEED_DES
-ifdef CONFIG_INTERNAL_DES
-OBJS += ../src/crypto/des-internal.o
-endif
-endif
-
-ifdef NEED_RC4
-ifdef CONFIG_INTERNAL_RC4
-OBJS += ../src/crypto/rc4.o
-endif
-endif
-
-ifdef NEED_SHA256
-OBJS += ../src/crypto/sha256.o
-ifdef CONFIG_INTERNAL_SHA256
-OBJS += ../src/crypto/sha256-internal.o
-endif
-endif
-
-ifdef NEED_DH_GROUPS
-OBJS += ../src/crypto/dh_groups.o
-endif
-ifdef NEED_DH_GROUPS_ALL
-CFLAGS += -DALL_DH_GROUPS
-endif
-ifdef CONFIG_INTERNAL_DH_GROUP5
-ifdef NEED_DH_GROUPS
-OBJS += ../src/crypto/dh_group5.o
-endif
-endif
-
-ifdef CONFIG_NO_RANDOM_POOL
-CFLAGS += -DCONFIG_NO_RANDOM_POOL
-else
-OBJS += ../src/crypto/random.o
-HOBJS += ../src/crypto/random.o
-HOBJS += $(SHA1OBJS)
-HOBJS += ../src/crypto/md5.o
-endif
-
-ifdef CONFIG_RADIUS_SERVER
-CFLAGS += -DRADIUS_SERVER
-OBJS += ../src/radius/radius_server.o
-endif
-
-ifdef CONFIG_IPV6
-CFLAGS += -DCONFIG_IPV6
-endif
-
-ifdef CONFIG_DRIVER_RADIUS_ACL
-CFLAGS += -DCONFIG_DRIVER_RADIUS_ACL
-endif
-
-ifdef CONFIG_FULL_DYNAMIC_VLAN
-# define CONFIG_FULL_DYNAMIC_VLAN to have hostapd manipulate bridges
-# and vlan interfaces for the vlan feature.
-CFLAGS += -DCONFIG_FULL_DYNAMIC_VLAN
-endif
-
-ifdef NEED_BASE64
-OBJS += ../src/utils/base64.o
-endif
-
-ifdef NEED_AP_MLME
-OBJS += ../src/ap/beacon.o
-OBJS += ../src/ap/wmm.o
-OBJS += ../src/ap/ap_list.o
-OBJS += ../src/ap/ieee802_11.o
-OBJS += ../src/ap/hw_features.o
-CFLAGS += -DNEED_AP_MLME
-endif
-ifdef CONFIG_IEEE80211N
-OBJS += ../src/ap/ieee802_11_ht.o
-endif
-
-ifdef CONFIG_P2P_MANAGER
-CFLAGS += -DCONFIG_P2P_MANAGER
-OBJS += ../src/ap/p2p_hostapd.o
-endif
-
-ifdef CONFIG_NO_STDOUT_DEBUG
-CFLAGS += -DCONFIG_NO_STDOUT_DEBUG
-endif
-
-ifdef CONFIG_DEBUG_FILE
-CFLAGS += -DCONFIG_DEBUG_FILE
-endif
-
-ALL=hostapd hostapd_cli
-
-all: verify_config $(ALL)
-
-Q=@
-E=echo
-ifeq ($(V), 1)
-Q=
-E=true
-endif
-
-%.o: %.c
- $(Q)$(CC) -c -o $@ $(CFLAGS) $<
- @$(E) " CC " $<
-
-verify_config:
- @if [ ! -r .config ]; then \
- echo 'Building hostapd requires a configuration file'; \
- echo '(.config). See README for more instructions. You can'; \
- echo 'run "cp defconfig .config" to create an example'; \
- echo 'configuration.'; \
- exit 1; \
- fi
-
-install: all
- mkdir -p $(DESTDIR)/usr/local/bin
- for i in $(ALL); do cp -f $$i $(DESTDIR)/usr/local/bin/$$i; done
-
-../src/drivers/build.hostapd:
- @if [ -f ../src/drivers/build.wpa_supplicant ]; then \
- $(MAKE) -C ../src/drivers clean; \
- fi
- @touch ../src/drivers/build.hostapd
-
-BCHECK=../src/drivers/build.hostapd
-
-hostapd: $(BCHECK) $(OBJS)
- $(Q)$(CC) $(LDFLAGS) -o hostapd $(OBJS) $(LIBS)
- @$(E) " LD " $@
-
-OBJS_c = hostapd_cli.o ../src/common/wpa_ctrl.o ../src/utils/os_$(CONFIG_OS).o
-ifdef CONFIG_WPA_TRACE
-OBJS_c += ../src/utils/trace.o
-OBJS_c += ../src/utils/wpa_debug.o
-endif
-hostapd_cli: $(OBJS_c)
- $(Q)$(CC) $(LDFLAGS) -o hostapd_cli $(OBJS_c) $(LIBS_c)
- @$(E) " LD " $@
-
-NOBJS = nt_password_hash.o ../src/crypto/ms_funcs.o $(SHA1OBJS) ../src/crypto/md5.o
-ifdef NEED_RC4
-ifdef CONFIG_INTERNAL_RC4
-NOBJS += ../src/crypto/rc4.o
-endif
-endif
-ifdef CONFIG_INTERNAL_MD5
-NOBJS += ../src/crypto/md5-internal.o
-endif
-NOBJS += ../src/crypto/crypto_openssl.o ../src/utils/os_$(CONFIG_OS).o
-NOBJS += ../src/utils/wpa_debug.o
-NOBJS += ../src/utils/wpabuf.o
-ifdef CONFIG_WPA_TRACE
-NOBJS += ../src/utils/trace.o
-LIBS_n += -lbfd
-endif
-ifdef TLS_FUNCS
-LIBS_n += -lcrypto
-endif
-
-HOBJS += hlr_auc_gw.o ../src/utils/common.o ../src/utils/wpa_debug.o ../src/utils/os_$(CONFIG_OS).o ../src/utils/wpabuf.o ../src/crypto/milenage.o
-HOBJS += ../src/crypto/aes-encblock.o
-ifdef CONFIG_INTERNAL_AES
-HOBJS += ../src/crypto/aes-internal.o
-HOBJS += ../src/crypto/aes-internal-enc.o
-endif
-
-nt_password_hash: $(NOBJS)
- $(Q)$(CC) $(LDFLAGS) -o nt_password_hash $(NOBJS) $(LIBS_n)
- @$(E) " LD " $@
-
-hlr_auc_gw: $(HOBJS)
- $(Q)$(CC) $(LDFLAGS) -o hlr_auc_gw $(HOBJS) $(LIBS_h)
- @$(E) " LD " $@
-
-clean:
- $(MAKE) -C ../src clean
- rm -f core *~ *.o hostapd hostapd_cli nt_password_hash hlr_auc_gw
- rm -f *.d
-
--include $(OBJS:%.o=%.d)
diff --git a/hostapd-0.8/hostapd/README b/hostapd-0.8/hostapd/README
deleted file mode 100644
index a211cdd..0000000
--- a/hostapd-0.8/hostapd/README
+++ /dev/null
@@ -1,387 +0,0 @@
-hostapd - user space IEEE 802.11 AP and IEEE 802.1X/WPA/WPA2/EAP
- Authenticator and RADIUS authentication server
-================================================================
-
-Copyright (c) 2002-2011, Jouni Malinen and contributors
-All Rights Reserved.
-
-This program is dual-licensed under both the GPL version 2 and BSD
-license. Either license may be used at your option.
-
-
-
-License
--------
-
-GPL v2:
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License version 2 as
-published by the Free Software Foundation.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-(this copy of the license is in COPYING file)
-
-
-Alternatively, this software may be distributed, used, and modified
-under the terms of BSD license:
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-3. Neither the name(s) of the above-listed copyright holder(s) nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-
-Introduction
-============
-
-Originally, hostapd was an optional user space component for Host AP
-driver. It adds more features to the basic IEEE 802.11 management
-included in the kernel driver: using external RADIUS authentication
-server for MAC address based access control, IEEE 802.1X Authenticator
-and dynamic WEP keying, RADIUS accounting, WPA/WPA2 (IEEE 802.11i/RSN)
-Authenticator and dynamic TKIP/CCMP keying.
-
-The current version includes support for other drivers, an integrated
-EAP server (i.e., allow full authentication without requiring
-an external RADIUS authentication server), and RADIUS authentication
-server for EAP authentication.
-
-
-Requirements
-------------
-
-Current hardware/software requirements:
-- drivers:
- Host AP driver for Prism2/2.5/3.
- (http://hostap.epitest.fi/)
- Please note that station firmware version needs to be 1.7.0 or newer
- to work in WPA mode.
-
- madwifi driver for cards based on Atheros chip set (ar521x)
- (http://sourceforge.net/projects/madwifi/)
- Please note that you will need to add the correct path for
- madwifi driver root directory in .config (see defconfig file for
- an example: CFLAGS += -I)
-
- mac80211-based drivers that support AP mode (with driver=nl80211).
- This includes drivers for Atheros (ath9k) and Broadcom (b43)
- chipsets.
-
- Any wired Ethernet driver for wired IEEE 802.1X authentication
- (experimental code)
-
- FreeBSD -current (with some kernel mods that have not yet been
- committed when hostapd v0.3.0 was released)
- BSD net80211 layer (e.g., Atheros driver)
-
-
-Build configuration
--------------------
-
-In order to be able to build hostapd, you will need to create a build
-time configuration file, .config that selects which optional
-components are included. See defconfig file for example configuration
-and list of available options.
-
-
-
-IEEE 802.1X
-===========
-
-IEEE Std 802.1X-2001 is a standard for port-based network access
-control. In case of IEEE 802.11 networks, a "virtual port" is used
-between each associated station and the AP. IEEE 802.11 specifies
-minimal authentication mechanism for stations, whereas IEEE 802.1X
-introduces a extensible mechanism for authenticating and authorizing
-users.
-
-IEEE 802.1X uses elements called Supplicant, Authenticator, Port
-Access Entity, and Authentication Server. Supplicant is a component in
-a station and it performs the authentication with the Authentication
-Server. An access point includes an Authenticator that relays the packets
-between a Supplicant and an Authentication Server. In addition, it has a
-Port Access Entity (PAE) with Authenticator functionality for
-controlling the virtual port authorization, i.e., whether to accept
-packets from or to the station.
-
-IEEE 802.1X uses Extensible Authentication Protocol (EAP). The frames
-between a Supplicant and an Authenticator are sent using EAP over LAN
-(EAPOL) and the Authenticator relays these frames to the Authentication
-Server (and similarly, relays the messages from the Authentication
-Server to the Supplicant). The Authentication Server can be colocated with the
-Authenticator, in which case there is no need for additional protocol
-for EAP frame transmission. However, a more common configuration is to
-use an external Authentication Server and encapsulate EAP frame in the
-frames used by that server. RADIUS is suitable for this, but IEEE
-802.1X would also allow other mechanisms.
-
-Host AP driver includes PAE functionality in the kernel driver. It
-is a relatively simple mechanism for denying normal frames going to
-or coming from an unauthorized port. PAE allows IEEE 802.1X related
-frames to be passed between the Supplicant and the Authenticator even
-on an unauthorized port.
-
-User space daemon, hostapd, includes Authenticator functionality. It
-receives 802.1X (EAPOL) frames from the Supplicant using the wlan#ap
-device that is also used with IEEE 802.11 management frames. The
-frames to the Supplicant are sent using the same device.
-
-The normal configuration of the Authenticator would use an external
-Authentication Server. hostapd supports RADIUS encapsulation of EAP
-packets, so the Authentication Server should be a RADIUS server, like
-FreeRADIUS (http://www.freeradius.org/). The Authenticator in hostapd
-relays the frames between the Supplicant and the Authentication
-Server. It also controls the PAE functionality in the kernel driver by
-controlling virtual port authorization, i.e., station-AP
-connection, based on the IEEE 802.1X state.
-
-When a station would like to use the services of an access point, it
-will first perform IEEE 802.11 authentication. This is normally done
-with open systems authentication, so there is no security. After
-this, IEEE 802.11 association is performed. If IEEE 802.1X is
-configured to be used, the virtual port for the station is set in
-Unauthorized state and only IEEE 802.1X frames are accepted at this
-point. The Authenticator will then ask the Supplicant to authenticate
-with the Authentication Server. After this is completed successfully,
-the virtual port is set to Authorized state and frames from and to the
-station are accepted.
-
-Host AP configuration for IEEE 802.1X
--------------------------------------
-
-The user space daemon has its own configuration file that can be used to
-define AP options. Distribution package contains an example
-configuration file (hostapd/hostapd.conf) that can be used as a basis
-for configuration. It includes examples of all supported configuration
-options and short description of each option. hostapd should be started
-with full path to the configuration file as the command line argument,
-e.g., './hostapd /etc/hostapd.conf'. If you have more that one wireless
-LAN card, you can use one hostapd process for multiple interfaces by
-giving a list of configuration files (one per interface) in the command
-line.
-
-hostapd includes a minimal co-located IEEE 802.1X server which can be
-used to test IEEE 802.1X authentication. However, it should not be
-used in normal use since it does not provide any security. This can be
-configured by setting ieee8021x and minimal_eap options in the
-configuration file.
-
-An external Authentication Server (RADIUS) is configured with
-auth_server_{addr,port,shared_secret} options. In addition,
-ieee8021x and own_ip_addr must be set for this mode. With such
-configuration, the co-located Authentication Server is not used and EAP
-frames will be relayed using EAPOL between the Supplicant and the
-Authenticator and RADIUS encapsulation between the Authenticator and
-the Authentication Server. Other than this, the functionality is similar
-to the case with the co-located Authentication Server.
-
-Authentication Server and Supplicant
-------------------------------------
-
-Any RADIUS server supporting EAP should be usable as an IEEE 802.1X
-Authentication Server with hostapd Authenticator. FreeRADIUS
-(http://www.freeradius.org/) has been successfully tested with hostapd
-Authenticator and both Xsupplicant (http://www.open1x.org) and Windows
-XP Supplicants. EAP/TLS was used with Xsupplicant and
-EAP/MD5-Challenge with Windows XP.
-
-http://www.missl.cs.umd.edu/wireless/eaptls/ has useful information
-about using EAP/TLS with FreeRADIUS and Xsupplicant (just replace
-Cisco access point with Host AP driver, hostapd daemon, and a Prism2
-card ;-). http://www.freeradius.org/doc/EAP-MD5.html has information
-about using EAP/MD5 with FreeRADIUS, including instructions for WinXP
-configuration. http://www.denobula.com/EAPTLS.pdf has a HOWTO on
-EAP/TLS use with WinXP Supplicant.
-
-Automatic WEP key configuration
--------------------------------
-
-EAP/TLS generates a session key that can be used to send WEP keys from
-an AP to authenticated stations. The Authenticator in hostapd can be
-configured to automatically select a random default/broadcast key
-(shared by all authenticated stations) with wep_key_len_broadcast
-option (5 for 40-bit WEP or 13 for 104-bit WEP). In addition,
-wep_key_len_unicast option can be used to configure individual unicast
-keys for stations. This requires support for individual keys in the
-station driver.
-
-WEP keys can be automatically updated by configuring rekeying. This
-will improve security of the network since same WEP key will only be
-used for a limited period of time. wep_rekey_period option sets the
-interval for rekeying in seconds.
-
-
-WPA/WPA2
-========
-
-Features
---------
-
-Supported WPA/IEEE 802.11i features:
-- WPA-PSK ("WPA-Personal")
-- WPA with EAP (e.g., with RADIUS authentication server) ("WPA-Enterprise")
-- key management for CCMP, TKIP, WEP104, WEP40
-- RSN/WPA2 (IEEE 802.11i), including PMKSA caching and pre-authentication
-
-WPA
----
-
-The original security mechanism of IEEE 802.11 standard was not
-designed to be strong and has proved to be insufficient for most
-networks that require some kind of security. Task group I (Security)
-of IEEE 802.11 working group (http://www.ieee802.org/11/) has worked
-to address the flaws of the base standard and has in practice
-completed its work in May 2004. The IEEE 802.11i amendment to the IEEE
-802.11 standard was approved in June 2004 and this amendment is likely
-to be published in July 2004.
-
-Wi-Fi Alliance (http://www.wi-fi.org/) used a draft version of the
-IEEE 802.11i work (draft 3.0) to define a subset of the security
-enhancements that can be implemented with existing wlan hardware. This
-is called Wi-Fi Protected Access (WPA). This has now become a
-mandatory component of interoperability testing and certification done
-by Wi-Fi Alliance. Wi-Fi provides information about WPA at its web
-site (http://www.wi-fi.org/OpenSection/protected_access.asp).
-
-IEEE 802.11 standard defined wired equivalent privacy (WEP) algorithm
-for protecting wireless networks. WEP uses RC4 with 40-bit keys,
-24-bit initialization vector (IV), and CRC32 to protect against packet
-forgery. All these choices have proven to be insufficient: key space is
-too small against current attacks, RC4 key scheduling is insufficient
-(beginning of the pseudorandom stream should be skipped), IV space is
-too small and IV reuse makes attacks easier, there is no replay
-protection, and non-keyed authentication does not protect against bit
-flipping packet data.
-
-WPA is an intermediate solution for the security issues. It uses
-Temporal Key Integrity Protocol (TKIP) to replace WEP. TKIP is a
-compromise on strong security and possibility to use existing
-hardware. It still uses RC4 for the encryption like WEP, but with
-per-packet RC4 keys. In addition, it implements replay protection,
-keyed packet authentication mechanism (Michael MIC).
-
-Keys can be managed using two different mechanisms. WPA can either use
-an external authentication server (e.g., RADIUS) and EAP just like
-IEEE 802.1X is using or pre-shared keys without need for additional
-servers. Wi-Fi calls these "WPA-Enterprise" and "WPA-Personal",
-respectively. Both mechanisms will generate a master session key for
-the Authenticator (AP) and Supplicant (client station).
-
-WPA implements a new key handshake (4-Way Handshake and Group Key
-Handshake) for generating and exchanging data encryption keys between
-the Authenticator and Supplicant. This handshake is also used to
-verify that both Authenticator and Supplicant know the master session
-key. These handshakes are identical regardless of the selected key
-management mechanism (only the method for generating master session
-key changes).
-
-
-IEEE 802.11i / WPA2
--------------------
-
-The design for parts of IEEE 802.11i that were not included in WPA has
-finished (May 2004) and this amendment to IEEE 802.11 was approved in
-June 2004. Wi-Fi Alliance is using the final IEEE 802.11i as a new
-version of WPA called WPA2. This includes, e.g., support for more
-robust encryption algorithm (CCMP: AES in Counter mode with CBC-MAC)
-to replace TKIP and optimizations for handoff (reduced number of
-messages in initial key handshake, pre-authentication, and PMKSA caching).
-
-Some wireless LAN vendors are already providing support for CCMP in
-their WPA products. There is no "official" interoperability
-certification for CCMP and/or mixed modes using both TKIP and CCMP, so
-some interoperability issues can be expected even though many
-combinations seem to be working with equipment from different vendors.
-Testing for WPA2 is likely to start during the second half of 2004.
-
-hostapd configuration for WPA/WPA2
-----------------------------------
-
-TODO
-
-# Enable WPA. Setting this variable configures the AP to require WPA (either
-# WPA-PSK or WPA-RADIUS/EAP based on other configuration). For WPA-PSK, either
-# wpa_psk or wpa_passphrase must be set and wpa_key_mgmt must include WPA-PSK.
-# For WPA-RADIUS/EAP, ieee8021x must be set (but without dynamic WEP keys),
-# RADIUS authentication server must be configured, and WPA-EAP must be included
-# in wpa_key_mgmt.
-# This field is a bit field that can be used to enable WPA (IEEE 802.11i/D3.0)
-# and/or WPA2 (full IEEE 802.11i/RSN):
-# bit0 = WPA
-# bit1 = IEEE 802.11i/RSN (WPA2)
-#wpa=1
-
-# WPA pre-shared keys for WPA-PSK. This can be either entered as a 256-bit
-# secret in hex format (64 hex digits), wpa_psk, or as an ASCII passphrase
-# (8..63 characters) that will be converted to PSK. This conversion uses SSID
-# so the PSK changes when ASCII passphrase is used and the SSID is changed.
-#wpa_psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
-#wpa_passphrase=secret passphrase
-
-# Set of accepted key management algorithms (WPA-PSK, WPA-EAP, or both). The
-# entries are separated with a space.
-#wpa_key_mgmt=WPA-PSK WPA-EAP
-
-# Set of accepted cipher suites (encryption algorithms) for pairwise keys
-# (unicast packets). This is a space separated list of algorithms:
-# CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i]
-# TKIP = Temporal Key Integrity Protocol [IEEE 802.11i]
-# Group cipher suite (encryption algorithm for broadcast and multicast frames)
-# is automatically selected based on this configuration. If only CCMP is
-# allowed as the pairwise cipher, group cipher will also be CCMP. Otherwise,
-# TKIP will be used as the group cipher.
-#wpa_pairwise=TKIP CCMP
-
-# Time interval for rekeying GTK (broadcast/multicast encryption keys) in
-# seconds.
-#wpa_group_rekey=600
-
-# Time interval for rekeying GMK (master key used internally to generate GTKs
-# (in seconds).
-#wpa_gmk_rekey=86400
-
-# Enable IEEE 802.11i/RSN/WPA2 pre-authentication. This is used to speed up
-# roaming be pre-authenticating IEEE 802.1X/EAP part of the full RSN
-# authentication and key handshake before actually associating with a new AP.
-#rsn_preauth=1
-#
-# Space separated list of interfaces from which pre-authentication frames are
-# accepted (e.g., 'eth0' or 'eth0 wlan0wds0'. This list should include all
-# interface that are used for connections to other APs. This could include
-# wired interfaces and WDS links. The normal wireless data interface towards
-# associated stations (e.g., wlan0) should not be added, since
-# pre-authentication is only used with APs other than the currently associated
-# one.
-#rsn_preauth_interfaces=eth0
diff --git a/hostapd-0.8/hostapd/README-WPS b/hostapd-0.8/hostapd/README-WPS
deleted file mode 100644
index 17988d4..0000000
--- a/hostapd-0.8/hostapd/README-WPS
+++ /dev/null
@@ -1,291 +0,0 @@
-hostapd and Wi-Fi Protected Setup (WPS)
-=======================================
-
-This document describes how the WPS implementation in hostapd can be
-configured and how an external component on an AP (e.g., web UI) is
-used to enable enrollment of client devices.
-
-
-Introduction to WPS
--------------------
-
-Wi-Fi Protected Setup (WPS) is a mechanism for easy configuration of a
-wireless network. It allows automated generation of random keys (WPA
-passphrase/PSK) and configuration of an access point and client
-devices. WPS includes number of methods for setting up connections
-with PIN method and push-button configuration (PBC) being the most
-commonly deployed options.
-
-While WPS can enable more home networks to use encryption in the
-wireless network, it should be noted that the use of the PIN and
-especially PBC mechanisms for authenticating the initial key setup is
-not very secure. As such, use of WPS may not be suitable for
-environments that require secure network access without chance for
-allowing outsiders to gain access during the setup phase.
-
-WPS uses following terms to describe the entities participating in the
-network setup:
-- access point: the WLAN access point
-- Registrar: a device that control a network and can authorize
- addition of new devices); this may be either in the AP ("internal
- Registrar") or in an external device, e.g., a laptop, ("external
- Registrar")
-- Enrollee: a device that is being authorized to use the network
-
-It should also be noted that the AP and a client device may change
-roles (i.e., AP acts as an Enrollee and client device as a Registrar)
-when WPS is used to configure the access point.
-
-
-More information about WPS is available from Wi-Fi Alliance:
-http://www.wi-fi.org/wifi-protected-setup
-
-
-hostapd implementation
-----------------------
-
-hostapd includes an optional WPS component that can be used as an
-internal WPS Registrar to manage addition of new WPS enabled clients
-to the network. In addition, WPS Enrollee functionality in hostapd can
-be used to allow external WPS Registrars to configure the access
-point, e.g., for initial network setup. In addition, hostapd can proxy a
-WPS registration between a wireless Enrollee and an external Registrar
-(e.g., Microsoft Vista or Atheros JumpStart) with UPnP.
-
-
-hostapd configuration
----------------------
-
-WPS is an optional component that needs to be enabled in hostapd build
-configuration (.config). Here is an example configuration that
-includes WPS support and uses madwifi driver interface:
-
-CONFIG_DRIVER_MADWIFI=y
-CFLAGS += -I/usr/src/madwifi-0.9.3
-CONFIG_WPS=y
-CONFIG_WPS2=y
-CONFIG_WPS_UPNP=y
-
-
-Following section shows an example runtime configuration
-(hostapd.conf) that enables WPS:
-
-# Configure the driver and network interface
-driver=madwifi
-interface=ath0
-
-# WPA2-Personal configuration for the AP
-ssid=wps-test
-wpa=2
-wpa_key_mgmt=WPA-PSK
-wpa_pairwise=CCMP
-# Default WPA passphrase for legacy (non-WPS) clients
-wpa_passphrase=12345678
-# Enable random per-device PSK generation for WPS clients
-# Please note that the file has to exists for hostapd to start (i.e., create an
-# empty file as a starting point).
-wpa_psk_file=/etc/hostapd.psk
-
-# Enable control interface for PBC/PIN entry
-ctrl_interface=/var/run/hostapd
-
-# Enable internal EAP server for EAP-WSC (part of Wi-Fi Protected Setup)
-eap_server=1
-
-# WPS configuration (AP configured, do not allow external WPS Registrars)
-wps_state=2
-ap_setup_locked=1
-# If UUID is not configured, it will be generated based on local MAC address.
-uuid=87654321-9abc-def0-1234-56789abc0000
-wps_pin_requests=/var/run/hostapd.pin-req
-device_name=Wireless AP
-manufacturer=Company
-model_name=WAP
-model_number=123
-serial_number=12345
-device_type=6-0050F204-1
-os_version=01020300
-config_methods=label display push_button keypad
-
-# if external Registrars are allowed, UPnP support could be added:
-#upnp_iface=br0
-#friendly_name=WPS Access Point
-
-
-External operations
--------------------
-
-WPS requires either a device PIN code (usually, 8-digit number) or a
-pushbutton event (for PBC) to allow a new WPS Enrollee to join the
-network. hostapd uses the control interface as an input channel for
-these events.
-
-The PIN value used in the commands must be processed by an UI to
-remove non-digit characters and potentially, to verify the checksum
-digit. "hostapd_cli wps_check_pin " can be used to do such
-processing. It returns FAIL if the PIN is invalid, or FAIL-CHECKSUM if
-the checksum digit is incorrect, or the processed PIN (non-digit
-characters removed) if the PIN is valid.
-
-When a client device (WPS Enrollee) connects to hostapd (WPS
-Registrar) in order to start PIN mode negotiation for WPS, an
-identifier (Enrollee UUID) is sent. hostapd will need to be configured
-with a device password (PIN) for this Enrollee. This is an operation
-that requires user interaction (assuming there are no pre-configured
-PINs on the AP for a set of Enrollee).
-
-The PIN request with information about the device is appended to the
-wps_pin_requests file (/var/run/hostapd.pin-req in this example). In
-addition, hostapd control interface event is sent as a notification of
-a new device. The AP could use, e.g., a web UI for showing active
-Enrollees to the user and request a PIN for an Enrollee.
-
-The PIN request file has one line for every Enrollee that connected to
-the AP, but for which there was no PIN. Following information is
-provided for each Enrollee (separated with tabulators):
-- timestamp (seconds from 1970-01-01)
-- Enrollee UUID
-- MAC address
-- Device name
-- Manufacturer
-- Model Name
-- Model Number
-- Serial Number
-- Device category
-
-Example line in the /var/run/hostapd.pin-req file:
-1200188391 53b63a98-d29e-4457-a2ed-094d7e6a669c Intel(R) Centrino(R) Intel Corporation Intel(R) Centrino(R) - - 1-0050F204-1
-
-Control interface data:
-WPS-PIN-NEEDED [UUID-E|MAC Address|Device Name|Manufacturer|Model Name|Model Number|Serial Number|Device Category]
-For example:
-<2>WPS-PIN-NEEDED [53b63a98-d29e-4457-a2ed-094d7e6a669c|02:12:34:56:78:9a|Device|Manuf|Model|Model Number|Serial Number|1-0050F204-1]
-
-When the user enters a PIN for a pending Enrollee, e.g., on the web
-UI), hostapd needs to be notified of the new PIN over the control
-interface. This can be done either by using the UNIX domain socket
--based control interface directly (src/common/wpa_ctrl.c provides
-helper functions for using the interface) or by calling hostapd_cli.
-
-Example command to add a PIN (12345670) for an Enrollee:
-
-hostapd_cli wps_pin 53b63a98-d29e-4457-a2ed-094d7e6a669c 12345670
-
-If the UUID-E is not available (e.g., Enrollee waits for the Registrar
-to be selected before connecting), wildcard UUID may be used to allow
-the PIN to be used once with any UUID:
-
-hostapd_cli wps_pin any 12345670
-
-To reduce likelihood of PIN being used with other devices or of
-forgetting an active PIN available for potential attackers, expiration
-time in seconds can be set for the new PIN (value 0 indicates no
-expiration):
-
-hostapd_cli wps_pin any 12345670 300
-
-If the MAC address of the enrollee is known, it should be configured
-to allow the AP to advertise list of authorized enrollees:
-
-hostapd_cli wps_pin 53b63a98-d29e-4457-a2ed-094d7e6a669c \
- 12345670 300 00:11:22:33:44:55
-
-
-After this, the Enrollee can connect to the AP again and complete WPS
-negotiation. At that point, a new, random WPA PSK is generated for the
-client device and the client can then use that key to connect to the
-AP to access the network.
-
-
-If the AP includes a pushbutton, WPS PBC mode can be used. It is
-enabled by pushing a button on both the AP and the client at about the
-same time (2 minute window). hostapd needs to be notified about the AP
-button pushed event over the control interface, e.g., by calling
-hostapd_cli:
-
-hostapd_cli wps_pbc
-
-At this point, the client has two minutes to complete WPS negotiation
-which will generate a new WPA PSK in the same way as the PIN method
-described above.
-
-
-When an external Registrar is used, the AP can act as an Enrollee and
-use its AP PIN. A static AP PIN (e.g., one one a label in the AP
-device) can be configured in hostapd.conf (ap_pin parameter). A more
-secure option is to use hostapd_cli wps_ap_pin command to enable the
-AP PIN only based on user action (and even better security by using a
-random AP PIN for each session, i.e., by using "wps_ap_pin random"
-command with a timeout value). Following commands are available for
-managing the dynamic AP PIN operations:
-
-hostapd_cli wps_ap_pin disable
-- disable AP PIN (i.e., do not allow external Registrars to use it to
- learn the current AP settings or to reconfigure the AP)
-
-hostapd_cli wps_ap_pin random [timeout]
-- generate a random AP PIN and enable it
-- if the optional timeout parameter is given, the AP PIN will be enabled
- for the specified number of seconds
-
-hostapd_cli wps_ap_pin get
-- fetch the current AP PIN
-
-hostapd_cli wps_ap_pin set [timeout]
-- set the AP PIN and enable it
-- if the optional timeout parameter is given, the AP PIN will be enabled
- for the specified number of seconds
-
-hostapd_cli get_config
-- display the current configuration
-
-hostapd_cli wps_config
-examples:
- hostapd_cli wps_config testing WPA2PSK CCMP 12345678
- hostapd_cli wps_config "no security" OPEN NONE ""
-
- must be one of the following: OPEN WPAPSK WPA2PSK
- must be one of the following: NONE WEP TKIP CCMP
-
-
-Credential generation and configuration changes
------------------------------------------------
-
-By default, hostapd generates credentials for Enrollees and processing
-AP configuration updates internally. However, it is possible to
-control these operations from external programs, if desired.
-
-The internal credential generation can be disabled with
-skip_cred_build=1 option in the configuration. extra_cred option will
-then need to be used to provide pre-configured Credential attribute(s)
-for hostapd to use. The exact data from this binary file will be sent,
-i.e., it will have to include valid WPS attributes. extra_cred can
-also be used to add additional networks if the Registrar is used to
-configure credentials for multiple networks.
-
-Processing of received configuration updates can be disabled with
-wps_cred_processing=1 option. When this is used, an external program
-is responsible for creating hostapd configuration files and processing
-configuration updates based on messages received from hostapd over
-control interface. This will also include the initial configuration on
-first successful registration if the AP is initially set in
-unconfigured state.
-
-Following control interface messages are sent out for external programs:
-
-WPS-REG-SUCCESS
-For example:
-<2>WPS-REG-SUCCESS 02:66:a0:ee:17:27 2b7093f1-d6fb-5108-adbb-bea66bb87333
-
-This can be used to trigger change from unconfigured to configured
-state (random configuration based on the first successful WPS
-registration). In addition, this can be used to update AP UI about the
-status of WPS registration progress.
-
-
-WPS-NEW-AP-SETTINGS
-For example:
-<2>WPS-NEW-AP-SETTINGS 10260001011045000c6a6b6d2d7770732d74657374100300020020100f00020008102700403065346230343536633236366665306433396164313535346131663462663731323433376163666462376633393965353466316631623032306164343438623510200006024231cede15101e000844
-
-This can be used to update the externally stored AP configuration and
-then update hostapd configuration (followed by restarting of hostapd).
diff --git a/hostapd-0.8/hostapd/config_file.c b/hostapd-0.8/hostapd/config_file.c
deleted file mode 100644
index 11c8bf0..0000000
--- a/hostapd-0.8/hostapd/config_file.c
+++ /dev/null
@@ -1,2119 +0,0 @@
-/*
- * hostapd / Configuration file parser
- * Copyright (c) 2003-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-#ifndef CONFIG_NATIVE_WINDOWS
-#include
-#endif /* CONFIG_NATIVE_WINDOWS */
-
-#include "utils/common.h"
-#include "utils/uuid.h"
-#include "common/ieee802_11_defs.h"
-#include "drivers/driver.h"
-#include "eap_server/eap.h"
-#include "radius/radius_client.h"
-#include "ap/wpa_auth.h"
-#include "ap/ap_config.h"
-#include "config_file.h"
-
-
-extern struct wpa_driver_ops *wpa_drivers[];
-
-
-#ifndef CONFIG_NO_VLAN
-static int hostapd_config_read_vlan_file(struct hostapd_bss_config *bss,
- const char *fname)
-{
- FILE *f;
- char buf[128], *pos, *pos2;
- int line = 0, vlan_id;
- struct hostapd_vlan *vlan;
-
- f = fopen(fname, "r");
- if (!f) {
- wpa_printf(MSG_ERROR, "VLAN file '%s' not readable.", fname);
- return -1;
- }
-
- while (fgets(buf, sizeof(buf), f)) {
- line++;
-
- if (buf[0] == '#')
- continue;
- pos = buf;
- while (*pos != '\0') {
- if (*pos == '\n') {
- *pos = '\0';
- break;
- }
- pos++;
- }
- if (buf[0] == '\0')
- continue;
-
- if (buf[0] == '*') {
- vlan_id = VLAN_ID_WILDCARD;
- pos = buf + 1;
- } else {
- vlan_id = strtol(buf, &pos, 10);
- if (buf == pos || vlan_id < 1 ||
- vlan_id > MAX_VLAN_ID) {
- wpa_printf(MSG_ERROR, "Invalid VLAN ID at "
- "line %d in '%s'", line, fname);
- fclose(f);
- return -1;
- }
- }
-
- while (*pos == ' ' || *pos == '\t')
- pos++;
- pos2 = pos;
- while (*pos2 != ' ' && *pos2 != '\t' && *pos2 != '\0')
- pos2++;
- *pos2 = '\0';
- if (*pos == '\0' || os_strlen(pos) > IFNAMSIZ) {
- wpa_printf(MSG_ERROR, "Invalid VLAN ifname at line %d "
- "in '%s'", line, fname);
- fclose(f);
- return -1;
- }
-
- vlan = os_malloc(sizeof(*vlan));
- if (vlan == NULL) {
- wpa_printf(MSG_ERROR, "Out of memory while reading "
- "VLAN interfaces from '%s'", fname);
- fclose(f);
- return -1;
- }
-
- os_memset(vlan, 0, sizeof(*vlan));
- vlan->vlan_id = vlan_id;
- os_strlcpy(vlan->ifname, pos, sizeof(vlan->ifname));
- if (bss->vlan_tail)
- bss->vlan_tail->next = vlan;
- else
- bss->vlan = vlan;
- bss->vlan_tail = vlan;
- }
-
- fclose(f);
-
- return 0;
-}
-#endif /* CONFIG_NO_VLAN */
-
-
-static int hostapd_acl_comp(const void *a, const void *b)
-{
- const struct mac_acl_entry *aa = a;
- const struct mac_acl_entry *bb = b;
- return os_memcmp(aa->addr, bb->addr, sizeof(macaddr));
-}
-
-
-static int hostapd_config_read_maclist(const char *fname,
- struct mac_acl_entry **acl, int *num)
-{
- FILE *f;
- char buf[128], *pos;
- int line = 0;
- u8 addr[ETH_ALEN];
- struct mac_acl_entry *newacl;
- int vlan_id;
-
- if (!fname)
- return 0;
-
- f = fopen(fname, "r");
- if (!f) {
- wpa_printf(MSG_ERROR, "MAC list file '%s' not found.", fname);
- return -1;
- }
-
- while (fgets(buf, sizeof(buf), f)) {
- line++;
-
- if (buf[0] == '#')
- continue;
- pos = buf;
- while (*pos != '\0') {
- if (*pos == '\n') {
- *pos = '\0';
- break;
- }
- pos++;
- }
- if (buf[0] == '\0')
- continue;
-
- if (hwaddr_aton(buf, addr)) {
- wpa_printf(MSG_ERROR, "Invalid MAC address '%s' at "
- "line %d in '%s'", buf, line, fname);
- fclose(f);
- return -1;
- }
-
- vlan_id = 0;
- pos = buf;
- while (*pos != '\0' && *pos != ' ' && *pos != '\t')
- pos++;
- while (*pos == ' ' || *pos == '\t')
- pos++;
- if (*pos != '\0')
- vlan_id = atoi(pos);
-
- newacl = os_realloc(*acl, (*num + 1) * sizeof(**acl));
- if (newacl == NULL) {
- wpa_printf(MSG_ERROR, "MAC list reallocation failed");
- fclose(f);
- return -1;
- }
-
- *acl = newacl;
- os_memcpy((*acl)[*num].addr, addr, ETH_ALEN);
- (*acl)[*num].vlan_id = vlan_id;
- (*num)++;
- }
-
- fclose(f);
-
- qsort(*acl, *num, sizeof(**acl), hostapd_acl_comp);
-
- return 0;
-}
-
-
-#ifdef EAP_SERVER
-static int hostapd_config_read_eap_user(const char *fname,
- struct hostapd_bss_config *conf)
-{
- FILE *f;
- char buf[512], *pos, *start, *pos2;
- int line = 0, ret = 0, num_methods;
- struct hostapd_eap_user *user, *tail = NULL;
-
- if (!fname)
- return 0;
-
- f = fopen(fname, "r");
- if (!f) {
- wpa_printf(MSG_ERROR, "EAP user file '%s' not found.", fname);
- return -1;
- }
-
- /* Lines: "user" METHOD,METHOD2 "password" (password optional) */
- while (fgets(buf, sizeof(buf), f)) {
- line++;
-
- if (buf[0] == '#')
- continue;
- pos = buf;
- while (*pos != '\0') {
- if (*pos == '\n') {
- *pos = '\0';
- break;
- }
- pos++;
- }
- if (buf[0] == '\0')
- continue;
-
- user = NULL;
-
- if (buf[0] != '"' && buf[0] != '*') {
- wpa_printf(MSG_ERROR, "Invalid EAP identity (no \" in "
- "start) on line %d in '%s'", line, fname);
- goto failed;
- }
-
- user = os_zalloc(sizeof(*user));
- if (user == NULL) {
- wpa_printf(MSG_ERROR, "EAP user allocation failed");
- goto failed;
- }
- user->force_version = -1;
-
- if (buf[0] == '*') {
- pos = buf;
- } else {
- pos = buf + 1;
- start = pos;
- while (*pos != '"' && *pos != '\0')
- pos++;
- if (*pos == '\0') {
- wpa_printf(MSG_ERROR, "Invalid EAP identity "
- "(no \" in end) on line %d in '%s'",
- line, fname);
- goto failed;
- }
-
- user->identity = os_malloc(pos - start);
- if (user->identity == NULL) {
- wpa_printf(MSG_ERROR, "Failed to allocate "
- "memory for EAP identity");
- goto failed;
- }
- os_memcpy(user->identity, start, pos - start);
- user->identity_len = pos - start;
-
- if (pos[0] == '"' && pos[1] == '*') {
- user->wildcard_prefix = 1;
- pos++;
- }
- }
- pos++;
- while (*pos == ' ' || *pos == '\t')
- pos++;
-
- if (*pos == '\0') {
- wpa_printf(MSG_ERROR, "No EAP method on line %d in "
- "'%s'", line, fname);
- goto failed;
- }
-
- start = pos;
- while (*pos != ' ' && *pos != '\t' && *pos != '\0')
- pos++;
- if (*pos == '\0') {
- pos = NULL;
- } else {
- *pos = '\0';
- pos++;
- }
- num_methods = 0;
- while (*start) {
- char *pos3 = os_strchr(start, ',');
- if (pos3) {
- *pos3++ = '\0';
- }
- user->methods[num_methods].method =
- eap_server_get_type(
- start,
- &user->methods[num_methods].vendor);
- if (user->methods[num_methods].vendor ==
- EAP_VENDOR_IETF &&
- user->methods[num_methods].method == EAP_TYPE_NONE)
- {
- if (os_strcmp(start, "TTLS-PAP") == 0) {
- user->ttls_auth |= EAP_TTLS_AUTH_PAP;
- goto skip_eap;
- }
- if (os_strcmp(start, "TTLS-CHAP") == 0) {
- user->ttls_auth |= EAP_TTLS_AUTH_CHAP;
- goto skip_eap;
- }
- if (os_strcmp(start, "TTLS-MSCHAP") == 0) {
- user->ttls_auth |=
- EAP_TTLS_AUTH_MSCHAP;
- goto skip_eap;
- }
- if (os_strcmp(start, "TTLS-MSCHAPV2") == 0) {
- user->ttls_auth |=
- EAP_TTLS_AUTH_MSCHAPV2;
- goto skip_eap;
- }
- wpa_printf(MSG_ERROR, "Unsupported EAP type "
- "'%s' on line %d in '%s'",
- start, line, fname);
- goto failed;
- }
-
- num_methods++;
- if (num_methods >= EAP_USER_MAX_METHODS)
- break;
- skip_eap:
- if (pos3 == NULL)
- break;
- start = pos3;
- }
- if (num_methods == 0 && user->ttls_auth == 0) {
- wpa_printf(MSG_ERROR, "No EAP types configured on "
- "line %d in '%s'", line, fname);
- goto failed;
- }
-
- if (pos == NULL)
- goto done;
-
- while (*pos == ' ' || *pos == '\t')
- pos++;
- if (*pos == '\0')
- goto done;
-
- if (os_strncmp(pos, "[ver=0]", 7) == 0) {
- user->force_version = 0;
- goto done;
- }
-
- if (os_strncmp(pos, "[ver=1]", 7) == 0) {
- user->force_version = 1;
- goto done;
- }
-
- if (os_strncmp(pos, "[2]", 3) == 0) {
- user->phase2 = 1;
- goto done;
- }
-
- if (*pos == '"') {
- pos++;
- start = pos;
- while (*pos != '"' && *pos != '\0')
- pos++;
- if (*pos == '\0') {
- wpa_printf(MSG_ERROR, "Invalid EAP password "
- "(no \" in end) on line %d in '%s'",
- line, fname);
- goto failed;
- }
-
- user->password = os_malloc(pos - start);
- if (user->password == NULL) {
- wpa_printf(MSG_ERROR, "Failed to allocate "
- "memory for EAP password");
- goto failed;
- }
- os_memcpy(user->password, start, pos - start);
- user->password_len = pos - start;
-
- pos++;
- } else if (os_strncmp(pos, "hash:", 5) == 0) {
- pos += 5;
- pos2 = pos;
- while (*pos2 != '\0' && *pos2 != ' ' &&
- *pos2 != '\t' && *pos2 != '#')
- pos2++;
- if (pos2 - pos != 32) {
- wpa_printf(MSG_ERROR, "Invalid password hash "
- "on line %d in '%s'", line, fname);
- goto failed;
- }
- user->password = os_malloc(16);
- if (user->password == NULL) {
- wpa_printf(MSG_ERROR, "Failed to allocate "
- "memory for EAP password hash");
- goto failed;
- }
- if (hexstr2bin(pos, user->password, 16) < 0) {
- wpa_printf(MSG_ERROR, "Invalid hash password "
- "on line %d in '%s'", line, fname);
- goto failed;
- }
- user->password_len = 16;
- user->password_hash = 1;
- pos = pos2;
- } else {
- pos2 = pos;
- while (*pos2 != '\0' && *pos2 != ' ' &&
- *pos2 != '\t' && *pos2 != '#')
- pos2++;
- if ((pos2 - pos) & 1) {
- wpa_printf(MSG_ERROR, "Invalid hex password "
- "on line %d in '%s'", line, fname);
- goto failed;
- }
- user->password = os_malloc((pos2 - pos) / 2);
- if (user->password == NULL) {
- wpa_printf(MSG_ERROR, "Failed to allocate "
- "memory for EAP password");
- goto failed;
- }
- if (hexstr2bin(pos, user->password,
- (pos2 - pos) / 2) < 0) {
- wpa_printf(MSG_ERROR, "Invalid hex password "
- "on line %d in '%s'", line, fname);
- goto failed;
- }
- user->password_len = (pos2 - pos) / 2;
- pos = pos2;
- }
-
- while (*pos == ' ' || *pos == '\t')
- pos++;
- if (os_strncmp(pos, "[2]", 3) == 0) {
- user->phase2 = 1;
- }
-
- done:
- if (tail == NULL) {
- tail = conf->eap_user = user;
- } else {
- tail->next = user;
- tail = user;
- }
- continue;
-
- failed:
- if (user) {
- os_free(user->password);
- os_free(user->identity);
- os_free(user);
- }
- ret = -1;
- break;
- }
-
- fclose(f);
-
- return ret;
-}
-#endif /* EAP_SERVER */
-
-
-#ifndef CONFIG_NO_RADIUS
-static int
-hostapd_config_read_radius_addr(struct hostapd_radius_server **server,
- int *num_server, const char *val, int def_port,
- struct hostapd_radius_server **curr_serv)
-{
- struct hostapd_radius_server *nserv;
- int ret;
- static int server_index = 1;
-
- nserv = os_realloc(*server, (*num_server + 1) * sizeof(*nserv));
- if (nserv == NULL)
- return -1;
-
- *server = nserv;
- nserv = &nserv[*num_server];
- (*num_server)++;
- (*curr_serv) = nserv;
-
- os_memset(nserv, 0, sizeof(*nserv));
- nserv->port = def_port;
- ret = hostapd_parse_ip_addr(val, &nserv->addr);
- nserv->index = server_index++;
-
- return ret;
-}
-#endif /* CONFIG_NO_RADIUS */
-
-
-static int hostapd_config_parse_key_mgmt(int line, const char *value)
-{
- int val = 0, last;
- char *start, *end, *buf;
-
- buf = os_strdup(value);
- if (buf == NULL)
- return -1;
- start = buf;
-
- while (*start != '\0') {
- while (*start == ' ' || *start == '\t')
- start++;
- if (*start == '\0')
- break;
- end = start;
- while (*end != ' ' && *end != '\t' && *end != '\0')
- end++;
- last = *end == '\0';
- *end = '\0';
- if (os_strcmp(start, "WPA-PSK") == 0)
- val |= WPA_KEY_MGMT_PSK;
- else if (os_strcmp(start, "WPA-EAP") == 0)
- val |= WPA_KEY_MGMT_IEEE8021X;
-#ifdef CONFIG_IEEE80211R
- else if (os_strcmp(start, "FT-PSK") == 0)
- val |= WPA_KEY_MGMT_FT_PSK;
- else if (os_strcmp(start, "FT-EAP") == 0)
- val |= WPA_KEY_MGMT_FT_IEEE8021X;
-#endif /* CONFIG_IEEE80211R */
-#ifdef CONFIG_IEEE80211W
- else if (os_strcmp(start, "WPA-PSK-SHA256") == 0)
- val |= WPA_KEY_MGMT_PSK_SHA256;
- else if (os_strcmp(start, "WPA-EAP-SHA256") == 0)
- val |= WPA_KEY_MGMT_IEEE8021X_SHA256;
-#endif /* CONFIG_IEEE80211W */
- else {
- wpa_printf(MSG_ERROR, "Line %d: invalid key_mgmt '%s'",
- line, start);
- os_free(buf);
- return -1;
- }
-
- if (last)
- break;
- start = end + 1;
- }
-
- os_free(buf);
- if (val == 0) {
- wpa_printf(MSG_ERROR, "Line %d: no key_mgmt values "
- "configured.", line);
- return -1;
- }
-
- return val;
-}
-
-
-static int hostapd_config_parse_cipher(int line, const char *value)
-{
- int val = 0, last;
- char *start, *end, *buf;
-
- buf = os_strdup(value);
- if (buf == NULL)
- return -1;
- start = buf;
-
- while (*start != '\0') {
- while (*start == ' ' || *start == '\t')
- start++;
- if (*start == '\0')
- break;
- end = start;
- while (*end != ' ' && *end != '\t' && *end != '\0')
- end++;
- last = *end == '\0';
- *end = '\0';
- if (os_strcmp(start, "CCMP") == 0)
- val |= WPA_CIPHER_CCMP;
- else if (os_strcmp(start, "TKIP") == 0)
- val |= WPA_CIPHER_TKIP;
- else if (os_strcmp(start, "WEP104") == 0)
- val |= WPA_CIPHER_WEP104;
- else if (os_strcmp(start, "WEP40") == 0)
- val |= WPA_CIPHER_WEP40;
- else if (os_strcmp(start, "NONE") == 0)
- val |= WPA_CIPHER_NONE;
- else {
- wpa_printf(MSG_ERROR, "Line %d: invalid cipher '%s'.",
- line, start);
- os_free(buf);
- return -1;
- }
-
- if (last)
- break;
- start = end + 1;
- }
- os_free(buf);
-
- if (val == 0) {
- wpa_printf(MSG_ERROR, "Line %d: no cipher values configured.",
- line);
- return -1;
- }
- return val;
-}
-
-
-static int hostapd_config_read_wep(struct hostapd_wep_keys *wep, int keyidx,
- char *val)
-{
- size_t len = os_strlen(val);
-
- if (keyidx < 0 || keyidx > 3 || wep->key[keyidx] != NULL)
- return -1;
-
- if (val[0] == '"') {
- if (len < 2 || val[len - 1] != '"')
- return -1;
- len -= 2;
- wep->key[keyidx] = os_malloc(len);
- if (wep->key[keyidx] == NULL)
- return -1;
- os_memcpy(wep->key[keyidx], val + 1, len);
- wep->len[keyidx] = len;
- } else {
- if (len & 1)
- return -1;
- len /= 2;
- wep->key[keyidx] = os_malloc(len);
- if (wep->key[keyidx] == NULL)
- return -1;
- wep->len[keyidx] = len;
- if (hexstr2bin(val, wep->key[keyidx], len) < 0)
- return -1;
- }
-
- wep->keys_set++;
-
- return 0;
-}
-
-
-static int hostapd_parse_rates(int **rate_list, char *val)
-{
- int *list;
- int count;
- char *pos, *end;
-
- os_free(*rate_list);
- *rate_list = NULL;
-
- pos = val;
- count = 0;
- while (*pos != '\0') {
- if (*pos == ' ')
- count++;
- pos++;
- }
-
- list = os_malloc(sizeof(int) * (count + 2));
- if (list == NULL)
- return -1;
- pos = val;
- count = 0;
- while (*pos != '\0') {
- end = os_strchr(pos, ' ');
- if (end)
- *end = '\0';
-
- list[count++] = atoi(pos);
- if (!end)
- break;
- pos = end + 1;
- }
- list[count] = -1;
-
- *rate_list = list;
- return 0;
-}
-
-
-static int hostapd_config_bss(struct hostapd_config *conf, const char *ifname)
-{
- struct hostapd_bss_config *bss;
-
- if (*ifname == '\0')
- return -1;
-
- bss = os_realloc(conf->bss, (conf->num_bss + 1) *
- sizeof(struct hostapd_bss_config));
- if (bss == NULL) {
- wpa_printf(MSG_ERROR, "Failed to allocate memory for "
- "multi-BSS entry");
- return -1;
- }
- conf->bss = bss;
-
- bss = &(conf->bss[conf->num_bss]);
- os_memset(bss, 0, sizeof(*bss));
- bss->radius = os_zalloc(sizeof(*bss->radius));
- if (bss->radius == NULL) {
- wpa_printf(MSG_ERROR, "Failed to allocate memory for "
- "multi-BSS RADIUS data");
- return -1;
- }
-
- conf->num_bss++;
- conf->last_bss = bss;
-
- hostapd_config_defaults_bss(bss);
- os_strlcpy(bss->iface, ifname, sizeof(bss->iface));
- os_memcpy(bss->ssid.vlan, bss->iface, IFNAMSIZ + 1);
-
- return 0;
-}
-
-
-/* convert floats with one decimal place to value*10 int, i.e.,
- * "1.5" will return 15 */
-static int hostapd_config_read_int10(const char *value)
-{
- int i, d;
- char *pos;
-
- i = atoi(value);
- pos = os_strchr(value, '.');
- d = 0;
- if (pos) {
- pos++;
- if (*pos >= '0' && *pos <= '9')
- d = *pos - '0';
- }
-
- return i * 10 + d;
-}
-
-
-static int valid_cw(int cw)
-{
- return (cw == 1 || cw == 3 || cw == 7 || cw == 15 || cw == 31 ||
- cw == 63 || cw == 127 || cw == 255 || cw == 511 || cw == 1023);
-}
-
-
-enum {
- IEEE80211_TX_QUEUE_DATA0 = 0, /* used for EDCA AC_VO data */
- IEEE80211_TX_QUEUE_DATA1 = 1, /* used for EDCA AC_VI data */
- IEEE80211_TX_QUEUE_DATA2 = 2, /* used for EDCA AC_BE data */
- IEEE80211_TX_QUEUE_DATA3 = 3 /* used for EDCA AC_BK data */
-};
-
-static int hostapd_config_tx_queue(struct hostapd_config *conf, char *name,
- char *val)
-{
- int num;
- char *pos;
- struct hostapd_tx_queue_params *queue;
-
- /* skip 'tx_queue_' prefix */
- pos = name + 9;
- if (os_strncmp(pos, "data", 4) == 0 &&
- pos[4] >= '0' && pos[4] <= '9' && pos[5] == '_') {
- num = pos[4] - '0';
- pos += 6;
- } else if (os_strncmp(pos, "after_beacon_", 13) == 0 ||
- os_strncmp(pos, "beacon_", 7) == 0) {
- wpa_printf(MSG_INFO, "DEPRECATED: '%s' not used", name);
- return 0;
- } else {
- wpa_printf(MSG_ERROR, "Unknown tx_queue name '%s'", pos);
- return -1;
- }
-
- if (num >= NUM_TX_QUEUES) {
- /* for backwards compatibility, do not trigger failure */
- wpa_printf(MSG_INFO, "DEPRECATED: '%s' not used", name);
- return 0;
- }
-
- queue = &conf->tx_queue[num];
-
- if (os_strcmp(pos, "aifs") == 0) {
- queue->aifs = atoi(val);
- if (queue->aifs < 0 || queue->aifs > 255) {
- wpa_printf(MSG_ERROR, "Invalid AIFS value %d",
- queue->aifs);
- return -1;
- }
- } else if (os_strcmp(pos, "cwmin") == 0) {
- queue->cwmin = atoi(val);
- if (!valid_cw(queue->cwmin)) {
- wpa_printf(MSG_ERROR, "Invalid cwMin value %d",
- queue->cwmin);
- return -1;
- }
- } else if (os_strcmp(pos, "cwmax") == 0) {
- queue->cwmax = atoi(val);
- if (!valid_cw(queue->cwmax)) {
- wpa_printf(MSG_ERROR, "Invalid cwMax value %d",
- queue->cwmax);
- return -1;
- }
- } else if (os_strcmp(pos, "burst") == 0) {
- queue->burst = hostapd_config_read_int10(val);
- } else {
- wpa_printf(MSG_ERROR, "Unknown tx_queue field '%s'", pos);
- return -1;
- }
-
- return 0;
-}
-
-
-static int hostapd_config_wmm_ac(struct hostapd_config *conf, char *name,
- char *val)
-{
- int num, v;
- char *pos;
- struct hostapd_wmm_ac_params *ac;
-
- /* skip 'wme_ac_' or 'wmm_ac_' prefix */
- pos = name + 7;
- if (os_strncmp(pos, "be_", 3) == 0) {
- num = 0;
- pos += 3;
- } else if (os_strncmp(pos, "bk_", 3) == 0) {
- num = 1;
- pos += 3;
- } else if (os_strncmp(pos, "vi_", 3) == 0) {
- num = 2;
- pos += 3;
- } else if (os_strncmp(pos, "vo_", 3) == 0) {
- num = 3;
- pos += 3;
- } else {
- wpa_printf(MSG_ERROR, "Unknown WMM name '%s'", pos);
- return -1;
- }
-
- ac = &conf->wmm_ac_params[num];
-
- if (os_strcmp(pos, "aifs") == 0) {
- v = atoi(val);
- if (v < 1 || v > 255) {
- wpa_printf(MSG_ERROR, "Invalid AIFS value %d", v);
- return -1;
- }
- ac->aifs = v;
- } else if (os_strcmp(pos, "cwmin") == 0) {
- v = atoi(val);
- if (v < 0 || v > 12) {
- wpa_printf(MSG_ERROR, "Invalid cwMin value %d", v);
- return -1;
- }
- ac->cwmin = v;
- } else if (os_strcmp(pos, "cwmax") == 0) {
- v = atoi(val);
- if (v < 0 || v > 12) {
- wpa_printf(MSG_ERROR, "Invalid cwMax value %d", v);
- return -1;
- }
- ac->cwmax = v;
- } else if (os_strcmp(pos, "txop_limit") == 0) {
- v = atoi(val);
- if (v < 0 || v > 0xffff) {
- wpa_printf(MSG_ERROR, "Invalid txop value %d", v);
- return -1;
- }
- ac->txop_limit = v;
- } else if (os_strcmp(pos, "acm") == 0) {
- v = atoi(val);
- if (v < 0 || v > 1) {
- wpa_printf(MSG_ERROR, "Invalid acm value %d", v);
- return -1;
- }
- ac->admission_control_mandatory = v;
- } else {
- wpa_printf(MSG_ERROR, "Unknown wmm_ac_ field '%s'", pos);
- return -1;
- }
-
- return 0;
-}
-
-
-#ifdef CONFIG_IEEE80211R
-static int add_r0kh(struct hostapd_bss_config *bss, char *value)
-{
- struct ft_remote_r0kh *r0kh;
- char *pos, *next;
-
- r0kh = os_zalloc(sizeof(*r0kh));
- if (r0kh == NULL)
- return -1;
-
- /* 02:01:02:03:04:05 a.example.com 000102030405060708090a0b0c0d0e0f */
- pos = value;
- next = os_strchr(pos, ' ');
- if (next)
- *next++ = '\0';
- if (next == NULL || hwaddr_aton(pos, r0kh->addr)) {
- wpa_printf(MSG_ERROR, "Invalid R0KH MAC address: '%s'", pos);
- os_free(r0kh);
- return -1;
- }
-
- pos = next;
- next = os_strchr(pos, ' ');
- if (next)
- *next++ = '\0';
- if (next == NULL || next - pos > FT_R0KH_ID_MAX_LEN) {
- wpa_printf(MSG_ERROR, "Invalid R0KH-ID: '%s'", pos);
- os_free(r0kh);
- return -1;
- }
- r0kh->id_len = next - pos - 1;
- os_memcpy(r0kh->id, pos, r0kh->id_len);
-
- pos = next;
- if (hexstr2bin(pos, r0kh->key, sizeof(r0kh->key))) {
- wpa_printf(MSG_ERROR, "Invalid R0KH key: '%s'", pos);
- os_free(r0kh);
- return -1;
- }
-
- r0kh->next = bss->r0kh_list;
- bss->r0kh_list = r0kh;
-
- return 0;
-}
-
-
-static int add_r1kh(struct hostapd_bss_config *bss, char *value)
-{
- struct ft_remote_r1kh *r1kh;
- char *pos, *next;
-
- r1kh = os_zalloc(sizeof(*r1kh));
- if (r1kh == NULL)
- return -1;
-
- /* 02:01:02:03:04:05 02:01:02:03:04:05
- * 000102030405060708090a0b0c0d0e0f */
- pos = value;
- next = os_strchr(pos, ' ');
- if (next)
- *next++ = '\0';
- if (next == NULL || hwaddr_aton(pos, r1kh->addr)) {
- wpa_printf(MSG_ERROR, "Invalid R1KH MAC address: '%s'", pos);
- os_free(r1kh);
- return -1;
- }
-
- pos = next;
- next = os_strchr(pos, ' ');
- if (next)
- *next++ = '\0';
- if (next == NULL || hwaddr_aton(pos, r1kh->id)) {
- wpa_printf(MSG_ERROR, "Invalid R1KH-ID: '%s'", pos);
- os_free(r1kh);
- return -1;
- }
-
- pos = next;
- if (hexstr2bin(pos, r1kh->key, sizeof(r1kh->key))) {
- wpa_printf(MSG_ERROR, "Invalid R1KH key: '%s'", pos);
- os_free(r1kh);
- return -1;
- }
-
- r1kh->next = bss->r1kh_list;
- bss->r1kh_list = r1kh;
-
- return 0;
-}
-#endif /* CONFIG_IEEE80211R */
-
-
-#ifdef CONFIG_IEEE80211N
-static int hostapd_config_ht_capab(struct hostapd_config *conf,
- const char *capab)
-{
- if (os_strstr(capab, "[LDPC]"))
- conf->ht_capab |= HT_CAP_INFO_LDPC_CODING_CAP;
- if (os_strstr(capab, "[HT40-]")) {
- conf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
- conf->secondary_channel = -1;
- }
- if (os_strstr(capab, "[HT40+]")) {
- conf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
- conf->secondary_channel = 1;
- }
- if (os_strstr(capab, "[SMPS-STATIC]")) {
- conf->ht_capab &= ~HT_CAP_INFO_SMPS_MASK;
- conf->ht_capab |= HT_CAP_INFO_SMPS_STATIC;
- }
- if (os_strstr(capab, "[SMPS-DYNAMIC]")) {
- conf->ht_capab &= ~HT_CAP_INFO_SMPS_MASK;
- conf->ht_capab |= HT_CAP_INFO_SMPS_DYNAMIC;
- }
- if (os_strstr(capab, "[GF]"))
- conf->ht_capab |= HT_CAP_INFO_GREEN_FIELD;
- if (os_strstr(capab, "[SHORT-GI-20]"))
- conf->ht_capab |= HT_CAP_INFO_SHORT_GI20MHZ;
- if (os_strstr(capab, "[SHORT-GI-40]"))
- conf->ht_capab |= HT_CAP_INFO_SHORT_GI40MHZ;
- if (os_strstr(capab, "[TX-STBC]"))
- conf->ht_capab |= HT_CAP_INFO_TX_STBC;
- if (os_strstr(capab, "[RX-STBC1]")) {
- conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK;
- conf->ht_capab |= HT_CAP_INFO_RX_STBC_1;
- }
- if (os_strstr(capab, "[RX-STBC12]")) {
- conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK;
- conf->ht_capab |= HT_CAP_INFO_RX_STBC_12;
- }
- if (os_strstr(capab, "[RX-STBC123]")) {
- conf->ht_capab &= ~HT_CAP_INFO_RX_STBC_MASK;
- conf->ht_capab |= HT_CAP_INFO_RX_STBC_123;
- }
- if (os_strstr(capab, "[DELAYED-BA]"))
- conf->ht_capab |= HT_CAP_INFO_DELAYED_BA;
- if (os_strstr(capab, "[MAX-AMSDU-7935]"))
- conf->ht_capab |= HT_CAP_INFO_MAX_AMSDU_SIZE;
- if (os_strstr(capab, "[DSSS_CCK-40]"))
- conf->ht_capab |= HT_CAP_INFO_DSSS_CCK40MHZ;
- if (os_strstr(capab, "[PSMP]"))
- conf->ht_capab |= HT_CAP_INFO_PSMP_SUPP;
- if (os_strstr(capab, "[LSIG-TXOP-PROT]"))
- conf->ht_capab |= HT_CAP_INFO_LSIG_TXOP_PROTECT_SUPPORT;
-
- return 0;
-}
-#endif /* CONFIG_IEEE80211N */
-
-
-static int hostapd_config_check_bss(struct hostapd_bss_config *bss,
- struct hostapd_config *conf)
-{
- if (bss->ieee802_1x && !bss->eap_server &&
- !bss->radius->auth_servers) {
- wpa_printf(MSG_ERROR, "Invalid IEEE 802.1X configuration (no "
- "EAP authenticator configured).");
- return -1;
- }
-
- if (bss->wpa && (bss->wpa_key_mgmt & WPA_KEY_MGMT_PSK) &&
- bss->ssid.wpa_psk == NULL && bss->ssid.wpa_passphrase == NULL &&
- bss->ssid.wpa_psk_file == NULL) {
- wpa_printf(MSG_ERROR, "WPA-PSK enabled, but PSK or passphrase "
- "is not configured.");
- return -1;
- }
-
- if (hostapd_mac_comp_empty(bss->bssid) != 0) {
- size_t i;
-
- for (i = 0; i < conf->num_bss; i++) {
- if ((&conf->bss[i] != bss) &&
- (hostapd_mac_comp(conf->bss[i].bssid,
- bss->bssid) == 0)) {
- wpa_printf(MSG_ERROR, "Duplicate BSSID " MACSTR
- " on interface '%s' and '%s'.",
- MAC2STR(bss->bssid),
- conf->bss[i].iface, bss->iface);
- return -1;
- }
- }
- }
-
-#ifdef CONFIG_IEEE80211R
- if ((bss->wpa_key_mgmt &
- (WPA_KEY_MGMT_FT_PSK | WPA_KEY_MGMT_FT_IEEE8021X)) &&
- (bss->nas_identifier == NULL ||
- os_strlen(bss->nas_identifier) < 1 ||
- os_strlen(bss->nas_identifier) > FT_R0KH_ID_MAX_LEN)) {
- wpa_printf(MSG_ERROR, "FT (IEEE 802.11r) requires "
- "nas_identifier to be configured as a 1..48 octet "
- "string");
- return -1;
- }
-#endif /* CONFIG_IEEE80211R */
-
-#ifdef CONFIG_IEEE80211N
- if (conf->ieee80211n &&
- bss->ssid.security_policy == SECURITY_STATIC_WEP) {
- bss->disable_11n = 1;
- wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WEP is not "
- "allowed, disabling HT capabilities");
- }
-
- if (conf->ieee80211n && bss->wpa &&
- !(bss->wpa_pairwise & WPA_CIPHER_CCMP) &&
- !(bss->rsn_pairwise & WPA_CIPHER_CCMP)) {
- bss->disable_11n = 1;
- wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WPA/WPA2 "
- "requires CCMP to be enabled, disabling HT "
- "capabilities");
- }
-#endif /* CONFIG_IEEE80211N */
-
-#ifdef CONFIG_WPS2
- if (bss->wps_state && bss->ignore_broadcast_ssid) {
- wpa_printf(MSG_INFO, "WPS: ignore_broadcast_ssid "
- "configuration forced WPS to be disabled");
- bss->wps_state = 0;
- }
-
- if (bss->wps_state && bss->ssid.wep.keys_set && bss->wpa == 0) {
- wpa_printf(MSG_INFO, "WPS: WEP configuration forced WPS to be "
- "disabled");
- bss->wps_state = 0;
- }
-#endif /* CONFIG_WPS2 */
-
- return 0;
-}
-
-
-static int hostapd_config_check(struct hostapd_config *conf)
-{
- size_t i;
-
- if (conf->ieee80211d && (!conf->country[0] || !conf->country[1])) {
- wpa_printf(MSG_ERROR, "Cannot enable IEEE 802.11d without "
- "setting the country_code");
- return -1;
- }
-
- for (i = 0; i < conf->num_bss; i++) {
- if (hostapd_config_check_bss(&conf->bss[i], conf))
- return -1;
- }
-
- return 0;
-}
-
-
-/**
- * hostapd_config_read - Read and parse a configuration file
- * @fname: Configuration file name (including path, if needed)
- * Returns: Allocated configuration data structure
- */
-struct hostapd_config * hostapd_config_read(const char *fname)
-{
- struct hostapd_config *conf;
- struct hostapd_bss_config *bss;
- FILE *f;
- char buf[256], *pos;
- int line = 0;
- int errors = 0;
- int pairwise;
- size_t i;
-
- f = fopen(fname, "r");
- if (f == NULL) {
- wpa_printf(MSG_ERROR, "Could not open configuration file '%s' "
- "for reading.", fname);
- return NULL;
- }
-
- conf = hostapd_config_defaults();
- if (conf == NULL) {
- fclose(f);
- return NULL;
- }
-
- /* set default driver based on configuration */
- conf->driver = wpa_drivers[0];
- if (conf->driver == NULL) {
- wpa_printf(MSG_ERROR, "No driver wrappers registered!");
- hostapd_config_free(conf);
- fclose(f);
- return NULL;
- }
-
- bss = conf->last_bss = conf->bss;
-
- while (fgets(buf, sizeof(buf), f)) {
- bss = conf->last_bss;
- line++;
-
- if (buf[0] == '#')
- continue;
- pos = buf;
- while (*pos != '\0') {
- if (*pos == '\n') {
- *pos = '\0';
- break;
- }
- pos++;
- }
- if (buf[0] == '\0')
- continue;
-
- pos = os_strchr(buf, '=');
- if (pos == NULL) {
- wpa_printf(MSG_ERROR, "Line %d: invalid line '%s'",
- line, buf);
- errors++;
- continue;
- }
- *pos = '\0';
- pos++;
-
- if (os_strcmp(buf, "interface") == 0) {
- os_strlcpy(conf->bss[0].iface, pos,
- sizeof(conf->bss[0].iface));
- } else if (os_strcmp(buf, "bridge") == 0) {
- os_strlcpy(bss->bridge, pos, sizeof(bss->bridge));
- } else if (os_strcmp(buf, "wds_bridge") == 0) {
- os_strlcpy(bss->wds_bridge, pos,
- sizeof(bss->wds_bridge));
- } else if (os_strcmp(buf, "driver") == 0) {
- int j;
- /* clear to get error below if setting is invalid */
- conf->driver = NULL;
- for (j = 0; wpa_drivers[j]; j++) {
- if (os_strcmp(pos, wpa_drivers[j]->name) == 0)
- {
- conf->driver = wpa_drivers[j];
- break;
- }
- }
- if (conf->driver == NULL) {
- wpa_printf(MSG_ERROR, "Line %d: invalid/"
- "unknown driver '%s'", line, pos);
- errors++;
- }
- } else if (os_strcmp(buf, "debug") == 0) {
- wpa_printf(MSG_DEBUG, "Line %d: DEPRECATED: 'debug' "
- "configuration variable is not used "
- "anymore", line);
- } else if (os_strcmp(buf, "logger_syslog_level") == 0) {
- bss->logger_syslog_level = atoi(pos);
- } else if (os_strcmp(buf, "logger_stdout_level") == 0) {
- bss->logger_stdout_level = atoi(pos);
- } else if (os_strcmp(buf, "logger_syslog") == 0) {
- bss->logger_syslog = atoi(pos);
- } else if (os_strcmp(buf, "logger_stdout") == 0) {
- bss->logger_stdout = atoi(pos);
- } else if (os_strcmp(buf, "dump_file") == 0) {
- bss->dump_log_name = os_strdup(pos);
- } else if (os_strcmp(buf, "ssid") == 0) {
- bss->ssid.ssid_len = os_strlen(pos);
- if (bss->ssid.ssid_len > HOSTAPD_MAX_SSID_LEN ||
- bss->ssid.ssid_len < 1) {
- wpa_printf(MSG_ERROR, "Line %d: invalid SSID "
- "'%s'", line, pos);
- errors++;
- } else {
- os_memcpy(bss->ssid.ssid, pos,
- bss->ssid.ssid_len);
- bss->ssid.ssid[bss->ssid.ssid_len] = '\0';
- bss->ssid.ssid_set = 1;
- }
- } else if (os_strcmp(buf, "macaddr_acl") == 0) {
- bss->macaddr_acl = atoi(pos);
- if (bss->macaddr_acl != ACCEPT_UNLESS_DENIED &&
- bss->macaddr_acl != DENY_UNLESS_ACCEPTED &&
- bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) {
- wpa_printf(MSG_ERROR, "Line %d: unknown "
- "macaddr_acl %d",
- line, bss->macaddr_acl);
- }
- } else if (os_strcmp(buf, "accept_mac_file") == 0) {
- if (hostapd_config_read_maclist(pos, &bss->accept_mac,
- &bss->num_accept_mac))
- {
- wpa_printf(MSG_ERROR, "Line %d: Failed to "
- "read accept_mac_file '%s'",
- line, pos);
- errors++;
- }
- } else if (os_strcmp(buf, "deny_mac_file") == 0) {
- if (hostapd_config_read_maclist(pos, &bss->deny_mac,
- &bss->num_deny_mac)) {
- wpa_printf(MSG_ERROR, "Line %d: Failed to "
- "read deny_mac_file '%s'",
- line, pos);
- errors++;
- }
- } else if (os_strcmp(buf, "wds_sta") == 0) {
- bss->wds_sta = atoi(pos);
- } else if (os_strcmp(buf, "ap_isolate") == 0) {
- bss->isolate = atoi(pos);
- } else if (os_strcmp(buf, "ap_max_inactivity") == 0) {
- bss->ap_max_inactivity = atoi(pos);
- } else if (os_strcmp(buf, "country_code") == 0) {
- os_memcpy(conf->country, pos, 2);
- /* FIX: make this configurable */
- conf->country[2] = ' ';
- } else if (os_strcmp(buf, "ieee80211d") == 0) {
- conf->ieee80211d = atoi(pos);
- } else if (os_strcmp(buf, "ieee8021x") == 0) {
- bss->ieee802_1x = atoi(pos);
- } else if (os_strcmp(buf, "eapol_version") == 0) {
- bss->eapol_version = atoi(pos);
- if (bss->eapol_version < 1 ||
- bss->eapol_version > 2) {
- wpa_printf(MSG_ERROR, "Line %d: invalid EAPOL "
- "version (%d): '%s'.",
- line, bss->eapol_version, pos);
- errors++;
- } else
- wpa_printf(MSG_DEBUG, "eapol_version=%d",
- bss->eapol_version);
-#ifdef EAP_SERVER
- } else if (os_strcmp(buf, "eap_authenticator") == 0) {
- bss->eap_server = atoi(pos);
- wpa_printf(MSG_ERROR, "Line %d: obsolete "
- "eap_authenticator used; this has been "
- "renamed to eap_server", line);
- } else if (os_strcmp(buf, "eap_server") == 0) {
- bss->eap_server = atoi(pos);
- } else if (os_strcmp(buf, "eap_user_file") == 0) {
- if (hostapd_config_read_eap_user(pos, bss))
- errors++;
- } else if (os_strcmp(buf, "ca_cert") == 0) {
- os_free(bss->ca_cert);
- bss->ca_cert = os_strdup(pos);
- } else if (os_strcmp(buf, "server_cert") == 0) {
- os_free(bss->server_cert);
- bss->server_cert = os_strdup(pos);
- } else if (os_strcmp(buf, "private_key") == 0) {
- os_free(bss->private_key);
- bss->private_key = os_strdup(pos);
- } else if (os_strcmp(buf, "private_key_passwd") == 0) {
- os_free(bss->private_key_passwd);
- bss->private_key_passwd = os_strdup(pos);
- } else if (os_strcmp(buf, "check_crl") == 0) {
- bss->check_crl = atoi(pos);
- } else if (os_strcmp(buf, "dh_file") == 0) {
- os_free(bss->dh_file);
- bss->dh_file = os_strdup(pos);
- } else if (os_strcmp(buf, "fragment_size") == 0) {
- bss->fragment_size = atoi(pos);
-#ifdef EAP_SERVER_FAST
- } else if (os_strcmp(buf, "pac_opaque_encr_key") == 0) {
- os_free(bss->pac_opaque_encr_key);
- bss->pac_opaque_encr_key = os_malloc(16);
- if (bss->pac_opaque_encr_key == NULL) {
- wpa_printf(MSG_ERROR, "Line %d: No memory for "
- "pac_opaque_encr_key", line);
- errors++;
- } else if (hexstr2bin(pos, bss->pac_opaque_encr_key,
- 16)) {
- wpa_printf(MSG_ERROR, "Line %d: Invalid "
- "pac_opaque_encr_key", line);
- errors++;
- }
- } else if (os_strcmp(buf, "eap_fast_a_id") == 0) {
- size_t idlen = os_strlen(pos);
- if (idlen & 1) {
- wpa_printf(MSG_ERROR, "Line %d: Invalid "
- "eap_fast_a_id", line);
- errors++;
- } else {
- os_free(bss->eap_fast_a_id);
- bss->eap_fast_a_id = os_malloc(idlen / 2);
- if (bss->eap_fast_a_id == NULL ||
- hexstr2bin(pos, bss->eap_fast_a_id,
- idlen / 2)) {
- wpa_printf(MSG_ERROR, "Line %d: "
- "Failed to parse "
- "eap_fast_a_id", line);
- errors++;
- } else
- bss->eap_fast_a_id_len = idlen / 2;
- }
- } else if (os_strcmp(buf, "eap_fast_a_id_info") == 0) {
- os_free(bss->eap_fast_a_id_info);
- bss->eap_fast_a_id_info = os_strdup(pos);
- } else if (os_strcmp(buf, "eap_fast_prov") == 0) {
- bss->eap_fast_prov = atoi(pos);
- } else if (os_strcmp(buf, "pac_key_lifetime") == 0) {
- bss->pac_key_lifetime = atoi(pos);
- } else if (os_strcmp(buf, "pac_key_refresh_time") == 0) {
- bss->pac_key_refresh_time = atoi(pos);
-#endif /* EAP_SERVER_FAST */
-#ifdef EAP_SERVER_SIM
- } else if (os_strcmp(buf, "eap_sim_db") == 0) {
- os_free(bss->eap_sim_db);
- bss->eap_sim_db = os_strdup(pos);
- } else if (os_strcmp(buf, "eap_sim_aka_result_ind") == 0) {
- bss->eap_sim_aka_result_ind = atoi(pos);
-#endif /* EAP_SERVER_SIM */
-#ifdef EAP_SERVER_TNC
- } else if (os_strcmp(buf, "tnc") == 0) {
- bss->tnc = atoi(pos);
-#endif /* EAP_SERVER_TNC */
-#ifdef EAP_SERVER_PWD
- } else if (os_strcmp(buf, "pwd_group") == 0) {
- bss->pwd_group = atoi(pos);
-#endif /* EAP_SERVER_PWD */
-#endif /* EAP_SERVER */
- } else if (os_strcmp(buf, "eap_message") == 0) {
- char *term;
- bss->eap_req_id_text = os_strdup(pos);
- if (bss->eap_req_id_text == NULL) {
- wpa_printf(MSG_ERROR, "Line %d: Failed to "
- "allocate memory for "
- "eap_req_id_text", line);
- errors++;
- continue;
- }
- bss->eap_req_id_text_len =
- os_strlen(bss->eap_req_id_text);
- term = os_strstr(bss->eap_req_id_text, "\\0");
- if (term) {
- *term++ = '\0';
- os_memmove(term, term + 1,
- bss->eap_req_id_text_len -
- (term - bss->eap_req_id_text) - 1);
- bss->eap_req_id_text_len--;
- }
- } else if (os_strcmp(buf, "wep_key_len_broadcast") == 0) {
- bss->default_wep_key_len = atoi(pos);
- if (bss->default_wep_key_len > 13) {
- wpa_printf(MSG_ERROR, "Line %d: invalid WEP "
- "key len %lu (= %lu bits)", line,
- (unsigned long)
- bss->default_wep_key_len,
- (unsigned long)
- bss->default_wep_key_len * 8);
- errors++;
- }
- } else if (os_strcmp(buf, "wep_key_len_unicast") == 0) {
- bss->individual_wep_key_len = atoi(pos);
- if (bss->individual_wep_key_len < 0 ||
- bss->individual_wep_key_len > 13) {
- wpa_printf(MSG_ERROR, "Line %d: invalid WEP "
- "key len %d (= %d bits)", line,
- bss->individual_wep_key_len,
- bss->individual_wep_key_len * 8);
- errors++;
- }
- } else if (os_strcmp(buf, "wep_rekey_period") == 0) {
- bss->wep_rekeying_period = atoi(pos);
- if (bss->wep_rekeying_period < 0) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "period %d",
- line, bss->wep_rekeying_period);
- errors++;
- }
- } else if (os_strcmp(buf, "eap_reauth_period") == 0) {
- bss->eap_reauth_period = atoi(pos);
- if (bss->eap_reauth_period < 0) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "period %d",
- line, bss->eap_reauth_period);
- errors++;
- }
- } else if (os_strcmp(buf, "eapol_key_index_workaround") == 0) {
- bss->eapol_key_index_workaround = atoi(pos);
-#ifdef CONFIG_IAPP
- } else if (os_strcmp(buf, "iapp_interface") == 0) {
- bss->ieee802_11f = 1;
- os_strlcpy(bss->iapp_iface, pos,
- sizeof(bss->iapp_iface));
-#endif /* CONFIG_IAPP */
- } else if (os_strcmp(buf, "own_ip_addr") == 0) {
- if (hostapd_parse_ip_addr(pos, &bss->own_ip_addr)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid IP "
- "address '%s'", line, pos);
- errors++;
- }
- } else if (os_strcmp(buf, "nas_identifier") == 0) {
- bss->nas_identifier = os_strdup(pos);
-#ifndef CONFIG_NO_RADIUS
- } else if (os_strcmp(buf, "auth_server_addr") == 0) {
- if (hostapd_config_read_radius_addr(
- &bss->radius->auth_servers,
- &bss->radius->num_auth_servers, pos, 1812,
- &bss->radius->auth_server)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid IP "
- "address '%s'", line, pos);
- errors++;
- }
- } else if (bss->radius->auth_server &&
- os_strcmp(buf, "auth_server_port") == 0) {
- bss->radius->auth_server->port = atoi(pos);
- } else if (bss->radius->auth_server &&
- os_strcmp(buf, "auth_server_shared_secret") == 0) {
- int len = os_strlen(pos);
- if (len == 0) {
- /* RFC 2865, Ch. 3 */
- wpa_printf(MSG_ERROR, "Line %d: empty shared "
- "secret is not allowed.", line);
- errors++;
- }
- bss->radius->auth_server->shared_secret =
- (u8 *) os_strdup(pos);
- bss->radius->auth_server->shared_secret_len = len;
- } else if (os_strcmp(buf, "acct_server_addr") == 0) {
- if (hostapd_config_read_radius_addr(
- &bss->radius->acct_servers,
- &bss->radius->num_acct_servers, pos, 1813,
- &bss->radius->acct_server)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid IP "
- "address '%s'", line, pos);
- errors++;
- }
- } else if (bss->radius->acct_server &&
- os_strcmp(buf, "acct_server_port") == 0) {
- bss->radius->acct_server->port = atoi(pos);
- } else if (bss->radius->acct_server &&
- os_strcmp(buf, "acct_server_shared_secret") == 0) {
- int len = os_strlen(pos);
- if (len == 0) {
- /* RFC 2865, Ch. 3 */
- wpa_printf(MSG_ERROR, "Line %d: empty shared "
- "secret is not allowed.", line);
- errors++;
- }
- bss->radius->acct_server->shared_secret =
- (u8 *) os_strdup(pos);
- bss->radius->acct_server->shared_secret_len = len;
- } else if (os_strcmp(buf, "radius_retry_primary_interval") ==
- 0) {
- bss->radius->retry_primary_interval = atoi(pos);
- } else if (os_strcmp(buf, "radius_acct_interim_interval") == 0)
- {
- bss->acct_interim_interval = atoi(pos);
-#endif /* CONFIG_NO_RADIUS */
- } else if (os_strcmp(buf, "auth_algs") == 0) {
- bss->auth_algs = atoi(pos);
- if (bss->auth_algs == 0) {
- wpa_printf(MSG_ERROR, "Line %d: no "
- "authentication algorithms allowed",
- line);
- errors++;
- }
- } else if (os_strcmp(buf, "max_num_sta") == 0) {
- bss->max_num_sta = atoi(pos);
- if (bss->max_num_sta < 0 ||
- bss->max_num_sta > MAX_STA_COUNT) {
- wpa_printf(MSG_ERROR, "Line %d: Invalid "
- "max_num_sta=%d; allowed range "
- "0..%d", line, bss->max_num_sta,
- MAX_STA_COUNT);
- errors++;
- }
- } else if (os_strcmp(buf, "wpa") == 0) {
- bss->wpa = atoi(pos);
- } else if (os_strcmp(buf, "wpa_group_rekey") == 0) {
- bss->wpa_group_rekey = atoi(pos);
- } else if (os_strcmp(buf, "wpa_strict_rekey") == 0) {
- bss->wpa_strict_rekey = atoi(pos);
- } else if (os_strcmp(buf, "wpa_gmk_rekey") == 0) {
- bss->wpa_gmk_rekey = atoi(pos);
- } else if (os_strcmp(buf, "wpa_ptk_rekey") == 0) {
- bss->wpa_ptk_rekey = atoi(pos);
- } else if (os_strcmp(buf, "wpa_passphrase") == 0) {
- int len = os_strlen(pos);
- if (len < 8 || len > 63) {
- wpa_printf(MSG_ERROR, "Line %d: invalid WPA "
- "passphrase length %d (expected "
- "8..63)", line, len);
- errors++;
- } else {
- os_free(bss->ssid.wpa_passphrase);
- bss->ssid.wpa_passphrase = os_strdup(pos);
- }
- } else if (os_strcmp(buf, "wpa_psk") == 0) {
- os_free(bss->ssid.wpa_psk);
- bss->ssid.wpa_psk =
- os_zalloc(sizeof(struct hostapd_wpa_psk));
- if (bss->ssid.wpa_psk == NULL)
- errors++;
- else if (hexstr2bin(pos, bss->ssid.wpa_psk->psk,
- PMK_LEN) ||
- pos[PMK_LEN * 2] != '\0') {
- wpa_printf(MSG_ERROR, "Line %d: Invalid PSK "
- "'%s'.", line, pos);
- errors++;
- } else {
- bss->ssid.wpa_psk->group = 1;
- }
- } else if (os_strcmp(buf, "wpa_psk_file") == 0) {
- os_free(bss->ssid.wpa_psk_file);
- bss->ssid.wpa_psk_file = os_strdup(pos);
- if (!bss->ssid.wpa_psk_file) {
- wpa_printf(MSG_ERROR, "Line %d: allocation "
- "failed", line);
- errors++;
- }
- } else if (os_strcmp(buf, "wpa_key_mgmt") == 0) {
- bss->wpa_key_mgmt =
- hostapd_config_parse_key_mgmt(line, pos);
- if (bss->wpa_key_mgmt == -1)
- errors++;
- } else if (os_strcmp(buf, "wpa_pairwise") == 0) {
- bss->wpa_pairwise =
- hostapd_config_parse_cipher(line, pos);
- if (bss->wpa_pairwise == -1 ||
- bss->wpa_pairwise == 0)
- errors++;
- else if (bss->wpa_pairwise &
- (WPA_CIPHER_NONE | WPA_CIPHER_WEP40 |
- WPA_CIPHER_WEP104)) {
- wpa_printf(MSG_ERROR, "Line %d: unsupported "
- "pairwise cipher suite '%s'",
- bss->wpa_pairwise, pos);
- errors++;
- }
- } else if (os_strcmp(buf, "rsn_pairwise") == 0) {
- bss->rsn_pairwise =
- hostapd_config_parse_cipher(line, pos);
- if (bss->rsn_pairwise == -1 ||
- bss->rsn_pairwise == 0)
- errors++;
- else if (bss->rsn_pairwise &
- (WPA_CIPHER_NONE | WPA_CIPHER_WEP40 |
- WPA_CIPHER_WEP104)) {
- wpa_printf(MSG_ERROR, "Line %d: unsupported "
- "pairwise cipher suite '%s'",
- bss->rsn_pairwise, pos);
- errors++;
- }
-#ifdef CONFIG_RSN_PREAUTH
- } else if (os_strcmp(buf, "rsn_preauth") == 0) {
- bss->rsn_preauth = atoi(pos);
- } else if (os_strcmp(buf, "rsn_preauth_interfaces") == 0) {
- bss->rsn_preauth_interfaces = os_strdup(pos);
-#endif /* CONFIG_RSN_PREAUTH */
-#ifdef CONFIG_PEERKEY
- } else if (os_strcmp(buf, "peerkey") == 0) {
- bss->peerkey = atoi(pos);
-#endif /* CONFIG_PEERKEY */
-#ifdef CONFIG_IEEE80211R
- } else if (os_strcmp(buf, "mobility_domain") == 0) {
- if (os_strlen(pos) != 2 * MOBILITY_DOMAIN_ID_LEN ||
- hexstr2bin(pos, bss->mobility_domain,
- MOBILITY_DOMAIN_ID_LEN) != 0) {
- wpa_printf(MSG_DEBUG, "Line %d: Invalid "
- "mobility_domain '%s'", line, pos);
- errors++;
- continue;
- }
- } else if (os_strcmp(buf, "r1_key_holder") == 0) {
- if (os_strlen(pos) != 2 * FT_R1KH_ID_LEN ||
- hexstr2bin(pos, bss->r1_key_holder,
- FT_R1KH_ID_LEN) != 0) {
- wpa_printf(MSG_DEBUG, "Line %d: Invalid "
- "r1_key_holder '%s'", line, pos);
- errors++;
- continue;
- }
- } else if (os_strcmp(buf, "r0_key_lifetime") == 0) {
- bss->r0_key_lifetime = atoi(pos);
- } else if (os_strcmp(buf, "reassociation_deadline") == 0) {
- bss->reassociation_deadline = atoi(pos);
- } else if (os_strcmp(buf, "r0kh") == 0) {
- if (add_r0kh(bss, pos) < 0) {
- wpa_printf(MSG_DEBUG, "Line %d: Invalid "
- "r0kh '%s'", line, pos);
- errors++;
- continue;
- }
- } else if (os_strcmp(buf, "r1kh") == 0) {
- if (add_r1kh(bss, pos) < 0) {
- wpa_printf(MSG_DEBUG, "Line %d: Invalid "
- "r1kh '%s'", line, pos);
- errors++;
- continue;
- }
- } else if (os_strcmp(buf, "pmk_r1_push") == 0) {
- bss->pmk_r1_push = atoi(pos);
- } else if (os_strcmp(buf, "ft_over_ds") == 0) {
- bss->ft_over_ds = atoi(pos);
-#endif /* CONFIG_IEEE80211R */
-#ifndef CONFIG_NO_CTRL_IFACE
- } else if (os_strcmp(buf, "ctrl_interface") == 0) {
- os_free(bss->ctrl_interface);
- bss->ctrl_interface = os_strdup(pos);
- } else if (os_strcmp(buf, "ctrl_interface_group") == 0) {
-#ifndef CONFIG_NATIVE_WINDOWS
- struct group *grp;
- char *endp;
- const char *group = pos;
-
- grp = getgrnam(group);
- if (grp) {
- bss->ctrl_interface_gid = grp->gr_gid;
- bss->ctrl_interface_gid_set = 1;
- wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d"
- " (from group name '%s')",
- bss->ctrl_interface_gid, group);
- continue;
- }
-
- /* Group name not found - try to parse this as gid */
- bss->ctrl_interface_gid = strtol(group, &endp, 10);
- if (*group == '\0' || *endp != '\0') {
- wpa_printf(MSG_DEBUG, "Line %d: Invalid group "
- "'%s'", line, group);
- errors++;
- continue;
- }
- bss->ctrl_interface_gid_set = 1;
- wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d",
- bss->ctrl_interface_gid);
-#endif /* CONFIG_NATIVE_WINDOWS */
-#endif /* CONFIG_NO_CTRL_IFACE */
-#ifdef RADIUS_SERVER
- } else if (os_strcmp(buf, "radius_server_clients") == 0) {
- os_free(bss->radius_server_clients);
- bss->radius_server_clients = os_strdup(pos);
- } else if (os_strcmp(buf, "radius_server_auth_port") == 0) {
- bss->radius_server_auth_port = atoi(pos);
- } else if (os_strcmp(buf, "radius_server_ipv6") == 0) {
- bss->radius_server_ipv6 = atoi(pos);
-#endif /* RADIUS_SERVER */
- } else if (os_strcmp(buf, "test_socket") == 0) {
- os_free(bss->test_socket);
- bss->test_socket = os_strdup(pos);
- } else if (os_strcmp(buf, "use_pae_group_addr") == 0) {
- bss->use_pae_group_addr = atoi(pos);
- } else if (os_strcmp(buf, "hw_mode") == 0) {
- if (os_strcmp(pos, "a") == 0)
- conf->hw_mode = HOSTAPD_MODE_IEEE80211A;
- else if (os_strcmp(pos, "b") == 0)
- conf->hw_mode = HOSTAPD_MODE_IEEE80211B;
- else if (os_strcmp(pos, "g") == 0)
- conf->hw_mode = HOSTAPD_MODE_IEEE80211G;
- else {
- wpa_printf(MSG_ERROR, "Line %d: unknown "
- "hw_mode '%s'", line, pos);
- errors++;
- }
- } else if (os_strcmp(buf, "channel") == 0) {
- conf->channel = atoi(pos);
- } else if (os_strcmp(buf, "beacon_int") == 0) {
- int val = atoi(pos);
- /* MIB defines range as 1..65535, but very small values
- * cause problems with the current implementation.
- * Since it is unlikely that this small numbers are
- * useful in real life scenarios, do not allow beacon
- * period to be set below 15 TU. */
- if (val < 15 || val > 65535) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "beacon_int %d (expected "
- "15..65535)", line, val);
- errors++;
- } else
- conf->beacon_int = val;
- } else if (os_strcmp(buf, "dtim_period") == 0) {
- bss->dtim_period = atoi(pos);
- if (bss->dtim_period < 1 || bss->dtim_period > 255) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "dtim_period %d",
- line, bss->dtim_period);
- errors++;
- }
- } else if (os_strcmp(buf, "rts_threshold") == 0) {
- conf->rts_threshold = atoi(pos);
- if (conf->rts_threshold < 0 ||
- conf->rts_threshold > 2347) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "rts_threshold %d",
- line, conf->rts_threshold);
- errors++;
- }
- } else if (os_strcmp(buf, "fragm_threshold") == 0) {
- conf->fragm_threshold = atoi(pos);
- if (conf->fragm_threshold < 256 ||
- conf->fragm_threshold > 2346) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "fragm_threshold %d",
- line, conf->fragm_threshold);
- errors++;
- }
- } else if (os_strcmp(buf, "send_probe_response") == 0) {
- int val = atoi(pos);
- if (val != 0 && val != 1) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "send_probe_response %d (expected "
- "0 or 1)", line, val);
- } else
- conf->send_probe_response = val;
- } else if (os_strcmp(buf, "supported_rates") == 0) {
- if (hostapd_parse_rates(&conf->supported_rates, pos)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid rate "
- "list", line);
- errors++;
- }
- } else if (os_strcmp(buf, "basic_rates") == 0) {
- if (hostapd_parse_rates(&conf->basic_rates, pos)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid rate "
- "list", line);
- errors++;
- }
- } else if (os_strcmp(buf, "preamble") == 0) {
- if (atoi(pos))
- conf->preamble = SHORT_PREAMBLE;
- else
- conf->preamble = LONG_PREAMBLE;
- } else if (os_strcmp(buf, "ignore_broadcast_ssid") == 0) {
- bss->ignore_broadcast_ssid = atoi(pos);
- } else if (os_strcmp(buf, "wep_default_key") == 0) {
- bss->ssid.wep.idx = atoi(pos);
- if (bss->ssid.wep.idx > 3) {
- wpa_printf(MSG_ERROR, "Invalid "
- "wep_default_key index %d",
- bss->ssid.wep.idx);
- errors++;
- }
- } else if (os_strcmp(buf, "wep_key0") == 0 ||
- os_strcmp(buf, "wep_key1") == 0 ||
- os_strcmp(buf, "wep_key2") == 0 ||
- os_strcmp(buf, "wep_key3") == 0) {
- if (hostapd_config_read_wep(&bss->ssid.wep,
- buf[7] - '0', pos)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid WEP "
- "key '%s'", line, buf);
- errors++;
- }
-#ifndef CONFIG_NO_VLAN
- } else if (os_strcmp(buf, "dynamic_vlan") == 0) {
- bss->ssid.dynamic_vlan = atoi(pos);
- } else if (os_strcmp(buf, "vlan_file") == 0) {
- if (hostapd_config_read_vlan_file(bss, pos)) {
- wpa_printf(MSG_ERROR, "Line %d: failed to "
- "read VLAN file '%s'", line, pos);
- errors++;
- }
-#ifdef CONFIG_FULL_DYNAMIC_VLAN
- } else if (os_strcmp(buf, "vlan_tagged_interface") == 0) {
- bss->ssid.vlan_tagged_interface = os_strdup(pos);
-#endif /* CONFIG_FULL_DYNAMIC_VLAN */
-#endif /* CONFIG_NO_VLAN */
- } else if (os_strcmp(buf, "ap_table_max_size") == 0) {
- conf->ap_table_max_size = atoi(pos);
- } else if (os_strcmp(buf, "ap_table_expiration_time") == 0) {
- conf->ap_table_expiration_time = atoi(pos);
- } else if (os_strncmp(buf, "tx_queue_", 9) == 0) {
- if (hostapd_config_tx_queue(conf, buf, pos)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid TX "
- "queue item", line);
- errors++;
- }
- } else if (os_strcmp(buf, "wme_enabled") == 0 ||
- os_strcmp(buf, "wmm_enabled") == 0) {
- bss->wmm_enabled = atoi(pos);
- } else if (os_strcmp(buf, "uapsd_advertisement_enabled") == 0) {
- bss->wmm_uapsd = atoi(pos);
- } else if (os_strncmp(buf, "wme_ac_", 7) == 0 ||
- os_strncmp(buf, "wmm_ac_", 7) == 0) {
- if (hostapd_config_wmm_ac(conf, buf, pos)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid WMM "
- "ac item", line);
- errors++;
- }
- } else if (os_strcmp(buf, "bss") == 0) {
- if (hostapd_config_bss(conf, pos)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid bss "
- "item", line);
- errors++;
- }
- } else if (os_strcmp(buf, "bssid") == 0) {
- if (hwaddr_aton(pos, bss->bssid)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid bssid "
- "item", line);
- errors++;
- }
-#ifdef CONFIG_IEEE80211W
- } else if (os_strcmp(buf, "ieee80211w") == 0) {
- bss->ieee80211w = atoi(pos);
- } else if (os_strcmp(buf, "assoc_sa_query_max_timeout") == 0) {
- bss->assoc_sa_query_max_timeout = atoi(pos);
- if (bss->assoc_sa_query_max_timeout == 0) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "assoc_sa_query_max_timeout", line);
- errors++;
- }
- } else if (os_strcmp(buf, "assoc_sa_query_retry_timeout") == 0)
- {
- bss->assoc_sa_query_retry_timeout = atoi(pos);
- if (bss->assoc_sa_query_retry_timeout == 0) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "assoc_sa_query_retry_timeout",
- line);
- errors++;
- }
-#endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_IEEE80211N
- } else if (os_strcmp(buf, "ieee80211n") == 0) {
- conf->ieee80211n = atoi(pos);
- } else if (os_strcmp(buf, "ht_capab") == 0) {
- if (hostapd_config_ht_capab(conf, pos) < 0) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "ht_capab", line);
- errors++;
- }
- } else if (os_strcmp(buf, "require_ht") == 0) {
- conf->require_ht = atoi(pos);
-#endif /* CONFIG_IEEE80211N */
- } else if (os_strcmp(buf, "max_listen_interval") == 0) {
- bss->max_listen_interval = atoi(pos);
- } else if (os_strcmp(buf, "okc") == 0) {
- bss->okc = atoi(pos);
-#ifdef CONFIG_WPS
- } else if (os_strcmp(buf, "wps_state") == 0) {
- bss->wps_state = atoi(pos);
- if (bss->wps_state < 0 || bss->wps_state > 2) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "wps_state", line);
- errors++;
- }
- } else if (os_strcmp(buf, "ap_setup_locked") == 0) {
- bss->ap_setup_locked = atoi(pos);
- } else if (os_strcmp(buf, "uuid") == 0) {
- if (uuid_str2bin(pos, bss->uuid)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid UUID",
- line);
- errors++;
- }
- } else if (os_strcmp(buf, "wps_pin_requests") == 0) {
- os_free(bss->wps_pin_requests);
- bss->wps_pin_requests = os_strdup(pos);
- } else if (os_strcmp(buf, "device_name") == 0) {
- if (os_strlen(pos) > 32) {
- wpa_printf(MSG_ERROR, "Line %d: Too long "
- "device_name", line);
- errors++;
- }
- os_free(bss->device_name);
- bss->device_name = os_strdup(pos);
- } else if (os_strcmp(buf, "manufacturer") == 0) {
- if (os_strlen(pos) > 64) {
- wpa_printf(MSG_ERROR, "Line %d: Too long "
- "manufacturer", line);
- errors++;
- }
- os_free(bss->manufacturer);
- bss->manufacturer = os_strdup(pos);
- } else if (os_strcmp(buf, "model_name") == 0) {
- if (os_strlen(pos) > 32) {
- wpa_printf(MSG_ERROR, "Line %d: Too long "
- "model_name", line);
- errors++;
- }
- os_free(bss->model_name);
- bss->model_name = os_strdup(pos);
- } else if (os_strcmp(buf, "model_number") == 0) {
- if (os_strlen(pos) > 32) {
- wpa_printf(MSG_ERROR, "Line %d: Too long "
- "model_number", line);
- errors++;
- }
- os_free(bss->model_number);
- bss->model_number = os_strdup(pos);
- } else if (os_strcmp(buf, "serial_number") == 0) {
- if (os_strlen(pos) > 32) {
- wpa_printf(MSG_ERROR, "Line %d: Too long "
- "serial_number", line);
- errors++;
- }
- os_free(bss->serial_number);
- bss->serial_number = os_strdup(pos);
- } else if (os_strcmp(buf, "device_type") == 0) {
- if (wps_dev_type_str2bin(pos, bss->device_type))
- errors++;
- } else if (os_strcmp(buf, "config_methods") == 0) {
- os_free(bss->config_methods);
- bss->config_methods = os_strdup(pos);
- } else if (os_strcmp(buf, "os_version") == 0) {
- if (hexstr2bin(pos, bss->os_version, 4)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid "
- "os_version", line);
- errors++;
- }
- } else if (os_strcmp(buf, "ap_pin") == 0) {
- os_free(bss->ap_pin);
- bss->ap_pin = os_strdup(pos);
- } else if (os_strcmp(buf, "skip_cred_build") == 0) {
- bss->skip_cred_build = atoi(pos);
- } else if (os_strcmp(buf, "extra_cred") == 0) {
- os_free(bss->extra_cred);
- bss->extra_cred =
- (u8 *) os_readfile(pos, &bss->extra_cred_len);
- if (bss->extra_cred == NULL) {
- wpa_printf(MSG_ERROR, "Line %d: could not "
- "read Credentials from '%s'",
- line, pos);
- errors++;
- }
- } else if (os_strcmp(buf, "wps_cred_processing") == 0) {
- bss->wps_cred_processing = atoi(pos);
- } else if (os_strcmp(buf, "ap_settings") == 0) {
- os_free(bss->ap_settings);
- bss->ap_settings =
- (u8 *) os_readfile(pos, &bss->ap_settings_len);
- if (bss->ap_settings == NULL) {
- wpa_printf(MSG_ERROR, "Line %d: could not "
- "read AP Settings from '%s'",
- line, pos);
- errors++;
- }
- } else if (os_strcmp(buf, "upnp_iface") == 0) {
- bss->upnp_iface = os_strdup(pos);
- } else if (os_strcmp(buf, "friendly_name") == 0) {
- os_free(bss->friendly_name);
- bss->friendly_name = os_strdup(pos);
- } else if (os_strcmp(buf, "manufacturer_url") == 0) {
- os_free(bss->manufacturer_url);
- bss->manufacturer_url = os_strdup(pos);
- } else if (os_strcmp(buf, "model_description") == 0) {
- os_free(bss->model_description);
- bss->model_description = os_strdup(pos);
- } else if (os_strcmp(buf, "model_url") == 0) {
- os_free(bss->model_url);
- bss->model_url = os_strdup(pos);
- } else if (os_strcmp(buf, "upc") == 0) {
- os_free(bss->upc);
- bss->upc = os_strdup(pos);
-#endif /* CONFIG_WPS */
-#ifdef CONFIG_P2P_MANAGER
- } else if (os_strcmp(buf, "manage_p2p") == 0) {
- int manage = atoi(pos);
- if (manage)
- bss->p2p |= P2P_MANAGE;
- else
- bss->p2p &= ~P2P_MANAGE;
- } else if (os_strcmp(buf, "allow_cross_connection") == 0) {
- if (atoi(pos))
- bss->p2p |= P2P_ALLOW_CROSS_CONNECTION;
- else
- bss->p2p &= ~P2P_ALLOW_CROSS_CONNECTION;
-#endif /* CONFIG_P2P_MANAGER */
- } else if (os_strcmp(buf, "disassoc_low_ack") == 0) {
- bss->disassoc_low_ack = atoi(pos);
- } else if (os_strcmp(buf, "tdls_prohibit") == 0) {
- int val = atoi(pos);
- if (val)
- bss->tdls |= TDLS_PROHIBIT;
- else
- bss->tdls &= ~TDLS_PROHIBIT;
- } else if (os_strcmp(buf, "tdls_prohibit_chan_switch") == 0) {
- int val = atoi(pos);
- if (val)
- bss->tdls |= TDLS_PROHIBIT_CHAN_SWITCH;
- else
- bss->tdls &= ~TDLS_PROHIBIT_CHAN_SWITCH;
-#ifdef CONFIG_RSN_TESTING
- } else if (os_strcmp(buf, "rsn_testing") == 0) {
- extern int rsn_testing;
- rsn_testing = atoi(pos);
-#endif /* CONFIG_RSN_TESTING */
- } else {
- wpa_printf(MSG_ERROR, "Line %d: unknown configuration "
- "item '%s'", line, buf);
- errors++;
- }
- }
-
- fclose(f);
-
- for (i = 0; i < conf->num_bss; i++) {
- bss = &conf->bss[i];
-
- if (bss->individual_wep_key_len == 0) {
- /* individual keys are not use; can use key idx0 for
- * broadcast keys */
- bss->broadcast_key_idx_min = 0;
- }
-
- /* Select group cipher based on the enabled pairwise cipher
- * suites */
- pairwise = 0;
- if (bss->wpa & 1)
- pairwise |= bss->wpa_pairwise;
- if (bss->wpa & 2) {
- if (bss->rsn_pairwise == 0)
- bss->rsn_pairwise = bss->wpa_pairwise;
- pairwise |= bss->rsn_pairwise;
- }
- if (pairwise & WPA_CIPHER_TKIP)
- bss->wpa_group = WPA_CIPHER_TKIP;
- else
- bss->wpa_group = WPA_CIPHER_CCMP;
-
- bss->radius->auth_server = bss->radius->auth_servers;
- bss->radius->acct_server = bss->radius->acct_servers;
-
- if (bss->wpa && bss->ieee802_1x) {
- bss->ssid.security_policy = SECURITY_WPA;
- } else if (bss->wpa) {
- bss->ssid.security_policy = SECURITY_WPA_PSK;
- } else if (bss->ieee802_1x) {
- bss->ssid.security_policy = SECURITY_IEEE_802_1X;
- bss->ssid.wep.default_len = bss->default_wep_key_len;
- } else if (bss->ssid.wep.keys_set)
- bss->ssid.security_policy = SECURITY_STATIC_WEP;
- else
- bss->ssid.security_policy = SECURITY_PLAINTEXT;
- }
-
- if (hostapd_config_check(conf))
- errors++;
-
-#ifndef WPA_IGNORE_CONFIG_ERRORS
- if (errors) {
- wpa_printf(MSG_ERROR, "%d errors found in configuration file "
- "'%s'", errors, fname);
- hostapd_config_free(conf);
- conf = NULL;
- }
-#endif /* WPA_IGNORE_CONFIG_ERRORS */
-
- return conf;
-}
diff --git a/hostapd-0.8/hostapd/config_file.h b/hostapd-0.8/hostapd/config_file.h
deleted file mode 100644
index 7111a9a..0000000
--- a/hostapd-0.8/hostapd/config_file.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * hostapd / Configuration file parser
- * Copyright (c) 2003-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef CONFIG_FILE_H
-#define CONFIG_FILE_H
-
-struct hostapd_config * hostapd_config_read(const char *fname);
-
-#endif /* CONFIG_FILE_H */
diff --git a/hostapd-0.8/hostapd/ctrl_iface.c b/hostapd-0.8/hostapd/ctrl_iface.c
deleted file mode 100644
index 195b8a7..0000000
--- a/hostapd-0.8/hostapd/ctrl_iface.c
+++ /dev/null
@@ -1,1131 +0,0 @@
-/*
- * hostapd / UNIX domain socket -based control interface
- * Copyright (c) 2004-2010, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#ifndef CONFIG_NATIVE_WINDOWS
-
-#include
-#include
-#include
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "common/version.h"
-#include "common/ieee802_11_defs.h"
-#include "drivers/driver.h"
-#include "radius/radius_client.h"
-#include "ap/hostapd.h"
-#include "ap/ap_config.h"
-#include "ap/ieee802_1x.h"
-#include "ap/wpa_auth.h"
-#include "ap/ieee802_11.h"
-#include "ap/sta_info.h"
-#include "ap/accounting.h"
-#include "ap/wps_hostapd.h"
-#include "ap/ctrl_iface_ap.h"
-#include "ap/ap_drv_ops.h"
-#include "wps/wps_defs.h"
-#include "wps/wps.h"
-#include "ctrl_iface.h"
-
-
-struct wpa_ctrl_dst {
- struct wpa_ctrl_dst *next;
- struct sockaddr_un addr;
- socklen_t addrlen;
- int debug_level;
- int errors;
-};
-
-
-static void hostapd_ctrl_iface_send(struct hostapd_data *hapd, int level,
- const char *buf, size_t len);
-
-
-static int hostapd_ctrl_iface_attach(struct hostapd_data *hapd,
- struct sockaddr_un *from,
- socklen_t fromlen)
-{
- struct wpa_ctrl_dst *dst;
-
- dst = os_zalloc(sizeof(*dst));
- if (dst == NULL)
- return -1;
- os_memcpy(&dst->addr, from, sizeof(struct sockaddr_un));
- dst->addrlen = fromlen;
- dst->debug_level = MSG_INFO;
- dst->next = hapd->ctrl_dst;
- hapd->ctrl_dst = dst;
- wpa_hexdump(MSG_DEBUG, "CTRL_IFACE monitor attached",
- (u8 *) from->sun_path,
- fromlen - offsetof(struct sockaddr_un, sun_path));
- return 0;
-}
-
-
-static int hostapd_ctrl_iface_detach(struct hostapd_data *hapd,
- struct sockaddr_un *from,
- socklen_t fromlen)
-{
- struct wpa_ctrl_dst *dst, *prev = NULL;
-
- dst = hapd->ctrl_dst;
- while (dst) {
- if (fromlen == dst->addrlen &&
- os_memcmp(from->sun_path, dst->addr.sun_path,
- fromlen - offsetof(struct sockaddr_un, sun_path))
- == 0) {
- if (prev == NULL)
- hapd->ctrl_dst = dst->next;
- else
- prev->next = dst->next;
- os_free(dst);
- wpa_hexdump(MSG_DEBUG, "CTRL_IFACE monitor detached",
- (u8 *) from->sun_path,
- fromlen -
- offsetof(struct sockaddr_un, sun_path));
- return 0;
- }
- prev = dst;
- dst = dst->next;
- }
- return -1;
-}
-
-
-static int hostapd_ctrl_iface_level(struct hostapd_data *hapd,
- struct sockaddr_un *from,
- socklen_t fromlen,
- char *level)
-{
- struct wpa_ctrl_dst *dst;
-
- wpa_printf(MSG_DEBUG, "CTRL_IFACE LEVEL %s", level);
-
- dst = hapd->ctrl_dst;
- while (dst) {
- if (fromlen == dst->addrlen &&
- os_memcmp(from->sun_path, dst->addr.sun_path,
- fromlen - offsetof(struct sockaddr_un, sun_path))
- == 0) {
- wpa_hexdump(MSG_DEBUG, "CTRL_IFACE changed monitor "
- "level", (u8 *) from->sun_path, fromlen -
- offsetof(struct sockaddr_un, sun_path));
- dst->debug_level = atoi(level);
- return 0;
- }
- dst = dst->next;
- }
-
- return -1;
-}
-
-
-static int hostapd_ctrl_iface_new_sta(struct hostapd_data *hapd,
- const char *txtaddr)
-{
- u8 addr[ETH_ALEN];
- struct sta_info *sta;
-
- wpa_printf(MSG_DEBUG, "CTRL_IFACE NEW_STA %s", txtaddr);
-
- if (hwaddr_aton(txtaddr, addr))
- return -1;
-
- sta = ap_get_sta(hapd, addr);
- if (sta)
- return 0;
-
- wpa_printf(MSG_DEBUG, "Add new STA " MACSTR " based on ctrl_iface "
- "notification", MAC2STR(addr));
- sta = ap_sta_add(hapd, addr);
- if (sta == NULL)
- return -1;
-
- hostapd_new_assoc_sta(hapd, sta, 0);
- return 0;
-}
-
-
-#ifdef CONFIG_P2P_MANAGER
-static int p2p_manager_disconnect(struct hostapd_data *hapd, u16 stype,
- u8 minor_reason_code, const u8 *addr)
-{
- struct ieee80211_mgmt *mgmt;
- int ret;
- u8 *pos;
-
- if (hapd->driver->send_frame == NULL)
- return -1;
-
- mgmt = os_zalloc(sizeof(*mgmt) + 100);
- if (mgmt == NULL)
- return -1;
-
- wpa_printf(MSG_DEBUG, "P2P: Disconnect STA " MACSTR " with minor "
- "reason code %u (stype=%u)",
- MAC2STR(addr), minor_reason_code, stype);
-
- mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, stype);
- os_memcpy(mgmt->da, addr, ETH_ALEN);
- os_memcpy(mgmt->sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(mgmt->bssid, hapd->own_addr, ETH_ALEN);
- if (stype == WLAN_FC_STYPE_DEAUTH) {
- mgmt->u.deauth.reason_code =
- host_to_le16(WLAN_REASON_PREV_AUTH_NOT_VALID);
- pos = (u8 *) (&mgmt->u.deauth.reason_code + 1);
- } else {
- mgmt->u.disassoc.reason_code =
- host_to_le16(WLAN_REASON_PREV_AUTH_NOT_VALID);
- pos = (u8 *) (&mgmt->u.disassoc.reason_code + 1);
- }
-
- *pos++ = WLAN_EID_VENDOR_SPECIFIC;
- *pos++ = 4 + 3 + 1;
- WPA_PUT_BE24(pos, OUI_WFA);
- pos += 3;
- *pos++ = P2P_OUI_TYPE;
-
- *pos++ = P2P_ATTR_MINOR_REASON_CODE;
- WPA_PUT_LE16(pos, 1);
- pos += 2;
- *pos++ = minor_reason_code;
-
- ret = hapd->driver->send_frame(hapd->drv_priv, (u8 *) mgmt,
- pos - (u8 *) mgmt, 1);
- os_free(mgmt);
-
- return ret < 0 ? -1 : 0;
-}
-#endif /* CONFIG_P2P_MANAGER */
-
-
-static int hostapd_ctrl_iface_deauthenticate(struct hostapd_data *hapd,
- const char *txtaddr)
-{
- u8 addr[ETH_ALEN];
- struct sta_info *sta;
- const char *pos;
-
- wpa_printf(MSG_DEBUG, "CTRL_IFACE DEAUTHENTICATE %s", txtaddr);
-
- if (hwaddr_aton(txtaddr, addr))
- return -1;
-
- pos = os_strstr(txtaddr, " test=");
- if (pos) {
- struct ieee80211_mgmt mgmt;
- int encrypt;
- if (hapd->driver->send_frame == NULL)
- return -1;
- pos += 6;
- encrypt = atoi(pos);
- os_memset(&mgmt, 0, sizeof(mgmt));
- mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
- WLAN_FC_STYPE_DEAUTH);
- os_memcpy(mgmt.da, addr, ETH_ALEN);
- os_memcpy(mgmt.sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(mgmt.bssid, hapd->own_addr, ETH_ALEN);
- mgmt.u.deauth.reason_code =
- host_to_le16(WLAN_REASON_PREV_AUTH_NOT_VALID);
- if (hapd->driver->send_frame(hapd->drv_priv, (u8 *) &mgmt,
- IEEE80211_HDRLEN +
- sizeof(mgmt.u.deauth),
- encrypt) < 0)
- return -1;
- return 0;
- }
-
-#ifdef CONFIG_P2P_MANAGER
- pos = os_strstr(txtaddr, " p2p=");
- if (pos) {
- return p2p_manager_disconnect(hapd, WLAN_FC_STYPE_DEAUTH,
- atoi(pos + 5), addr);
- }
-#endif /* CONFIG_P2P_MANAGER */
-
- hostapd_drv_sta_deauth(hapd, addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
- sta = ap_get_sta(hapd, addr);
- if (sta)
- ap_sta_deauthenticate(hapd, sta,
- WLAN_REASON_PREV_AUTH_NOT_VALID);
- else if (addr[0] == 0xff)
- hostapd_free_stas(hapd);
-
- return 0;
-}
-
-
-static int hostapd_ctrl_iface_disassociate(struct hostapd_data *hapd,
- const char *txtaddr)
-{
- u8 addr[ETH_ALEN];
- struct sta_info *sta;
- const char *pos;
-
- wpa_printf(MSG_DEBUG, "CTRL_IFACE DISASSOCIATE %s", txtaddr);
-
- if (hwaddr_aton(txtaddr, addr))
- return -1;
-
- pos = os_strstr(txtaddr, " test=");
- if (pos) {
- struct ieee80211_mgmt mgmt;
- int encrypt;
- if (hapd->driver->send_frame == NULL)
- return -1;
- pos += 6;
- encrypt = atoi(pos);
- os_memset(&mgmt, 0, sizeof(mgmt));
- mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
- WLAN_FC_STYPE_DISASSOC);
- os_memcpy(mgmt.da, addr, ETH_ALEN);
- os_memcpy(mgmt.sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(mgmt.bssid, hapd->own_addr, ETH_ALEN);
- mgmt.u.disassoc.reason_code =
- host_to_le16(WLAN_REASON_PREV_AUTH_NOT_VALID);
- if (hapd->driver->send_frame(hapd->drv_priv, (u8 *) &mgmt,
- IEEE80211_HDRLEN +
- sizeof(mgmt.u.deauth),
- encrypt) < 0)
- return -1;
- return 0;
- }
-
-#ifdef CONFIG_P2P_MANAGER
- pos = os_strstr(txtaddr, " p2p=");
- if (pos) {
- return p2p_manager_disconnect(hapd, WLAN_FC_STYPE_DISASSOC,
- atoi(pos + 5), addr);
- }
-#endif /* CONFIG_P2P_MANAGER */
-
- hostapd_drv_sta_disassoc(hapd, addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
- sta = ap_get_sta(hapd, addr);
- if (sta)
- ap_sta_disassociate(hapd, sta,
- WLAN_REASON_PREV_AUTH_NOT_VALID);
- else if (addr[0] == 0xff)
- hostapd_free_stas(hapd);
-
- return 0;
-}
-
-
-#ifdef CONFIG_IEEE80211W
-#ifdef NEED_AP_MLME
-static int hostapd_ctrl_iface_sa_query(struct hostapd_data *hapd,
- const char *txtaddr)
-{
- u8 addr[ETH_ALEN];
- u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
-
- wpa_printf(MSG_DEBUG, "CTRL_IFACE SA_QUERY %s", txtaddr);
-
- if (hwaddr_aton(txtaddr, addr) ||
- os_get_random(trans_id, WLAN_SA_QUERY_TR_ID_LEN) < 0)
- return -1;
-
- ieee802_11_send_sa_query_req(hapd, addr, trans_id);
-
- return 0;
-}
-#endif /* NEED_AP_MLME */
-#endif /* CONFIG_IEEE80211W */
-
-
-#ifdef CONFIG_WPS
-static int hostapd_ctrl_iface_wps_pin(struct hostapd_data *hapd, char *txt)
-{
- char *pin = os_strchr(txt, ' ');
- char *timeout_txt;
- int timeout;
- u8 addr_buf[ETH_ALEN], *addr = NULL;
- char *pos;
-
- if (pin == NULL)
- return -1;
- *pin++ = '\0';
-
- timeout_txt = os_strchr(pin, ' ');
- if (timeout_txt) {
- *timeout_txt++ = '\0';
- timeout = atoi(timeout_txt);
- pos = os_strchr(timeout_txt, ' ');
- if (pos) {
- *pos++ = '\0';
- if (hwaddr_aton(pos, addr_buf) == 0)
- addr = addr_buf;
- }
- } else
- timeout = 0;
-
- return hostapd_wps_add_pin(hapd, addr, txt, pin, timeout);
-}
-
-
-static int hostapd_ctrl_iface_wps_check_pin(
- struct hostapd_data *hapd, char *cmd, char *buf, size_t buflen)
-{
- char pin[9];
- size_t len;
- char *pos;
- int ret;
-
- wpa_hexdump_ascii_key(MSG_DEBUG, "WPS_CHECK_PIN",
- (u8 *) cmd, os_strlen(cmd));
- for (pos = cmd, len = 0; *pos != '\0'; pos++) {
- if (*pos < '0' || *pos > '9')
- continue;
- pin[len++] = *pos;
- if (len == 9) {
- wpa_printf(MSG_DEBUG, "WPS: Too long PIN");
- return -1;
- }
- }
- if (len != 4 && len != 8) {
- wpa_printf(MSG_DEBUG, "WPS: Invalid PIN length %d", (int) len);
- return -1;
- }
- pin[len] = '\0';
-
- if (len == 8) {
- unsigned int pin_val;
- pin_val = atoi(pin);
- if (!wps_pin_valid(pin_val)) {
- wpa_printf(MSG_DEBUG, "WPS: Invalid checksum digit");
- ret = os_snprintf(buf, buflen, "FAIL-CHECKSUM\n");
- if (ret < 0 || (size_t) ret >= buflen)
- return -1;
- return ret;
- }
- }
-
- ret = os_snprintf(buf, buflen, "%s", pin);
- if (ret < 0 || (size_t) ret >= buflen)
- return -1;
-
- return ret;
-}
-
-
-#ifdef CONFIG_WPS_OOB
-static int hostapd_ctrl_iface_wps_oob(struct hostapd_data *hapd, char *txt)
-{
- char *path, *method, *name;
-
- path = os_strchr(txt, ' ');
- if (path == NULL)
- return -1;
- *path++ = '\0';
-
- method = os_strchr(path, ' ');
- if (method == NULL)
- return -1;
- *method++ = '\0';
-
- name = os_strchr(method, ' ');
- if (name != NULL)
- *name++ = '\0';
-
- return hostapd_wps_start_oob(hapd, txt, path, method, name);
-}
-#endif /* CONFIG_WPS_OOB */
-
-
-static int hostapd_ctrl_iface_wps_ap_pin(struct hostapd_data *hapd, char *txt,
- char *buf, size_t buflen)
-{
- int timeout = 300;
- char *pos;
- const char *pin_txt;
-
- pos = os_strchr(txt, ' ');
- if (pos)
- *pos++ = '\0';
-
- if (os_strcmp(txt, "disable") == 0) {
- hostapd_wps_ap_pin_disable(hapd);
- return os_snprintf(buf, buflen, "OK\n");
- }
-
- if (os_strcmp(txt, "random") == 0) {
- if (pos)
- timeout = atoi(pos);
- pin_txt = hostapd_wps_ap_pin_random(hapd, timeout);
- if (pin_txt == NULL)
- return -1;
- return os_snprintf(buf, buflen, "%s", pin_txt);
- }
-
- if (os_strcmp(txt, "get") == 0) {
- pin_txt = hostapd_wps_ap_pin_get(hapd);
- if (pin_txt == NULL)
- return -1;
- return os_snprintf(buf, buflen, "%s", pin_txt);
- }
-
- if (os_strcmp(txt, "set") == 0) {
- char *pin;
- if (pos == NULL)
- return -1;
- pin = pos;
- pos = os_strchr(pos, ' ');
- if (pos) {
- *pos++ = '\0';
- timeout = atoi(pos);
- }
- if (os_strlen(pin) > buflen)
- return -1;
- if (hostapd_wps_ap_pin_set(hapd, pin, timeout) < 0)
- return -1;
- return os_snprintf(buf, buflen, "%s", pin);
- }
-
- return -1;
-}
-
-
-static int hostapd_ctrl_iface_wps_config(struct hostapd_data *hapd, char *txt)
-{
- char *pos;
- char *ssid, *auth, *encr = NULL, *key = NULL;
-
- ssid = txt;
- pos = os_strchr(txt, ' ');
- if (!pos)
- return -1;
- *pos++ = '\0';
-
- auth = pos;
- pos = os_strchr(pos, ' ');
- if (pos) {
- *pos++ = '\0';
- encr = pos;
- pos = os_strchr(pos, ' ');
- if (pos) {
- *pos++ = '\0';
- key = pos;
- }
- }
-
- return hostapd_wps_config_ap(hapd, ssid, auth, encr, key);
-}
-#endif /* CONFIG_WPS */
-
-
-static int hostapd_ctrl_iface_get_config(struct hostapd_data *hapd,
- char *buf, size_t buflen)
-{
- int ret;
- char *pos, *end;
-
- pos = buf;
- end = buf + buflen;
-
- ret = os_snprintf(pos, end - pos, "bssid=" MACSTR "\n"
- "ssid=%s\n",
- MAC2STR(hapd->own_addr),
- hapd->conf->ssid.ssid);
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
-
-#ifdef CONFIG_WPS
- ret = os_snprintf(pos, end - pos, "wps_state=%s\n",
- hapd->conf->wps_state == 0 ? "disabled" :
- (hapd->conf->wps_state == 1 ? "not configured" :
- "configured"));
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
-
- if (hapd->conf->wps_state && hapd->conf->wpa &&
- hapd->conf->ssid.wpa_passphrase) {
- ret = os_snprintf(pos, end - pos, "passphrase=%s\n",
- hapd->conf->ssid.wpa_passphrase);
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
-
- if (hapd->conf->wps_state && hapd->conf->wpa &&
- hapd->conf->ssid.wpa_psk &&
- hapd->conf->ssid.wpa_psk->group) {
- char hex[PMK_LEN * 2 + 1];
- wpa_snprintf_hex(hex, sizeof(hex),
- hapd->conf->ssid.wpa_psk->psk, PMK_LEN);
- ret = os_snprintf(pos, end - pos, "psk=%s\n", hex);
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
-#endif /* CONFIG_WPS */
-
- if (hapd->conf->wpa && hapd->conf->wpa_key_mgmt) {
- ret = os_snprintf(pos, end - pos, "key_mgmt=");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
-
- if (hapd->conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK) {
- ret = os_snprintf(pos, end - pos, "WPA-PSK ");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
- if (hapd->conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X) {
- ret = os_snprintf(pos, end - pos, "WPA-EAP ");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
-#ifdef CONFIG_IEEE80211R
- if (hapd->conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_PSK) {
- ret = os_snprintf(pos, end - pos, "FT-PSK ");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
- if (hapd->conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) {
- ret = os_snprintf(pos, end - pos, "FT-EAP ");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
-#endif /* CONFIG_IEEE80211R */
-#ifdef CONFIG_IEEE80211W
- if (hapd->conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK_SHA256) {
- ret = os_snprintf(pos, end - pos, "WPA-PSK-SHA256 ");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
- if (hapd->conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) {
- ret = os_snprintf(pos, end - pos, "WPA-EAP-SHA256 ");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
-#endif /* CONFIG_IEEE80211W */
-
- ret = os_snprintf(pos, end - pos, "\n");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
-
- if (hapd->conf->wpa && hapd->conf->wpa_group == WPA_CIPHER_CCMP) {
- ret = os_snprintf(pos, end - pos, "group_cipher=CCMP\n");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- } else if (hapd->conf->wpa &&
- hapd->conf->wpa_group == WPA_CIPHER_TKIP) {
- ret = os_snprintf(pos, end - pos, "group_cipher=TKIP\n");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
-
- if ((hapd->conf->wpa & WPA_PROTO_RSN) && hapd->conf->rsn_pairwise) {
- ret = os_snprintf(pos, end - pos, "rsn_pairwise_cipher=");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
-
- if (hapd->conf->rsn_pairwise & WPA_CIPHER_CCMP) {
- ret = os_snprintf(pos, end - pos, "CCMP ");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
- if (hapd->conf->rsn_pairwise & WPA_CIPHER_TKIP) {
- ret = os_snprintf(pos, end - pos, "TKIP ");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
-
- ret = os_snprintf(pos, end - pos, "\n");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
-
- if ((hapd->conf->wpa & WPA_PROTO_WPA) && hapd->conf->wpa_pairwise) {
- ret = os_snprintf(pos, end - pos, "wpa_pairwise_cipher=");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
-
- if (hapd->conf->wpa_pairwise & WPA_CIPHER_CCMP) {
- ret = os_snprintf(pos, end - pos, "CCMP ");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
- if (hapd->conf->wpa_pairwise & WPA_CIPHER_TKIP) {
- ret = os_snprintf(pos, end - pos, "TKIP ");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
-
- ret = os_snprintf(pos, end - pos, "\n");
- if (ret < 0 || ret >= end - pos)
- return pos - buf;
- pos += ret;
- }
-
- return pos - buf;
-}
-
-
-static int hostapd_ctrl_iface_set(struct hostapd_data *hapd, char *cmd)
-{
- char *value;
- int ret = 0;
-
- value = os_strchr(cmd, ' ');
- if (value == NULL)
- return -1;
- *value++ = '\0';
-
- wpa_printf(MSG_DEBUG, "CTRL_IFACE SET '%s'='%s'", cmd, value);
- if (0) {
-#ifdef CONFIG_WPS_TESTING
- } else if (os_strcasecmp(cmd, "wps_version_number") == 0) {
- long int val;
- val = strtol(value, NULL, 0);
- if (val < 0 || val > 0xff) {
- ret = -1;
- wpa_printf(MSG_DEBUG, "WPS: Invalid "
- "wps_version_number %ld", val);
- } else {
- wps_version_number = val;
- wpa_printf(MSG_DEBUG, "WPS: Testing - force WPS "
- "version %u.%u",
- (wps_version_number & 0xf0) >> 4,
- wps_version_number & 0x0f);
- hostapd_wps_update_ie(hapd);
- }
- } else if (os_strcasecmp(cmd, "wps_testing_dummy_cred") == 0) {
- wps_testing_dummy_cred = atoi(value);
- wpa_printf(MSG_DEBUG, "WPS: Testing - dummy_cred=%d",
- wps_testing_dummy_cred);
-#endif /* CONFIG_WPS_TESTING */
- } else {
- ret = -1;
- }
-
- return ret;
-}
-
-
-static int hostapd_ctrl_iface_get(struct hostapd_data *hapd, char *cmd,
- char *buf, size_t buflen)
-{
- int res;
-
- wpa_printf(MSG_DEBUG, "CTRL_IFACE GET '%s'", cmd);
-
- if (os_strcmp(cmd, "version") == 0) {
- res = os_snprintf(buf, buflen, "%s", VERSION_STR);
- if (res < 0 || (unsigned int) res >= buflen)
- return -1;
- return res;
- }
-
- return -1;
-}
-
-
-static void hostapd_ctrl_iface_receive(int sock, void *eloop_ctx,
- void *sock_ctx)
-{
- struct hostapd_data *hapd = eloop_ctx;
- char buf[256];
- int res;
- struct sockaddr_un from;
- socklen_t fromlen = sizeof(from);
- char *reply;
- const int reply_size = 4096;
- int reply_len;
- int level = MSG_DEBUG;
-
- res = recvfrom(sock, buf, sizeof(buf) - 1, 0,
- (struct sockaddr *) &from, &fromlen);
- if (res < 0) {
- perror("recvfrom(ctrl_iface)");
- return;
- }
- buf[res] = '\0';
- if (os_strcmp(buf, "PING") == 0)
- level = MSG_EXCESSIVE;
- wpa_hexdump_ascii(level, "RX ctrl_iface", (u8 *) buf, res);
-
- reply = os_malloc(reply_size);
- if (reply == NULL) {
- sendto(sock, "FAIL\n", 5, 0, (struct sockaddr *) &from,
- fromlen);
- return;
- }
-
- os_memcpy(reply, "OK\n", 3);
- reply_len = 3;
-
- if (os_strcmp(buf, "PING") == 0) {
- os_memcpy(reply, "PONG\n", 5);
- reply_len = 5;
- } else if (os_strncmp(buf, "RELOG", 5) == 0) {
- if (wpa_debug_reopen_file() < 0)
- reply_len = -1;
- } else if (os_strcmp(buf, "MIB") == 0) {
- reply_len = ieee802_11_get_mib(hapd, reply, reply_size);
- if (reply_len >= 0) {
- res = wpa_get_mib(hapd->wpa_auth, reply + reply_len,
- reply_size - reply_len);
- if (res < 0)
- reply_len = -1;
- else
- reply_len += res;
- }
- if (reply_len >= 0) {
- res = ieee802_1x_get_mib(hapd, reply + reply_len,
- reply_size - reply_len);
- if (res < 0)
- reply_len = -1;
- else
- reply_len += res;
- }
-#ifndef CONFIG_NO_RADIUS
- if (reply_len >= 0) {
- res = radius_client_get_mib(hapd->radius,
- reply + reply_len,
- reply_size - reply_len);
- if (res < 0)
- reply_len = -1;
- else
- reply_len += res;
- }
-#endif /* CONFIG_NO_RADIUS */
- } else if (os_strcmp(buf, "STA-FIRST") == 0) {
- reply_len = hostapd_ctrl_iface_sta_first(hapd, reply,
- reply_size);
- } else if (os_strncmp(buf, "STA ", 4) == 0) {
- reply_len = hostapd_ctrl_iface_sta(hapd, buf + 4, reply,
- reply_size);
- } else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) {
- reply_len = hostapd_ctrl_iface_sta_next(hapd, buf + 9, reply,
- reply_size);
- } else if (os_strcmp(buf, "ATTACH") == 0) {
- if (hostapd_ctrl_iface_attach(hapd, &from, fromlen))
- reply_len = -1;
- } else if (os_strcmp(buf, "DETACH") == 0) {
- if (hostapd_ctrl_iface_detach(hapd, &from, fromlen))
- reply_len = -1;
- } else if (os_strncmp(buf, "LEVEL ", 6) == 0) {
- if (hostapd_ctrl_iface_level(hapd, &from, fromlen,
- buf + 6))
- reply_len = -1;
- } else if (os_strncmp(buf, "NEW_STA ", 8) == 0) {
- if (hostapd_ctrl_iface_new_sta(hapd, buf + 8))
- reply_len = -1;
- } else if (os_strncmp(buf, "DEAUTHENTICATE ", 15) == 0) {
- if (hostapd_ctrl_iface_deauthenticate(hapd, buf + 15))
- reply_len = -1;
- } else if (os_strncmp(buf, "DISASSOCIATE ", 13) == 0) {
- if (hostapd_ctrl_iface_disassociate(hapd, buf + 13))
- reply_len = -1;
-#ifdef CONFIG_IEEE80211W
-#ifdef NEED_AP_MLME
- } else if (os_strncmp(buf, "SA_QUERY ", 9) == 0) {
- if (hostapd_ctrl_iface_sa_query(hapd, buf + 9))
- reply_len = -1;
-#endif /* NEED_AP_MLME */
-#endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_WPS
- } else if (os_strncmp(buf, "WPS_PIN ", 8) == 0) {
- if (hostapd_ctrl_iface_wps_pin(hapd, buf + 8))
- reply_len = -1;
- } else if (os_strncmp(buf, "WPS_CHECK_PIN ", 14) == 0) {
- reply_len = hostapd_ctrl_iface_wps_check_pin(
- hapd, buf + 14, reply, reply_size);
- } else if (os_strcmp(buf, "WPS_PBC") == 0) {
- if (hostapd_wps_button_pushed(hapd, NULL))
- reply_len = -1;
-#ifdef CONFIG_WPS_OOB
- } else if (os_strncmp(buf, "WPS_OOB ", 8) == 0) {
- if (hostapd_ctrl_iface_wps_oob(hapd, buf + 8))
- reply_len = -1;
-#endif /* CONFIG_WPS_OOB */
- } else if (os_strncmp(buf, "WPS_AP_PIN ", 11) == 0) {
- reply_len = hostapd_ctrl_iface_wps_ap_pin(hapd, buf + 11,
- reply, reply_size);
- } else if (os_strncmp(buf, "WPS_CONFIG ", 11) == 0) {
- if (hostapd_ctrl_iface_wps_config(hapd, buf + 11) < 0)
- reply_len = -1;
-#endif /* CONFIG_WPS */
- } else if (os_strcmp(buf, "GET_CONFIG") == 0) {
- reply_len = hostapd_ctrl_iface_get_config(hapd, reply,
- reply_size);
- } else if (os_strncmp(buf, "SET ", 4) == 0) {
- if (hostapd_ctrl_iface_set(hapd, buf + 4))
- reply_len = -1;
- } else if (os_strncmp(buf, "GET ", 4) == 0) {
- reply_len = hostapd_ctrl_iface_get(hapd, buf + 4, reply,
- reply_size);
- } else {
- os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
- reply_len = 16;
- }
-
- if (reply_len < 0) {
- os_memcpy(reply, "FAIL\n", 5);
- reply_len = 5;
- }
- sendto(sock, reply, reply_len, 0, (struct sockaddr *) &from, fromlen);
- os_free(reply);
-}
-
-
-static char * hostapd_ctrl_iface_path(struct hostapd_data *hapd)
-{
- char *buf;
- size_t len;
-
- if (hapd->conf->ctrl_interface == NULL)
- return NULL;
-
- len = os_strlen(hapd->conf->ctrl_interface) +
- os_strlen(hapd->conf->iface) + 2;
- buf = os_malloc(len);
- if (buf == NULL)
- return NULL;
-
- os_snprintf(buf, len, "%s/%s",
- hapd->conf->ctrl_interface, hapd->conf->iface);
- buf[len - 1] = '\0';
- return buf;
-}
-
-
-static void hostapd_ctrl_iface_msg_cb(void *ctx, int level,
- const char *txt, size_t len)
-{
- struct hostapd_data *hapd = ctx;
- if (hapd == NULL)
- return;
- hostapd_ctrl_iface_send(hapd, level, txt, len);
-}
-
-
-int hostapd_ctrl_iface_init(struct hostapd_data *hapd)
-{
- struct sockaddr_un addr;
- int s = -1;
- char *fname = NULL;
-
- hapd->ctrl_sock = -1;
-
- if (hapd->conf->ctrl_interface == NULL)
- return 0;
-
- if (mkdir(hapd->conf->ctrl_interface, S_IRWXU | S_IRWXG) < 0) {
- if (errno == EEXIST) {
- wpa_printf(MSG_DEBUG, "Using existing control "
- "interface directory.");
- } else {
- perror("mkdir[ctrl_interface]");
- goto fail;
- }
- }
-
- if (hapd->conf->ctrl_interface_gid_set &&
- chown(hapd->conf->ctrl_interface, 0,
- hapd->conf->ctrl_interface_gid) < 0) {
- perror("chown[ctrl_interface]");
- return -1;
- }
-
- if (os_strlen(hapd->conf->ctrl_interface) + 1 +
- os_strlen(hapd->conf->iface) >= sizeof(addr.sun_path))
- goto fail;
-
- s = socket(PF_UNIX, SOCK_DGRAM, 0);
- if (s < 0) {
- perror("socket(PF_UNIX)");
- goto fail;
- }
-
- os_memset(&addr, 0, sizeof(addr));
-#ifdef __FreeBSD__
- addr.sun_len = sizeof(addr);
-#endif /* __FreeBSD__ */
- addr.sun_family = AF_UNIX;
- fname = hostapd_ctrl_iface_path(hapd);
- if (fname == NULL)
- goto fail;
- os_strlcpy(addr.sun_path, fname, sizeof(addr.sun_path));
- if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
- wpa_printf(MSG_DEBUG, "ctrl_iface bind(PF_UNIX) failed: %s",
- strerror(errno));
- if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
- wpa_printf(MSG_DEBUG, "ctrl_iface exists, but does not"
- " allow connections - assuming it was left"
- "over from forced program termination");
- if (unlink(fname) < 0) {
- perror("unlink[ctrl_iface]");
- wpa_printf(MSG_ERROR, "Could not unlink "
- "existing ctrl_iface socket '%s'",
- fname);
- goto fail;
- }
- if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) <
- 0) {
- perror("bind(PF_UNIX)");
- goto fail;
- }
- wpa_printf(MSG_DEBUG, "Successfully replaced leftover "
- "ctrl_iface socket '%s'", fname);
- } else {
- wpa_printf(MSG_INFO, "ctrl_iface exists and seems to "
- "be in use - cannot override it");
- wpa_printf(MSG_INFO, "Delete '%s' manually if it is "
- "not used anymore", fname);
- os_free(fname);
- fname = NULL;
- goto fail;
- }
- }
-
- if (hapd->conf->ctrl_interface_gid_set &&
- chown(fname, 0, hapd->conf->ctrl_interface_gid) < 0) {
- perror("chown[ctrl_interface/ifname]");
- goto fail;
- }
-
- if (chmod(fname, S_IRWXU | S_IRWXG) < 0) {
- perror("chmod[ctrl_interface/ifname]");
- goto fail;
- }
- os_free(fname);
-
- hapd->ctrl_sock = s;
- eloop_register_read_sock(s, hostapd_ctrl_iface_receive, hapd,
- NULL);
- hapd->msg_ctx = hapd;
- wpa_msg_register_cb(hostapd_ctrl_iface_msg_cb);
-
- return 0;
-
-fail:
- if (s >= 0)
- close(s);
- if (fname) {
- unlink(fname);
- os_free(fname);
- }
- return -1;
-}
-
-
-void hostapd_ctrl_iface_deinit(struct hostapd_data *hapd)
-{
- struct wpa_ctrl_dst *dst, *prev;
-
- if (hapd->ctrl_sock > -1) {
- char *fname;
- eloop_unregister_read_sock(hapd->ctrl_sock);
- close(hapd->ctrl_sock);
- hapd->ctrl_sock = -1;
- fname = hostapd_ctrl_iface_path(hapd);
- if (fname)
- unlink(fname);
- os_free(fname);
-
- if (hapd->conf->ctrl_interface &&
- rmdir(hapd->conf->ctrl_interface) < 0) {
- if (errno == ENOTEMPTY) {
- wpa_printf(MSG_DEBUG, "Control interface "
- "directory not empty - leaving it "
- "behind");
- } else {
- perror("rmdir[ctrl_interface]");
- }
- }
- }
-
- dst = hapd->ctrl_dst;
- while (dst) {
- prev = dst;
- dst = dst->next;
- os_free(prev);
- }
-}
-
-
-static void hostapd_ctrl_iface_send(struct hostapd_data *hapd, int level,
- const char *buf, size_t len)
-{
- struct wpa_ctrl_dst *dst, *next;
- struct msghdr msg;
- int idx;
- struct iovec io[2];
- char levelstr[10];
-
- dst = hapd->ctrl_dst;
- if (hapd->ctrl_sock < 0 || dst == NULL)
- return;
-
- os_snprintf(levelstr, sizeof(levelstr), "<%d>", level);
- io[0].iov_base = levelstr;
- io[0].iov_len = os_strlen(levelstr);
- io[1].iov_base = (char *) buf;
- io[1].iov_len = len;
- os_memset(&msg, 0, sizeof(msg));
- msg.msg_iov = io;
- msg.msg_iovlen = 2;
-
- idx = 0;
- while (dst) {
- next = dst->next;
- if (level >= dst->debug_level) {
- wpa_hexdump(MSG_DEBUG, "CTRL_IFACE monitor send",
- (u8 *) dst->addr.sun_path, dst->addrlen -
- offsetof(struct sockaddr_un, sun_path));
- msg.msg_name = &dst->addr;
- msg.msg_namelen = dst->addrlen;
- if (sendmsg(hapd->ctrl_sock, &msg, 0) < 0) {
- int _errno = errno;
- wpa_printf(MSG_INFO, "CTRL_IFACE monitor[%d]: "
- "%d - %s",
- idx, errno, strerror(errno));
- dst->errors++;
- if (dst->errors > 10 || _errno == ENOENT) {
- hostapd_ctrl_iface_detach(
- hapd, &dst->addr,
- dst->addrlen);
- }
- } else
- dst->errors = 0;
- }
- idx++;
- dst = next;
- }
-}
-
-#endif /* CONFIG_NATIVE_WINDOWS */
diff --git a/hostapd-0.8/hostapd/ctrl_iface.h b/hostapd-0.8/hostapd/ctrl_iface.h
deleted file mode 100644
index c997141..0000000
--- a/hostapd-0.8/hostapd/ctrl_iface.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * hostapd / UNIX domain socket -based control interface
- * Copyright (c) 2004, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef CTRL_IFACE_H
-#define CTRL_IFACE_H
-
-#ifndef CONFIG_NO_CTRL_IFACE
-int hostapd_ctrl_iface_init(struct hostapd_data *hapd);
-void hostapd_ctrl_iface_deinit(struct hostapd_data *hapd);
-#else /* CONFIG_NO_CTRL_IFACE */
-static inline int hostapd_ctrl_iface_init(struct hostapd_data *hapd)
-{
- return 0;
-}
-
-static inline void hostapd_ctrl_iface_deinit(struct hostapd_data *hapd)
-{
-}
-#endif /* CONFIG_NO_CTRL_IFACE */
-
-#endif /* CTRL_IFACE_H */
diff --git a/hostapd-0.8/hostapd/defconfig b/hostapd-0.8/hostapd/defconfig
deleted file mode 100644
index 47d1a6f..0000000
--- a/hostapd-0.8/hostapd/defconfig
+++ /dev/null
@@ -1,208 +0,0 @@
-# Example hostapd build time configuration
-#
-# This file lists the configuration options that are used when building the
-# hostapd binary. All lines starting with # are ignored. Configuration option
-# lines must be commented out complete, if they are not to be included, i.e.,
-# just setting VARIABLE=n is not disabling that variable.
-#
-# This file is included in Makefile, so variables like CFLAGS and LIBS can also
-# be modified from here. In most cass, these lines should use += in order not
-# to override previous values of the variables.
-
-# Driver interface for Host AP driver
-#CONFIG_DRIVER_HOSTAP=y
-CONFIG_DRIVER_RTW=y
-
-# Driver interface for wired authenticator
-#CONFIG_DRIVER_WIRED=y
-
-# Driver interface for madwifi driver
-#CONFIG_DRIVER_MADWIFI=y
-#CFLAGS += -I../../madwifi # change to the madwifi source directory
-
-# Driver interface for drivers using the nl80211 kernel interface
-#CONFIG_DRIVER_NL80211=y
-
-# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)
-#CONFIG_DRIVER_BSD=y
-#CFLAGS += -I/usr/local/include
-#LIBS += -L/usr/local/lib
-#LIBS_p += -L/usr/local/lib
-#LIBS_c += -L/usr/local/lib
-
-# Driver interface for no driver (e.g., RADIUS server only)
-#CONFIG_DRIVER_NONE=y
-
-# IEEE 802.11F/IAPP
-#CONFIG_IAPP=y
-
-# WPA2/IEEE 802.11i RSN pre-authentication
-#CONFIG_RSN_PREAUTH=y
-
-# PeerKey handshake for Station to Station Link (IEEE 802.11e DLS)
-#CONFIG_PEERKEY=y
-
-# IEEE 802.11w (management frame protection)
-# This version is an experimental implementation based on IEEE 802.11w/D1.0
-# draft and is subject to change since the standard has not yet been finalized.
-# Driver support is also needed for IEEE 802.11w.
-#CONFIG_IEEE80211W=y
-
-# Integrated EAP server
-CONFIG_EAP=y
-
-# EAP-MD5 for the integrated EAP server
-#CONFIG_EAP_MD5=y
-
-# EAP-TLS for the integrated EAP server
-#CONFIG_EAP_TLS=y
-
-# EAP-MSCHAPv2 for the integrated EAP server
-#CONFIG_EAP_MSCHAPV2=y
-
-# EAP-PEAP for the integrated EAP server
-#CONFIG_EAP_PEAP=y
-
-# EAP-GTC for the integrated EAP server
-#CONFIG_EAP_GTC=y
-
-# EAP-TTLS for the integrated EAP server
-#CONFIG_EAP_TTLS=y
-
-# EAP-SIM for the integrated EAP server
-#CONFIG_EAP_SIM=y
-
-# EAP-AKA for the integrated EAP server
-#CONFIG_EAP_AKA=y
-
-# EAP-AKA' for the integrated EAP server
-# This requires CONFIG_EAP_AKA to be enabled, too.
-#CONFIG_EAP_AKA_PRIME=y
-
-# EAP-PAX for the integrated EAP server
-#CONFIG_EAP_PAX=y
-
-# EAP-PSK for the integrated EAP server (this is _not_ needed for WPA-PSK)
-#CONFIG_EAP_PSK=y
-
-# EAP-SAKE for the integrated EAP server
-#CONFIG_EAP_SAKE=y
-
-# EAP-GPSK for the integrated EAP server
-#CONFIG_EAP_GPSK=y
-# Include support for optional SHA256 cipher suite in EAP-GPSK
-#CONFIG_EAP_GPSK_SHA256=y
-
-# EAP-FAST for the integrated EAP server
-# Note: Default OpenSSL package does not include support for all the
-# functionality needed for EAP-FAST. If EAP-FAST is enabled with OpenSSL,
-# the OpenSSL library must be patched (openssl-0.9.9-session-ticket.patch)
-# to add the needed functions.
-#CONFIG_EAP_FAST=y
-
-# Wi-Fi Protected Setup (WPS)
-CONFIG_WPS=y
-# Enable WSC 2.0 support
-CONFIG_WPS2=y
-# Enable UPnP support for external WPS Registrars
-#CONFIG_WPS_UPNP=y
-
-CONFIG_TLS=internal
-CONFIG_INTERNAL_LIBTOMMATH=y
-
-# EAP-IKEv2
-#CONFIG_EAP_IKEV2=y
-
-# Trusted Network Connect (EAP-TNC)
-#CONFIG_EAP_TNC=y
-
-# PKCS#12 (PFX) support (used to read private key and certificate file from
-# a file that usually has extension .p12 or .pfx)
-#CONFIG_PKCS12=y
-
-# RADIUS authentication server. This provides access to the integrated EAP
-# server from external hosts using RADIUS.
-#CONFIG_RADIUS_SERVER=y
-
-# Build IPv6 support for RADIUS operations
-#CONFIG_IPV6=y
-
-# IEEE Std 802.11r-2008 (Fast BSS Transition)
-#CONFIG_IEEE80211R=y
-
-# Use the hostapd's IEEE 802.11 authentication (ACL), but without
-# the IEEE 802.11 Management capability (e.g., madwifi or FreeBSD/net80211)
-#CONFIG_DRIVER_RADIUS_ACL=y
-
-# IEEE 802.11n (High Throughput) support
-CONFIG_IEEE80211N=y
-
-# Remove debugging code that is printing out debug messages to stdout.
-# This can be used to reduce the size of the hostapd considerably if debugging
-# code is not needed.
-#CONFIG_NO_STDOUT_DEBUG=y
-
-# Add support for writing debug log to a file: -f /tmp/hostapd.log
-# Disabled by default.
-#CONFIG_DEBUG_FILE=y
-
-# Remove support for RADIUS accounting
-#CONFIG_NO_ACCOUNTING=y
-
-# Remove support for RADIUS
-#CONFIG_NO_RADIUS=y
-
-# Remove support for VLANs
-#CONFIG_NO_VLAN=y
-
-# Enable support for fully dynamic VLANs. This enables hostapd to
-# automatically create bridge and VLAN interfaces if necessary.
-#CONFIG_FULL_DYNAMIC_VLAN=y
-
-# Remove support for dumping state into a file on SIGUSR1 signal
-# This can be used to reduce binary size at the cost of disabling a debugging
-# option.
-#CONFIG_NO_DUMP_STATE=y
-
-# Enable tracing code for developer debugging
-# This tracks use of memory allocations and other registrations and reports
-# incorrect use with a backtrace of call (or allocation) location.
-#CONFIG_WPA_TRACE=y
-# For BSD, comment out these.
-#LIBS += -lexecinfo
-#LIBS_p += -lexecinfo
-#LIBS_c += -lexecinfo
-
-# Use libbfd to get more details for developer debugging
-# This enables use of libbfd to get more detailed symbols for the backtraces
-# generated by CONFIG_WPA_TRACE=y.
-#CONFIG_WPA_TRACE_BFD=y
-# For BSD, comment out these.
-#LIBS += -lbfd -liberty -lz
-#LIBS_p += -lbfd -liberty -lz
-#LIBS_c += -lbfd -liberty -lz
-
-# hostapd depends on strong random number generation being available from the
-# operating system. os_get_random() function is used to fetch random data when
-# needed, e.g., for key generation. On Linux and BSD systems, this works by
-# reading /dev/urandom. It should be noted that the OS entropy pool needs to be
-# properly initialized before hostapd is started. This is important especially
-# on embedded devices that do not have a hardware random number generator and
-# may by default start up with minimal entropy available for random number
-# generation.
-#
-# As a safety net, hostapd is by default trying to internally collect
-# additional entropy for generating random data to mix in with the data
-# fetched from the OS. This by itself is not considered to be very strong, but
-# it may help in cases where the system pool is not initialized properly.
-# However, it is very strongly recommended that the system pool is initialized
-# with enough entropy either by using hardware assisted random number
-# generatior or by storing state over device reboots.
-#
-# If the os_get_random() is known to provide strong ramdom data (e.g., on
-# Linux/BSD, the board in question is known to have reliable source of random
-# data from /dev/urandom), the internal hostapd random pool can be disabled.
-# This will save some in binary size and CPU use. However, this should only be
-# considered for builds that are known to be used on devices that meet the
-# requirements described above.
-#CONFIG_NO_RANDOM_POOL=y
diff --git a/hostapd-0.8/hostapd/dump_state.c b/hostapd-0.8/hostapd/dump_state.c
deleted file mode 100644
index 73aa93d..0000000
--- a/hostapd-0.8/hostapd/dump_state.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * hostapd / State dump
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "radius/radius_client.h"
-#include "radius/radius_server.h"
-#include "eapol_auth/eapol_auth_sm.h"
-#include "eapol_auth/eapol_auth_sm_i.h"
-#include "eap_server/eap.h"
-#include "ap/hostapd.h"
-#include "ap/ap_config.h"
-#include "ap/sta_info.h"
-#include "dump_state.h"
-
-
-static void fprint_char(FILE *f, char c)
-{
- if (c >= 32 && c < 127)
- fprintf(f, "%c", c);
- else
- fprintf(f, "<%02x>", c);
-}
-
-
-static void ieee802_1x_dump_state(FILE *f, const char *prefix,
- struct sta_info *sta)
-{
- struct eapol_state_machine *sm = sta->eapol_sm;
- if (sm == NULL)
- return;
-
- fprintf(f, "%sIEEE 802.1X:\n", prefix);
-
- if (sm->identity) {
- size_t i;
- fprintf(f, "%sidentity=", prefix);
- for (i = 0; i < sm->identity_len; i++)
- fprint_char(f, sm->identity[i]);
- fprintf(f, "\n");
- }
-
- fprintf(f, "%slast EAP type: Authentication Server: %d (%s) "
- "Supplicant: %d (%s)\n", prefix,
- sm->eap_type_authsrv,
- eap_server_get_name(0, sm->eap_type_authsrv),
- sm->eap_type_supp, eap_server_get_name(0, sm->eap_type_supp));
-
- fprintf(f, "%scached_packets=%s\n", prefix,
- sm->last_recv_radius ? "[RX RADIUS]" : "");
-
- eapol_auth_dump_state(f, prefix, sm);
-}
-
-
-/**
- * hostapd_dump_state - SIGUSR1 handler to dump hostapd state to a text file
- */
-static void hostapd_dump_state(struct hostapd_data *hapd)
-{
- FILE *f;
- time_t now;
- struct sta_info *sta;
- int i;
-#ifndef CONFIG_NO_RADIUS
- char *buf;
-#endif /* CONFIG_NO_RADIUS */
-
- if (!hapd->conf->dump_log_name) {
- wpa_printf(MSG_DEBUG, "Dump file not defined - ignoring dump "
- "request");
- return;
- }
-
- wpa_printf(MSG_DEBUG, "Dumping hostapd state to '%s'",
- hapd->conf->dump_log_name);
- f = fopen(hapd->conf->dump_log_name, "w");
- if (f == NULL) {
- wpa_printf(MSG_WARNING, "Could not open dump file '%s' for "
- "writing.", hapd->conf->dump_log_name);
- return;
- }
-
- time(&now);
- fprintf(f, "hostapd state dump - %s", ctime(&now));
- fprintf(f, "num_sta=%d num_sta_non_erp=%d "
- "num_sta_no_short_slot_time=%d\n"
- "num_sta_no_short_preamble=%d\n",
- hapd->num_sta, hapd->iface->num_sta_non_erp,
- hapd->iface->num_sta_no_short_slot_time,
- hapd->iface->num_sta_no_short_preamble);
-
- for (sta = hapd->sta_list; sta != NULL; sta = sta->next) {
- fprintf(f, "\nSTA=" MACSTR "\n", MAC2STR(sta->addr));
-
- fprintf(f,
- " AID=%d flags=0x%x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n"
- " capability=0x%x listen_interval=%d\n",
- sta->aid,
- sta->flags,
- (sta->flags & WLAN_STA_AUTH ? "[AUTH]" : ""),
- (sta->flags & WLAN_STA_ASSOC ? "[ASSOC]" : ""),
- (sta->flags & WLAN_STA_PS ? "[PS]" : ""),
- (sta->flags & WLAN_STA_TIM ? "[TIM]" : ""),
- (sta->flags & WLAN_STA_PERM ? "[PERM]" : ""),
- (ap_sta_is_authorized(sta) ? "[AUTHORIZED]" : ""),
- (sta->flags & WLAN_STA_PENDING_POLL ? "[PENDING_POLL" :
- ""),
- (sta->flags & WLAN_STA_SHORT_PREAMBLE ?
- "[SHORT_PREAMBLE]" : ""),
- (sta->flags & WLAN_STA_PREAUTH ? "[PREAUTH]" : ""),
- (sta->flags & WLAN_STA_WMM ? "[WMM]" : ""),
- (sta->flags & WLAN_STA_MFP ? "[MFP]" : ""),
- (sta->flags & WLAN_STA_WPS ? "[WPS]" : ""),
- (sta->flags & WLAN_STA_MAYBE_WPS ? "[MAYBE_WPS]" : ""),
- (sta->flags & WLAN_STA_WDS ? "[WDS]" : ""),
- (sta->flags & WLAN_STA_NONERP ? "[NonERP]" : ""),
- sta->capability,
- sta->listen_interval);
-
- fprintf(f, " supported_rates=");
- for (i = 0; i < sta->supported_rates_len; i++)
- fprintf(f, "%02x ", sta->supported_rates[i]);
- fprintf(f, "\n");
-
- fprintf(f,
- " timeout_next=%s\n",
- (sta->timeout_next == STA_NULLFUNC ? "NULLFUNC POLL" :
- (sta->timeout_next == STA_DISASSOC ? "DISASSOC" :
- "DEAUTH")));
-
- ieee802_1x_dump_state(f, " ", sta);
- }
-
-#ifndef CONFIG_NO_RADIUS
- buf = os_malloc(4096);
- if (buf) {
- int count = radius_client_get_mib(hapd->radius, buf, 4096);
- if (count < 0)
- count = 0;
- else if (count > 4095)
- count = 4095;
- buf[count] = '\0';
- fprintf(f, "%s", buf);
-
-#ifdef RADIUS_SERVER
- count = radius_server_get_mib(hapd->radius_srv, buf, 4096);
- if (count < 0)
- count = 0;
- else if (count > 4095)
- count = 4095;
- buf[count] = '\0';
- fprintf(f, "%s", buf);
-#endif /* RADIUS_SERVER */
-
- os_free(buf);
- }
-#endif /* CONFIG_NO_RADIUS */
- fclose(f);
-}
-
-
-int handle_dump_state_iface(struct hostapd_iface *iface, void *ctx)
-{
- size_t i;
-
- for (i = 0; i < iface->num_bss; i++)
- hostapd_dump_state(iface->bss[i]);
-
- return 0;
-}
diff --git a/hostapd-0.8/hostapd/dump_state.h b/hostapd-0.8/hostapd/dump_state.h
deleted file mode 100644
index e14f08a..0000000
--- a/hostapd-0.8/hostapd/dump_state.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * hostapd / State dump
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef DUMP_STATE_H
-#define DUMP_STATE_H
-
-int handle_dump_state_iface(struct hostapd_iface *iface, void *ctx);
-
-#endif /* DUMP_STATE_H */
diff --git a/hostapd-0.8/hostapd/eap_register.c b/hostapd-0.8/hostapd/eap_register.c
deleted file mode 100644
index bab2871..0000000
--- a/hostapd-0.8/hostapd/eap_register.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * EAP method registration
- * Copyright (c) 2004-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "includes.h"
-
-#include "common.h"
-#include "eap_server/eap_methods.h"
-#include "eap_register.h"
-
-
-/**
- * eap_server_register_methods - Register statically linked EAP server methods
- * Returns: 0 on success, -1 or -2 on failure
- *
- * This function is called at program initialization to register all EAP
- * methods that were linked in statically.
- */
-int eap_server_register_methods(void)
-{
- int ret = 0;
-
-#ifdef EAP_SERVER_IDENTITY
- if (ret == 0)
- ret = eap_server_identity_register();
-#endif /* EAP_SERVER_IDENTITY */
-
-#ifdef EAP_SERVER_MD5
- if (ret == 0)
- ret = eap_server_md5_register();
-#endif /* EAP_SERVER_MD5 */
-
-#ifdef EAP_SERVER_TLS
- if (ret == 0)
- ret = eap_server_tls_register();
-#endif /* EAP_SERVER_TLS */
-
-#ifdef EAP_SERVER_MSCHAPV2
- if (ret == 0)
- ret = eap_server_mschapv2_register();
-#endif /* EAP_SERVER_MSCHAPV2 */
-
-#ifdef EAP_SERVER_PEAP
- if (ret == 0)
- ret = eap_server_peap_register();
-#endif /* EAP_SERVER_PEAP */
-
-#ifdef EAP_SERVER_TLV
- if (ret == 0)
- ret = eap_server_tlv_register();
-#endif /* EAP_SERVER_TLV */
-
-#ifdef EAP_SERVER_GTC
- if (ret == 0)
- ret = eap_server_gtc_register();
-#endif /* EAP_SERVER_GTC */
-
-#ifdef EAP_SERVER_TTLS
- if (ret == 0)
- ret = eap_server_ttls_register();
-#endif /* EAP_SERVER_TTLS */
-
-#ifdef EAP_SERVER_SIM
- if (ret == 0)
- ret = eap_server_sim_register();
-#endif /* EAP_SERVER_SIM */
-
-#ifdef EAP_SERVER_AKA
- if (ret == 0)
- ret = eap_server_aka_register();
-#endif /* EAP_SERVER_AKA */
-
-#ifdef EAP_SERVER_AKA_PRIME
- if (ret == 0)
- ret = eap_server_aka_prime_register();
-#endif /* EAP_SERVER_AKA_PRIME */
-
-#ifdef EAP_SERVER_PAX
- if (ret == 0)
- ret = eap_server_pax_register();
-#endif /* EAP_SERVER_PAX */
-
-#ifdef EAP_SERVER_PSK
- if (ret == 0)
- ret = eap_server_psk_register();
-#endif /* EAP_SERVER_PSK */
-
-#ifdef EAP_SERVER_SAKE
- if (ret == 0)
- ret = eap_server_sake_register();
-#endif /* EAP_SERVER_SAKE */
-
-#ifdef EAP_SERVER_GPSK
- if (ret == 0)
- ret = eap_server_gpsk_register();
-#endif /* EAP_SERVER_GPSK */
-
-#ifdef EAP_SERVER_VENDOR_TEST
- if (ret == 0)
- ret = eap_server_vendor_test_register();
-#endif /* EAP_SERVER_VENDOR_TEST */
-
-#ifdef EAP_SERVER_FAST
- if (ret == 0)
- ret = eap_server_fast_register();
-#endif /* EAP_SERVER_FAST */
-
-#ifdef EAP_SERVER_WSC
- if (ret == 0)
- ret = eap_server_wsc_register();
-#endif /* EAP_SERVER_WSC */
-
-#ifdef EAP_SERVER_IKEV2
- if (ret == 0)
- ret = eap_server_ikev2_register();
-#endif /* EAP_SERVER_IKEV2 */
-
-#ifdef EAP_SERVER_TNC
- if (ret == 0)
- ret = eap_server_tnc_register();
-#endif /* EAP_SERVER_TNC */
-
-#ifdef EAP_SERVER_PWD
- if (ret == 0)
- ret = eap_server_pwd_register();
-#endif /* EAP_SERVER_PWD */
-
- return ret;
-}
diff --git a/hostapd-0.8/hostapd/eap_register.h b/hostapd-0.8/hostapd/eap_register.h
deleted file mode 100644
index 82e7171..0000000
--- a/hostapd-0.8/hostapd/eap_register.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * EAP method registration
- * Copyright (c) 2004-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef EAP_REGISTER_H
-#define EAP_REGISTER_H
-
-int eap_server_register_methods(void);
-
-#endif /* EAP_REGISTER_H */
diff --git a/hostapd-0.8/hostapd/eap_testing.txt b/hostapd-0.8/hostapd/eap_testing.txt
deleted file mode 100644
index 04468c3..0000000
--- a/hostapd-0.8/hostapd/eap_testing.txt
+++ /dev/null
@@ -1,77 +0,0 @@
-Interoperability testing of hostapd's IEEE 802.1X/EAPOL authentication
-
-Test matrix
-
-+) tested successfully
-F) failed
--) peer did not support
-?) not tested
-
-XSupplicant --------------------------------.
-Intel PROSet ---------------------------. |
-Windows XP -------------------------. | |
-Mac OS X 10.4 ------------------. | | |
-Nokia S60 ------------------. | | | |
-wpa_supplicant ---------. | | | | |
- | | | | | |
-
-EAP-MD5 + - ? ? -
-EAP-GTC + - ? - -
-EAP-MSCHAPv2 + - ? - -
-EAP-TLS + + +1 + +
-EAP-PEAPv0/MSCHAPv2 + + + + + +
-EAP-PEAPv0/GTC + + + - +
-EAP-PEAPv0/MD5 + - + - -
-EAP-PEAPv0/TLS + F - + +
-EAP-PEAPv0/SIM + + - - -
-EAP-PEAPv0/AKA + + - - -
-EAP-PEAPv0/PSK + - - - -
-EAP-PEAPv0/PAX + - - - -
-EAP-PEAPv0/SAKE + - - - -
-EAP-PEAPv0/GPSK + - - - -
-EAP-PEAPv1/MSCHAPv2 + + + - + +
-EAP-PEAPv1/GTC + + + - +
-EAP-PEAPv1/MD5 + - + - -
-EAP-PEAPv1/TLS + F - - +
-EAP-PEAPv1/SIM + + - - -
-EAP-PEAPv1/AKA + + - - -
-EAP-PEAPv1/PSK + - - - -
-EAP-PEAPv1/PAX + - - - -
-EAP-PEAPv1/SAKE + - - - -
-EAP-PEAPv1/GPSK + - - - -
-EAP-TTLS/CHAP + - + - + +
-EAP-TTLS/MSCHAP + - + - + +
-EAP-TTLS/MSCHAPv2 + + + - + +
-EAP-TTLS/PAP + - + - + +
-EAP-TTLS/EAP-MD5 + - - - - +
-EAP-TTLS/EAP-GTC + + - - -
-EAP-TTLS/EAP-MSCHAPv2 + + - - -
-EAP-TTLS/EAP-TLS + F - - -
-EAP-TTLS/EAP-SIM + + - - -
-EAP-TTLS/EAP-AKA + + - - -
-EAP-TTLS + TNC + - - - -
-EAP-SIM + + - - +
-EAP-AKA + + - - -
-EAP-PAX + - - - -
-EAP-SAKE + - - - -
-EAP-GPSK + - - - -
-EAP-FAST/MSCHAPv2(prov) + - F - F
-EAP-FAST/GTC(auth) + - + - +
-EAP-FAST/MSCHAPv2(aprov)+ - F - F
-EAP-FAST/GTC(aprov) + - F - F
-EAP-FAST/MD5(aprov) + - - - -
-EAP-FAST/TLS(aprov) + - - - -
-EAP-FAST/SIM(aprov) + - - - -
-EAP-FAST/AKA(aprov) + - - - -
-EAP-FAST/MSCHAPv2(auth) + - + - +
-EAP-FAST/MD5(auth) + - + - -
-EAP-FAST/TLS(auth) + - - - -
-EAP-FAST/SIM(auth) + - - - -
-EAP-FAST/AKA(auth) + - - - -
-EAP-FAST + TNC + - - - -
-EAP-IKEv2 + - - - -
-EAP-TNC + - - - -
-
-1) EAP-TLS itself worked, but peer certificate validation failed at
- least when using the internal TLS server (peer included incorrect
- certificates in the chain?)
diff --git a/hostapd-0.8/hostapd/hlr_auc_gw.c b/hostapd-0.8/hostapd/hlr_auc_gw.c
deleted file mode 100644
index 2919122..0000000
--- a/hostapd-0.8/hostapd/hlr_auc_gw.c
+++ /dev/null
@@ -1,715 +0,0 @@
-/*
- * HLR/AuC testing gateway for hostapd EAP-SIM/AKA database/authenticator
- * Copyright (c) 2005-2007, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- *
- * This is an example implementation of the EAP-SIM/AKA database/authentication
- * gateway interface to HLR/AuC. It is expected to be replaced with an
- * implementation of SS7 gateway to GSM/UMTS authentication center (HLR/AuC) or
- * a local implementation of SIM triplet and AKA authentication data generator.
- *
- * hostapd will send SIM/AKA authentication queries over a UNIX domain socket
- * to and external program, e.g., this hlr_auc_gw. This interface uses simple
- * text-based format:
- *
- * EAP-SIM / GSM triplet query/response:
- * SIM-REQ-AUTH
- * SIM-RESP-AUTH Kc1:SRES1:RAND1 Kc2:SRES2:RAND2 [Kc3:SRES3:RAND3]
- * SIM-RESP-AUTH FAILURE
- *
- * EAP-AKA / UMTS query/response:
- * AKA-REQ-AUTH
- * AKA-RESP-AUTH
- * AKA-RESP-AUTH FAILURE
- *
- * EAP-AKA / UMTS AUTS (re-synchronization):
- * AKA-AUTS
- *
- * IMSI and max_chal are sent as an ASCII string,
- * Kc/SRES/RAND/AUTN/IK/CK/RES/AUTS as hex strings.
- *
- * The example implementation here reads GSM authentication triplets from a
- * text file in IMSI:Kc:SRES:RAND format, IMSI in ASCII, other fields as hex
- * strings. This is used to simulate an HLR/AuC. As such, it is not very useful
- * for real life authentication, but it is useful both as an example
- * implementation and for EAP-SIM testing.
- */
-
-#include "includes.h"
-#include
-
-#include "common.h"
-#include "crypto/milenage.h"
-#include "crypto/random.h"
-
-static const char *default_socket_path = "/tmp/hlr_auc_gw.sock";
-static const char *socket_path;
-static int serv_sock = -1;
-
-/* GSM triplets */
-struct gsm_triplet {
- struct gsm_triplet *next;
- char imsi[20];
- u8 kc[8];
- u8 sres[4];
- u8 _rand[16];
-};
-
-static struct gsm_triplet *gsm_db = NULL, *gsm_db_pos = NULL;
-
-/* OPc and AMF parameters for Milenage (Example algorithms for AKA). */
-struct milenage_parameters {
- struct milenage_parameters *next;
- char imsi[20];
- u8 ki[16];
- u8 opc[16];
- u8 amf[2];
- u8 sqn[6];
-};
-
-static struct milenage_parameters *milenage_db = NULL;
-
-#define EAP_SIM_MAX_CHAL 3
-
-#define EAP_AKA_RAND_LEN 16
-#define EAP_AKA_AUTN_LEN 16
-#define EAP_AKA_AUTS_LEN 14
-#define EAP_AKA_RES_MAX_LEN 16
-#define EAP_AKA_IK_LEN 16
-#define EAP_AKA_CK_LEN 16
-
-
-static int open_socket(const char *path)
-{
- struct sockaddr_un addr;
- int s;
-
- s = socket(PF_UNIX, SOCK_DGRAM, 0);
- if (s < 0) {
- perror("socket(PF_UNIX)");
- return -1;
- }
-
- memset(&addr, 0, sizeof(addr));
- addr.sun_family = AF_UNIX;
- os_strlcpy(addr.sun_path, path, sizeof(addr.sun_path));
- if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
- perror("bind(PF_UNIX)");
- close(s);
- return -1;
- }
-
- return s;
-}
-
-
-static int read_gsm_triplets(const char *fname)
-{
- FILE *f;
- char buf[200], *pos, *pos2;
- struct gsm_triplet *g = NULL;
- int line, ret = 0;
-
- if (fname == NULL)
- return -1;
-
- f = fopen(fname, "r");
- if (f == NULL) {
- printf("Could not open GSM tripler data file '%s'\n", fname);
- return -1;
- }
-
- line = 0;
- while (fgets(buf, sizeof(buf), f)) {
- line++;
-
- /* Parse IMSI:Kc:SRES:RAND */
- buf[sizeof(buf) - 1] = '\0';
- if (buf[0] == '#')
- continue;
- pos = buf;
- while (*pos != '\0' && *pos != '\n')
- pos++;
- if (*pos == '\n')
- *pos = '\0';
- pos = buf;
- if (*pos == '\0')
- continue;
-
- g = os_zalloc(sizeof(*g));
- if (g == NULL) {
- ret = -1;
- break;
- }
-
- /* IMSI */
- pos2 = strchr(pos, ':');
- if (pos2 == NULL) {
- printf("%s:%d - Invalid IMSI (%s)\n",
- fname, line, pos);
- ret = -1;
- break;
- }
- *pos2 = '\0';
- if (strlen(pos) >= sizeof(g->imsi)) {
- printf("%s:%d - Too long IMSI (%s)\n",
- fname, line, pos);
- ret = -1;
- break;
- }
- os_strlcpy(g->imsi, pos, sizeof(g->imsi));
- pos = pos2 + 1;
-
- /* Kc */
- pos2 = strchr(pos, ':');
- if (pos2 == NULL) {
- printf("%s:%d - Invalid Kc (%s)\n", fname, line, pos);
- ret = -1;
- break;
- }
- *pos2 = '\0';
- if (strlen(pos) != 16 || hexstr2bin(pos, g->kc, 8)) {
- printf("%s:%d - Invalid Kc (%s)\n", fname, line, pos);
- ret = -1;
- break;
- }
- pos = pos2 + 1;
-
- /* SRES */
- pos2 = strchr(pos, ':');
- if (pos2 == NULL) {
- printf("%s:%d - Invalid SRES (%s)\n", fname, line,
- pos);
- ret = -1;
- break;
- }
- *pos2 = '\0';
- if (strlen(pos) != 8 || hexstr2bin(pos, g->sres, 4)) {
- printf("%s:%d - Invalid SRES (%s)\n", fname, line,
- pos);
- ret = -1;
- break;
- }
- pos = pos2 + 1;
-
- /* RAND */
- pos2 = strchr(pos, ':');
- if (pos2)
- *pos2 = '\0';
- if (strlen(pos) != 32 || hexstr2bin(pos, g->_rand, 16)) {
- printf("%s:%d - Invalid RAND (%s)\n", fname, line,
- pos);
- ret = -1;
- break;
- }
- pos = pos2 + 1;
-
- g->next = gsm_db;
- gsm_db = g;
- g = NULL;
- }
- free(g);
-
- fclose(f);
-
- return ret;
-}
-
-
-static struct gsm_triplet * get_gsm_triplet(const char *imsi)
-{
- struct gsm_triplet *g = gsm_db_pos;
-
- while (g) {
- if (strcmp(g->imsi, imsi) == 0) {
- gsm_db_pos = g->next;
- return g;
- }
- g = g->next;
- }
-
- g = gsm_db;
- while (g && g != gsm_db_pos) {
- if (strcmp(g->imsi, imsi) == 0) {
- gsm_db_pos = g->next;
- return g;
- }
- g = g->next;
- }
-
- return NULL;
-}
-
-
-static int read_milenage(const char *fname)
-{
- FILE *f;
- char buf[200], *pos, *pos2;
- struct milenage_parameters *m = NULL;
- int line, ret = 0;
-
- if (fname == NULL)
- return -1;
-
- f = fopen(fname, "r");
- if (f == NULL) {
- printf("Could not open Milenage data file '%s'\n", fname);
- return -1;
- }
-
- line = 0;
- while (fgets(buf, sizeof(buf), f)) {
- line++;
-
- /* Parse IMSI Ki OPc AMF SQN */
- buf[sizeof(buf) - 1] = '\0';
- if (buf[0] == '#')
- continue;
- pos = buf;
- while (*pos != '\0' && *pos != '\n')
- pos++;
- if (*pos == '\n')
- *pos = '\0';
- pos = buf;
- if (*pos == '\0')
- continue;
-
- m = os_zalloc(sizeof(*m));
- if (m == NULL) {
- ret = -1;
- break;
- }
-
- /* IMSI */
- pos2 = strchr(pos, ' ');
- if (pos2 == NULL) {
- printf("%s:%d - Invalid IMSI (%s)\n",
- fname, line, pos);
- ret = -1;
- break;
- }
- *pos2 = '\0';
- if (strlen(pos) >= sizeof(m->imsi)) {
- printf("%s:%d - Too long IMSI (%s)\n",
- fname, line, pos);
- ret = -1;
- break;
- }
- os_strlcpy(m->imsi, pos, sizeof(m->imsi));
- pos = pos2 + 1;
-
- /* Ki */
- pos2 = strchr(pos, ' ');
- if (pos2 == NULL) {
- printf("%s:%d - Invalid Ki (%s)\n", fname, line, pos);
- ret = -1;
- break;
- }
- *pos2 = '\0';
- if (strlen(pos) != 32 || hexstr2bin(pos, m->ki, 16)) {
- printf("%s:%d - Invalid Ki (%s)\n", fname, line, pos);
- ret = -1;
- break;
- }
- pos = pos2 + 1;
-
- /* OPc */
- pos2 = strchr(pos, ' ');
- if (pos2 == NULL) {
- printf("%s:%d - Invalid OPc (%s)\n", fname, line, pos);
- ret = -1;
- break;
- }
- *pos2 = '\0';
- if (strlen(pos) != 32 || hexstr2bin(pos, m->opc, 16)) {
- printf("%s:%d - Invalid OPc (%s)\n", fname, line, pos);
- ret = -1;
- break;
- }
- pos = pos2 + 1;
-
- /* AMF */
- pos2 = strchr(pos, ' ');
- if (pos2 == NULL) {
- printf("%s:%d - Invalid AMF (%s)\n", fname, line, pos);
- ret = -1;
- break;
- }
- *pos2 = '\0';
- if (strlen(pos) != 4 || hexstr2bin(pos, m->amf, 2)) {
- printf("%s:%d - Invalid AMF (%s)\n", fname, line, pos);
- ret = -1;
- break;
- }
- pos = pos2 + 1;
-
- /* SQN */
- pos2 = strchr(pos, ' ');
- if (pos2)
- *pos2 = '\0';
- if (strlen(pos) != 12 || hexstr2bin(pos, m->sqn, 6)) {
- printf("%s:%d - Invalid SEQ (%s)\n", fname, line, pos);
- ret = -1;
- break;
- }
- pos = pos2 + 1;
-
- m->next = milenage_db;
- milenage_db = m;
- m = NULL;
- }
- free(m);
-
- fclose(f);
-
- return ret;
-}
-
-
-static struct milenage_parameters * get_milenage(const char *imsi)
-{
- struct milenage_parameters *m = milenage_db;
-
- while (m) {
- if (strcmp(m->imsi, imsi) == 0)
- break;
- m = m->next;
- }
-
- return m;
-}
-
-
-static void sim_req_auth(int s, struct sockaddr_un *from, socklen_t fromlen,
- char *imsi)
-{
- int count, max_chal, ret;
- char *pos;
- char reply[1000], *rpos, *rend;
- struct milenage_parameters *m;
- struct gsm_triplet *g;
-
- reply[0] = '\0';
-
- pos = strchr(imsi, ' ');
- if (pos) {
- *pos++ = '\0';
- max_chal = atoi(pos);
- if (max_chal < 1 || max_chal < EAP_SIM_MAX_CHAL)
- max_chal = EAP_SIM_MAX_CHAL;
- } else
- max_chal = EAP_SIM_MAX_CHAL;
-
- rend = &reply[sizeof(reply)];
- rpos = reply;
- ret = snprintf(rpos, rend - rpos, "SIM-RESP-AUTH %s", imsi);
- if (ret < 0 || ret >= rend - rpos)
- return;
- rpos += ret;
-
- m = get_milenage(imsi);
- if (m) {
- u8 _rand[16], sres[4], kc[8];
- for (count = 0; count < max_chal; count++) {
- if (random_get_bytes(_rand, 16) < 0)
- return;
- gsm_milenage(m->opc, m->ki, _rand, sres, kc);
- *rpos++ = ' ';
- rpos += wpa_snprintf_hex(rpos, rend - rpos, kc, 8);
- *rpos++ = ':';
- rpos += wpa_snprintf_hex(rpos, rend - rpos, sres, 4);
- *rpos++ = ':';
- rpos += wpa_snprintf_hex(rpos, rend - rpos, _rand, 16);
- }
- *rpos = '\0';
- goto send;
- }
-
- count = 0;
- while (count < max_chal && (g = get_gsm_triplet(imsi))) {
- if (strcmp(g->imsi, imsi) != 0)
- continue;
-
- if (rpos < rend)
- *rpos++ = ' ';
- rpos += wpa_snprintf_hex(rpos, rend - rpos, g->kc, 8);
- if (rpos < rend)
- *rpos++ = ':';
- rpos += wpa_snprintf_hex(rpos, rend - rpos, g->sres, 4);
- if (rpos < rend)
- *rpos++ = ':';
- rpos += wpa_snprintf_hex(rpos, rend - rpos, g->_rand, 16);
- count++;
- }
-
- if (count == 0) {
- printf("No GSM triplets found for %s\n", imsi);
- ret = snprintf(rpos, rend - rpos, " FAILURE");
- if (ret < 0 || ret >= rend - rpos)
- return;
- rpos += ret;
- }
-
-send:
- printf("Send: %s\n", reply);
- if (sendto(s, reply, rpos - reply, 0,
- (struct sockaddr *) from, fromlen) < 0)
- perror("send");
-}
-
-
-static void aka_req_auth(int s, struct sockaddr_un *from, socklen_t fromlen,
- char *imsi)
-{
- /* AKA-RESP-AUTH */
- char reply[1000], *pos, *end;
- u8 _rand[EAP_AKA_RAND_LEN];
- u8 autn[EAP_AKA_AUTN_LEN];
- u8 ik[EAP_AKA_IK_LEN];
- u8 ck[EAP_AKA_CK_LEN];
- u8 res[EAP_AKA_RES_MAX_LEN];
- size_t res_len;
- int ret;
- struct milenage_parameters *m;
-
- m = get_milenage(imsi);
- if (m) {
- if (random_get_bytes(_rand, EAP_AKA_RAND_LEN) < 0)
- return;
- res_len = EAP_AKA_RES_MAX_LEN;
- inc_byte_array(m->sqn, 6);
- printf("AKA: Milenage with SQN=%02x%02x%02x%02x%02x%02x\n",
- m->sqn[0], m->sqn[1], m->sqn[2],
- m->sqn[3], m->sqn[4], m->sqn[5]);
- milenage_generate(m->opc, m->amf, m->ki, m->sqn, _rand,
- autn, ik, ck, res, &res_len);
- } else {
- printf("Unknown IMSI: %s\n", imsi);
-#ifdef AKA_USE_FIXED_TEST_VALUES
- printf("Using fixed test values for AKA\n");
- memset(_rand, '0', EAP_AKA_RAND_LEN);
- memset(autn, '1', EAP_AKA_AUTN_LEN);
- memset(ik, '3', EAP_AKA_IK_LEN);
- memset(ck, '4', EAP_AKA_CK_LEN);
- memset(res, '2', EAP_AKA_RES_MAX_LEN);
- res_len = EAP_AKA_RES_MAX_LEN;
-#else /* AKA_USE_FIXED_TEST_VALUES */
- return;
-#endif /* AKA_USE_FIXED_TEST_VALUES */
- }
-
- pos = reply;
- end = &reply[sizeof(reply)];
- ret = snprintf(pos, end - pos, "AKA-RESP-AUTH %s ", imsi);
- if (ret < 0 || ret >= end - pos)
- return;
- pos += ret;
- pos += wpa_snprintf_hex(pos, end - pos, _rand, EAP_AKA_RAND_LEN);
- *pos++ = ' ';
- pos += wpa_snprintf_hex(pos, end - pos, autn, EAP_AKA_AUTN_LEN);
- *pos++ = ' ';
- pos += wpa_snprintf_hex(pos, end - pos, ik, EAP_AKA_IK_LEN);
- *pos++ = ' ';
- pos += wpa_snprintf_hex(pos, end - pos, ck, EAP_AKA_CK_LEN);
- *pos++ = ' ';
- pos += wpa_snprintf_hex(pos, end - pos, res, res_len);
-
- printf("Send: %s\n", reply);
-
- if (sendto(s, reply, pos - reply, 0, (struct sockaddr *) from,
- fromlen) < 0)
- perror("send");
-}
-
-
-static void aka_auts(int s, struct sockaddr_un *from, socklen_t fromlen,
- char *imsi)
-{
- char *auts, *__rand;
- u8 _auts[EAP_AKA_AUTS_LEN], _rand[EAP_AKA_RAND_LEN], sqn[6];
- struct milenage_parameters *m;
-
- /* AKA-AUTS */
-
- auts = strchr(imsi, ' ');
- if (auts == NULL)
- return;
- *auts++ = '\0';
-
- __rand = strchr(auts, ' ');
- if (__rand == NULL)
- return;
- *__rand++ = '\0';
-
- printf("AKA-AUTS: IMSI=%s AUTS=%s RAND=%s\n", imsi, auts, __rand);
- if (hexstr2bin(auts, _auts, EAP_AKA_AUTS_LEN) ||
- hexstr2bin(__rand, _rand, EAP_AKA_RAND_LEN)) {
- printf("Could not parse AUTS/RAND\n");
- return;
- }
-
- m = get_milenage(imsi);
- if (m == NULL) {
- printf("Unknown IMSI: %s\n", imsi);
- return;
- }
-
- if (milenage_auts(m->opc, m->ki, _rand, _auts, sqn)) {
- printf("AKA-AUTS: Incorrect MAC-S\n");
- } else {
- memcpy(m->sqn, sqn, 6);
- printf("AKA-AUTS: Re-synchronized: "
- "SQN=%02x%02x%02x%02x%02x%02x\n",
- sqn[0], sqn[1], sqn[2], sqn[3], sqn[4], sqn[5]);
- }
-}
-
-
-static int process(int s)
-{
- char buf[1000];
- struct sockaddr_un from;
- socklen_t fromlen;
- ssize_t res;
-
- fromlen = sizeof(from);
- res = recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *) &from,
- &fromlen);
- if (res < 0) {
- perror("recvfrom");
- return -1;
- }
-
- if (res == 0)
- return 0;
-
- if ((size_t) res >= sizeof(buf))
- res = sizeof(buf) - 1;
- buf[res] = '\0';
-
- printf("Received: %s\n", buf);
-
- if (strncmp(buf, "SIM-REQ-AUTH ", 13) == 0)
- sim_req_auth(s, &from, fromlen, buf + 13);
- else if (strncmp(buf, "AKA-REQ-AUTH ", 13) == 0)
- aka_req_auth(s, &from, fromlen, buf + 13);
- else if (strncmp(buf, "AKA-AUTS ", 9) == 0)
- aka_auts(s, &from, fromlen, buf + 9);
- else
- printf("Unknown request: %s\n", buf);
-
- return 0;
-}
-
-
-static void cleanup(void)
-{
- struct gsm_triplet *g, *gprev;
- struct milenage_parameters *m, *prev;
-
- g = gsm_db;
- while (g) {
- gprev = g;
- g = g->next;
- free(gprev);
- }
-
- m = milenage_db;
- while (m) {
- prev = m;
- m = m->next;
- free(prev);
- }
-
- close(serv_sock);
- unlink(socket_path);
-}
-
-
-static void handle_term(int sig)
-{
- printf("Signal %d - terminate\n", sig);
- exit(0);
-}
-
-
-static void usage(void)
-{
- printf("HLR/AuC testing gateway for hostapd EAP-SIM/AKA "
- "database/authenticator\n"
- "Copyright (c) 2005-2007, Jouni Malinen \n"
- "\n"
- "usage:\n"
- "hlr_auc_gw [-h] [-s] [-g] "
- "[-m]\n"
- "\n"
- "options:\n"
- " -h = show this usage help\n"
- " -s = path for UNIX domain socket\n"
- " (default: %s)\n"
- " -g = path for GSM authentication triplets\n"
- " -m = path for Milenage keys\n",
- default_socket_path);
-}
-
-
-int main(int argc, char *argv[])
-{
- int c;
- char *milenage_file = NULL;
- char *gsm_triplet_file = NULL;
-
- socket_path = default_socket_path;
-
- for (;;) {
- c = getopt(argc, argv, "g:hm:s:");
- if (c < 0)
- break;
- switch (c) {
- case 'g':
- gsm_triplet_file = optarg;
- break;
- case 'h':
- usage();
- return 0;
- case 'm':
- milenage_file = optarg;
- break;
- case 's':
- socket_path = optarg;
- break;
- default:
- usage();
- return -1;
- }
- }
-
- if (gsm_triplet_file && read_gsm_triplets(gsm_triplet_file) < 0)
- return -1;
-
- if (milenage_file && read_milenage(milenage_file) < 0)
- return -1;
-
- serv_sock = open_socket(socket_path);
- if (serv_sock < 0)
- return -1;
-
- printf("Listening for requests on %s\n", socket_path);
-
- atexit(cleanup);
- signal(SIGTERM, handle_term);
- signal(SIGINT, handle_term);
-
- for (;;)
- process(serv_sock);
-
- return 0;
-}
diff --git a/hostapd-0.8/hostapd/hlr_auc_gw.milenage_db b/hostapd-0.8/hostapd/hlr_auc_gw.milenage_db
deleted file mode 100644
index ecd06d7..0000000
--- a/hostapd-0.8/hostapd/hlr_auc_gw.milenage_db
+++ /dev/null
@@ -1,13 +0,0 @@
-# Parameters for Milenage (Example algorithms for AKA).
-# The example Ki, OPc, and AMF values here are from 3GPP TS 35.208 v6.0.0
-# 4.3.20 Test Set 20. SQN is the last used SQN value.
-# These values can be used for both UMTS (EAP-AKA) and GSM (EAP-SIM)
-# authentication. In case of GSM/EAP-SIM, AMF and SQN values are not used, but
-# dummy values will need to be included in this file.
-
-# IMSI Ki OPc AMF SQN
-232010000000000 90dca4eda45b53cf0f12d7c9c3bc6a89 cb9cccc4b9258e6dca4760379fb82581 61df 000000000000
-
-# These values are from Test Set 19 which has the AMF separation bit set to 1
-# and as such, is suitable for EAP-AKA' test.
-555444333222111 5122250214c33e723a5dd523fc145fc0 981d464c7c52eb6e5036234984ad0bcf c3ab 16f3b3f70fc1
diff --git a/hostapd-0.8/hostapd/hostapd.8 b/hostapd-0.8/hostapd/hostapd.8
deleted file mode 100644
index b4456bb..0000000
--- a/hostapd-0.8/hostapd/hostapd.8
+++ /dev/null
@@ -1,59 +0,0 @@
-.TH HOSTAPD 8 "April 7, 2005" hostapd hostapd
-.SH NAME
-hostapd \- IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
-.SH SYNOPSIS
-.B hostapd
-[\-hdBKtv] [\-P ]
-.SH DESCRIPTION
-This manual page documents briefly the
-.B hostapd
-daemon.
-.PP
-.B hostapd
-is a user space daemon for access point and authentication servers.
-It implements IEEE 802.11 access point management, IEEE 802.1X/WPA/WPA2/EAP Authenticators and RADIUS authentication server.
-The current version supports Linux (Host AP, madwifi, mac80211-based drivers) and FreeBSD (net80211).
-
-.B hostapd
-is designed to be a "daemon" program that runs in the background and acts as the backend component controlling authentication.
-.B hostapd
-supports separate frontend programs and an example text-based frontend,
-.BR hostapd_cli ,
-is included with
-.BR hostapd .
-.SH OPTIONS
-A summary of options is included below.
-For a complete description, run
-.BR hostapd
-from the command line.
-.TP
-.B \-h
-Show usage.
-.TP
-.B \-d
-Show more debug messages.
-.TP
-.B \-dd
-Show even more debug messages.
-.TP
-.B \-B
-Run daemon in the background.
-.TP
-.B \-P
-Path to PID file.
-.TP
-.B \-K
-Include key data in debug messages.
-.TP
-.B \-t
-Include timestamps in some debug messages.
-.TP
-.B \-v
-Show hostapd version.
-.SH SEE ALSO
-.BR hostapd_cli (1).
-.SH AUTHOR
-hostapd was written by Jouni Malinen .
-.PP
-This manual page was written by Faidon Liambotis ,
-for the Debian project (but may be used by others).
diff --git a/hostapd-0.8/hostapd/hostapd.accept b/hostapd-0.8/hostapd/hostapd.accept
deleted file mode 100644
index 2d2a0a2..0000000
--- a/hostapd-0.8/hostapd/hostapd.accept
+++ /dev/null
@@ -1,6 +0,0 @@
-# List of MAC addresses that are allowed to authenticate (IEEE 802.11)
-# with the AP. Optional VLAN ID can be assigned for clients based on the
-# MAC address if dynamic VLANs (hostapd.conf dynamic_vlan option) are used.
-00:11:22:33:44:55
-00:66:77:88:99:aa
-00:00:22:33:44:55 1
diff --git a/hostapd-0.8/hostapd/hostapd.conf b/hostapd-0.8/hostapd/hostapd.conf
deleted file mode 100644
index 6d7263a..0000000
--- a/hostapd-0.8/hostapd/hostapd.conf
+++ /dev/null
@@ -1,1040 +0,0 @@
-##### hostapd configuration file ##############################################
-# Empty lines and lines starting with # are ignored
-
-# AP netdevice name (without 'ap' postfix, i.e., wlan0 uses wlan0ap for
-# management frames); ath0 for madwifi
-interface=wlan0
-
-# In case of madwifi, atheros, and nl80211 driver interfaces, an additional
-# configuration parameter, bridge, may be used to notify hostapd if the
-# interface is included in a bridge. This parameter is not used with Host AP
-# driver. If the bridge parameter is not set, the drivers will automatically
-# figure out the bridge interface (assuming sysfs is enabled and mounted to
-# /sys) and this parameter may not be needed.
-#
-# For nl80211, this parameter can be used to request the AP interface to be
-# added to the bridge automatically (brctl may refuse to do this before hostapd
-# has been started to change the interface mode). If needed, the bridge
-# interface is also created.
-#bridge=br0
-
-# Driver interface type (hostap/wired/madwifi/test/none/nl80211/bsd);
-# default: hostap). nl80211 is used with all Linux mac80211 drivers.
-# Use driver=none if building hostapd as a standalone RADIUS server that does
-# not control any wireless/wired driver.
-# driver=hostap
-
-# hostapd event logger configuration
-#
-# Two output method: syslog and stdout (only usable if not forking to
-# background).
-#
-# Module bitfield (ORed bitfield of modules that will be logged; -1 = all
-# modules):
-# bit 0 (1) = IEEE 802.11
-# bit 1 (2) = IEEE 802.1X
-# bit 2 (4) = RADIUS
-# bit 3 (8) = WPA
-# bit 4 (16) = driver interface
-# bit 5 (32) = IAPP
-# bit 6 (64) = MLME
-#
-# Levels (minimum value for logged events):
-# 0 = verbose debugging
-# 1 = debugging
-# 2 = informational messages
-# 3 = notification
-# 4 = warning
-#
-logger_syslog=-1
-logger_syslog_level=2
-logger_stdout=-1
-logger_stdout_level=2
-
-# Dump file for state information (on SIGUSR1)
-dump_file=/tmp/hostapd.dump
-
-# Interface for separate control program. If this is specified, hostapd
-# will create this directory and a UNIX domain socket for listening to requests
-# from external programs (CLI/GUI, etc.) for status information and
-# configuration. The socket file will be named based on the interface name, so
-# multiple hostapd processes/interfaces can be run at the same time if more
-# than one interface is used.
-# /var/run/hostapd is the recommended directory for sockets and by default,
-# hostapd_cli will use it when trying to connect with hostapd.
-ctrl_interface=/var/run/hostapd
-
-# Access control for the control interface can be configured by setting the
-# directory to allow only members of a group to use sockets. This way, it is
-# possible to run hostapd as root (since it needs to change network
-# configuration and open raw sockets) and still allow GUI/CLI components to be
-# run as non-root users. However, since the control interface can be used to
-# change the network configuration, this access needs to be protected in many
-# cases. By default, hostapd is configured to use gid 0 (root). If you
-# want to allow non-root users to use the contron interface, add a new group
-# and change this value to match with that group. Add users that should have
-# control interface access to this group.
-#
-# This variable can be a group name or gid.
-#ctrl_interface_group=wheel
-ctrl_interface_group=0
-
-
-##### IEEE 802.11 related configuration #######################################
-
-# SSID to be used in IEEE 802.11 management frames
-ssid=test
-
-# Country code (ISO/IEC 3166-1). Used to set regulatory domain.
-# Set as needed to indicate country in which device is operating.
-# This can limit available channels and transmit power.
-#country_code=US
-
-# Enable IEEE 802.11d. This advertises the country_code and the set of allowed
-# channels and transmit power levels based on the regulatory limits. The
-# country_code setting must be configured with the correct country for
-# IEEE 802.11d functions.
-# (default: 0 = disabled)
-#ieee80211d=1
-
-# Operation mode (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g,
-# Default: IEEE 802.11b
-hw_mode=a
-
-# Channel number (IEEE 802.11)
-# (default: 0, i.e., not set)
-# Please note that some drivers (e.g., madwifi) do not use this value from
-# hostapd and the channel will need to be configuration separately with
-# iwconfig.
-channel=60
-
-# Beacon interval in kus (1.024 ms) (default: 100; range 15..65535)
-beacon_int=100
-
-# DTIM (delivery trafic information message) period (range 1..255):
-# number of beacons between DTIMs (1 = every beacon includes DTIM element)
-# (default: 2)
-dtim_period=2
-
-# Maximum number of stations allowed in station table. New stations will be
-# rejected after the station table is full. IEEE 802.11 has a limit of 2007
-# different association IDs, so this number should not be larger than that.
-# (default: 2007)
-max_num_sta=255
-
-# RTS/CTS threshold; 2347 = disabled (default); range 0..2347
-# If this field is not included in hostapd.conf, hostapd will not control
-# RTS threshold and 'iwconfig wlan# rts ' can be used to set it.
-rts_threshold=2347
-
-# Fragmentation threshold; 2346 = disabled (default); range 256..2346
-# If this field is not included in hostapd.conf, hostapd will not control
-# fragmentation threshold and 'iwconfig wlan# frag ' can be used to set
-# it.
-fragm_threshold=2346
-
-# Rate configuration
-# Default is to enable all rates supported by the hardware. This configuration
-# item allows this list be filtered so that only the listed rates will be left
-# in the list. If the list is empty, all rates are used. This list can have
-# entries that are not in the list of rates the hardware supports (such entries
-# are ignored). The entries in this list are in 100 kbps, i.e., 11 Mbps = 110.
-# If this item is present, at least one rate have to be matching with the rates
-# hardware supports.
-# default: use the most common supported rate setting for the selected
-# hw_mode (i.e., this line can be removed from configuration file in most
-# cases)
-#supported_rates=10 20 55 110 60 90 120 180 240 360 480 540
-
-# Basic rate set configuration
-# List of rates (in 100 kbps) that are included in the basic rate set.
-# If this item is not included, usually reasonable default set is used.
-#basic_rates=10 20
-#basic_rates=10 20 55 110
-#basic_rates=60 120 240
-
-# Short Preamble
-# This parameter can be used to enable optional use of short preamble for
-# frames sent at 2 Mbps, 5.5 Mbps, and 11 Mbps to improve network performance.
-# This applies only to IEEE 802.11b-compatible networks and this should only be
-# enabled if the local hardware supports use of short preamble. If any of the
-# associated STAs do not support short preamble, use of short preamble will be
-# disabled (and enabled when such STAs disassociate) dynamically.
-# 0 = do not allow use of short preamble (default)
-# 1 = allow use of short preamble
-#preamble=1
-
-# Station MAC address -based authentication
-# Please note that this kind of access control requires a driver that uses
-# hostapd to take care of management frame processing and as such, this can be
-# used with driver=hostap or driver=nl80211, but not with driver=madwifi.
-# 0 = accept unless in deny list
-# 1 = deny unless in accept list
-# 2 = use external RADIUS server (accept/deny lists are searched first)
-macaddr_acl=0
-
-# Accept/deny lists are read from separate files (containing list of
-# MAC addresses, one per line). Use absolute path name to make sure that the
-# files can be read on SIGHUP configuration reloads.
-#accept_mac_file=/etc/hostapd.accept
-#deny_mac_file=/etc/hostapd.deny
-
-# IEEE 802.11 specifies two authentication algorithms. hostapd can be
-# configured to allow both of these or only one. Open system authentication
-# should be used with IEEE 802.1X.
-# Bit fields of allowed authentication algorithms:
-# bit 0 = Open System Authentication
-# bit 1 = Shared Key Authentication (requires WEP)
-auth_algs=3
-
-# Send empty SSID in beacons and ignore probe request frames that do not
-# specify full SSID, i.e., require stations to know SSID.
-# default: disabled (0)
-# 1 = send empty (length=0) SSID in beacon and ignore probe request for
-# broadcast SSID
-# 2 = clear SSID (ASCII 0), but keep the original length (this may be required
-# with some clients that do not support empty SSID) and ignore probe
-# requests for broadcast SSID
-ignore_broadcast_ssid=0
-
-# TX queue parameters (EDCF / bursting)
-# tx_queue__
-# queues: data0, data1, data2, data3, after_beacon, beacon
-# (data0 is the highest priority queue)
-# parameters:
-# aifs: AIFS (default 2)
-# cwmin: cwMin (1, 3, 7, 15, 31, 63, 127, 255, 511, 1023)
-# cwmax: cwMax (1, 3, 7, 15, 31, 63, 127, 255, 511, 1023); cwMax >= cwMin
-# burst: maximum length (in milliseconds with precision of up to 0.1 ms) for
-# bursting
-#
-# Default WMM parameters (IEEE 802.11 draft; 11-03-0504-03-000e):
-# These parameters are used by the access point when transmitting frames
-# to the clients.
-#
-# Low priority / AC_BK = background
-#tx_queue_data3_aifs=7
-#tx_queue_data3_cwmin=15
-#tx_queue_data3_cwmax=1023
-#tx_queue_data3_burst=0
-# Note: for IEEE 802.11b mode: cWmin=31 cWmax=1023 burst=0
-#
-# Normal priority / AC_BE = best effort
-#tx_queue_data2_aifs=3
-#tx_queue_data2_cwmin=15
-#tx_queue_data2_cwmax=63
-#tx_queue_data2_burst=0
-# Note: for IEEE 802.11b mode: cWmin=31 cWmax=127 burst=0
-#
-# High priority / AC_VI = video
-#tx_queue_data1_aifs=1
-#tx_queue_data1_cwmin=7
-#tx_queue_data1_cwmax=15
-#tx_queue_data1_burst=3.0
-# Note: for IEEE 802.11b mode: cWmin=15 cWmax=31 burst=6.0
-#
-# Highest priority / AC_VO = voice
-#tx_queue_data0_aifs=1
-#tx_queue_data0_cwmin=3
-#tx_queue_data0_cwmax=7
-#tx_queue_data0_burst=1.5
-# Note: for IEEE 802.11b mode: cWmin=7 cWmax=15 burst=3.3
-
-# 802.1D Tag (= UP) to AC mappings
-# WMM specifies following mapping of data frames to different ACs. This mapping
-# can be configured using Linux QoS/tc and sch_pktpri.o module.
-# 802.1D Tag 802.1D Designation Access Category WMM Designation
-# 1 BK AC_BK Background
-# 2 - AC_BK Background
-# 0 BE AC_BE Best Effort
-# 3 EE AC_BE Best Effort
-# 4 CL AC_VI Video
-# 5 VI AC_VI Video
-# 6 VO AC_VO Voice
-# 7 NC AC_VO Voice
-# Data frames with no priority information: AC_BE
-# Management frames: AC_VO
-# PS-Poll frames: AC_BE
-
-# Default WMM parameters (IEEE 802.11 draft; 11-03-0504-03-000e):
-# for 802.11a or 802.11g networks
-# These parameters are sent to WMM clients when they associate.
-# The parameters will be used by WMM clients for frames transmitted to the
-# access point.
-#
-# note - txop_limit is in units of 32microseconds
-# note - acm is admission control mandatory flag. 0 = admission control not
-# required, 1 = mandatory
-# note - here cwMin and cmMax are in exponent form. the actual cw value used
-# will be (2^n)-1 where n is the value given here
-#
-wmm_enabled=1
-#
-# WMM-PS Unscheduled Automatic Power Save Delivery [U-APSD]
-# Enable this flag if U-APSD supported outside hostapd (eg., Firmware/driver)
-#uapsd_advertisement_enabled=1
-#
-# Low priority / AC_BK = background
-wmm_ac_bk_cwmin=4
-wmm_ac_bk_cwmax=10
-wmm_ac_bk_aifs=7
-wmm_ac_bk_txop_limit=0
-wmm_ac_bk_acm=0
-# Note: for IEEE 802.11b mode: cWmin=5 cWmax=10
-#
-# Normal priority / AC_BE = best effort
-wmm_ac_be_aifs=3
-wmm_ac_be_cwmin=4
-wmm_ac_be_cwmax=10
-wmm_ac_be_txop_limit=0
-wmm_ac_be_acm=0
-# Note: for IEEE 802.11b mode: cWmin=5 cWmax=7
-#
-# High priority / AC_VI = video
-wmm_ac_vi_aifs=2
-wmm_ac_vi_cwmin=3
-wmm_ac_vi_cwmax=4
-wmm_ac_vi_txop_limit=94
-wmm_ac_vi_acm=0
-# Note: for IEEE 802.11b mode: cWmin=4 cWmax=5 txop_limit=188
-#
-# Highest priority / AC_VO = voice
-wmm_ac_vo_aifs=2
-wmm_ac_vo_cwmin=2
-wmm_ac_vo_cwmax=3
-wmm_ac_vo_txop_limit=47
-wmm_ac_vo_acm=0
-# Note: for IEEE 802.11b mode: cWmin=3 cWmax=4 burst=102
-
-# Static WEP key configuration
-#
-# The key number to use when transmitting.
-# It must be between 0 and 3, and the corresponding key must be set.
-# default: not set
-#wep_default_key=0
-# The WEP keys to use.
-# A key may be a quoted string or unquoted hexadecimal digits.
-# The key length should be 5, 13, or 16 characters, or 10, 26, or 32
-# digits, depending on whether 40-bit (64-bit), 104-bit (128-bit), or
-# 128-bit (152-bit) WEP is used.
-# Only the default key must be supplied; the others are optional.
-# default: not set
-#wep_key0=123456789a
-#wep_key1="vwxyz"
-#wep_key2=0102030405060708090a0b0c0d
-#wep_key3=".2.4.6.8.0.23"
-
-# Station inactivity limit
-#
-# If a station does not send anything in ap_max_inactivity seconds, an
-# empty data frame is sent to it in order to verify whether it is
-# still in range. If this frame is not ACKed, the station will be
-# disassociated and then deauthenticated. This feature is used to
-# clear station table of old entries when the STAs move out of the
-# range.
-#
-# The station can associate again with the AP if it is still in range;
-# this inactivity poll is just used as a nicer way of verifying
-# inactivity; i.e., client will not report broken connection because
-# disassociation frame is not sent immediately without first polling
-# the STA with a data frame.
-# default: 300 (i.e., 5 minutes)
-#ap_max_inactivity=300
-
-# Disassociate stations based on excessive transmission failures or other
-# indications of connection loss. This depends on the driver capabilities and
-# may not be available with all drivers.
-#disassoc_low_ack=1
-
-# Maximum allowed Listen Interval (how many Beacon periods STAs are allowed to
-# remain asleep). Default: 65535 (no limit apart from field size)
-#max_listen_interval=100
-
-# WDS (4-address frame) mode with per-station virtual interfaces
-# (only supported with driver=nl80211)
-# This mode allows associated stations to use 4-address frames to allow layer 2
-# bridging to be used.
-#wds_sta=1
-
-# If bridge parameter is set, the WDS STA interface will be added to the same
-# bridge by default. This can be overridden with the wds_bridge parameter to
-# use a separate bridge.
-#wds_bridge=wds-br0
-
-# Client isolation can be used to prevent low-level bridging of frames between
-# associated stations in the BSS. By default, this bridging is allowed.
-#ap_isolate=1
-
-##### IEEE 802.11n related configuration ######################################
-
-# ieee80211n: Whether IEEE 802.11n (HT) is enabled
-# 0 = disabled (default)
-# 1 = enabled
-# Note: You will also need to enable WMM for full HT functionality.
-#ieee80211n=1
-
-# ht_capab: HT capabilities (list of flags)
-# LDPC coding capability: [LDPC] = supported
-# Supported channel width set: [HT40-] = both 20 MHz and 40 MHz with secondary
-# channel below the primary channel; [HT40+] = both 20 MHz and 40 MHz
-# with secondary channel below the primary channel
-# (20 MHz only if neither is set)
-# Note: There are limits on which channels can be used with HT40- and
-# HT40+. Following table shows the channels that may be available for
-# HT40- and HT40+ use per IEEE 802.11n Annex J:
-# freq HT40- HT40+
-# 2.4 GHz 5-13 1-7 (1-9 in Europe/Japan)
-# 5 GHz 40,48,56,64 36,44,52,60
-# (depending on the location, not all of these channels may be available
-# for use)
-# Please note that 40 MHz channels may switch their primary and secondary
-# channels if needed or creation of 40 MHz channel maybe rejected based
-# on overlapping BSSes. These changes are done automatically when hostapd
-# is setting up the 40 MHz channel.
-# Spatial Multiplexing (SM) Power Save: [SMPS-STATIC] or [SMPS-DYNAMIC]
-# (SMPS disabled if neither is set)
-# HT-greenfield: [GF] (disabled if not set)
-# Short GI for 20 MHz: [SHORT-GI-20] (disabled if not set)
-# Short GI for 40 MHz: [SHORT-GI-40] (disabled if not set)
-# Tx STBC: [TX-STBC] (disabled if not set)
-# Rx STBC: [RX-STBC1] (one spatial stream), [RX-STBC12] (one or two spatial
-# streams), or [RX-STBC123] (one, two, or three spatial streams); Rx STBC
-# disabled if none of these set
-# HT-delayed Block Ack: [DELAYED-BA] (disabled if not set)
-# Maximum A-MSDU length: [MAX-AMSDU-7935] for 7935 octets (3839 octets if not
-# set)
-# DSSS/CCK Mode in 40 MHz: [DSSS_CCK-40] = allowed (not allowed if not set)
-# PSMP support: [PSMP] (disabled if not set)
-# L-SIG TXOP protection support: [LSIG-TXOP-PROT] (disabled if not set)
-#ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40]
-
-# Require stations to support HT PHY (reject association if they do not)
-#require_ht=1
-
-##### IEEE 802.1X-2004 related configuration ##################################
-
-# Require IEEE 802.1X authorization
-#ieee8021x=1
-
-# IEEE 802.1X/EAPOL version
-# hostapd is implemented based on IEEE Std 802.1X-2004 which defines EAPOL
-# version 2. However, there are many client implementations that do not handle
-# the new version number correctly (they seem to drop the frames completely).
-# In order to make hostapd interoperate with these clients, the version number
-# can be set to the older version (1) with this configuration value.
-#eapol_version=2
-
-# Optional displayable message sent with EAP Request-Identity. The first \0
-# in this string will be converted to ASCII-0 (nul). This can be used to
-# separate network info (comma separated list of attribute=value pairs); see,
-# e.g., RFC 4284.
-#eap_message=hello
-#eap_message=hello\0networkid=netw,nasid=foo,portid=0,NAIRealms=example.com
-
-# WEP rekeying (disabled if key lengths are not set or are set to 0)
-# Key lengths for default/broadcast and individual/unicast keys:
-# 5 = 40-bit WEP (also known as 64-bit WEP with 40 secret bits)
-# 13 = 104-bit WEP (also known as 128-bit WEP with 104 secret bits)
-#wep_key_len_broadcast=5
-#wep_key_len_unicast=5
-# Rekeying period in seconds. 0 = do not rekey (i.e., set keys only once)
-#wep_rekey_period=300
-
-# EAPOL-Key index workaround (set bit7) for WinXP Supplicant (needed only if
-# only broadcast keys are used)
-eapol_key_index_workaround=0
-
-# EAP reauthentication period in seconds (default: 3600 seconds; 0 = disable
-# reauthentication).
-#eap_reauth_period=3600
-
-# Use PAE group address (01:80:c2:00:00:03) instead of individual target
-# address when sending EAPOL frames with driver=wired. This is the most common
-# mechanism used in wired authentication, but it also requires that the port
-# is only used by one station.
-#use_pae_group_addr=1
-
-##### Integrated EAP server ###################################################
-
-# Optionally, hostapd can be configured to use an integrated EAP server
-# to process EAP authentication locally without need for an external RADIUS
-# server. This functionality can be used both as a local authentication server
-# for IEEE 802.1X/EAPOL and as a RADIUS server for other devices.
-
-# Use integrated EAP server instead of external RADIUS authentication
-# server. This is also needed if hostapd is configured to act as a RADIUS
-# authentication server.
-eap_server=0
-
-# Path for EAP server user database
-#eap_user_file=/etc/hostapd.eap_user
-
-# CA certificate (PEM or DER file) for EAP-TLS/PEAP/TTLS
-#ca_cert=/etc/hostapd.ca.pem
-
-# Server certificate (PEM or DER file) for EAP-TLS/PEAP/TTLS
-#server_cert=/etc/hostapd.server.pem
-
-# Private key matching with the server certificate for EAP-TLS/PEAP/TTLS
-# This may point to the same file as server_cert if both certificate and key
-# are included in a single file. PKCS#12 (PFX) file (.p12/.pfx) can also be
-# used by commenting out server_cert and specifying the PFX file as the
-# private_key.
-#private_key=/etc/hostapd.server.prv
-
-# Passphrase for private key
-#private_key_passwd=secret passphrase
-
-# Enable CRL verification.
-# Note: hostapd does not yet support CRL downloading based on CDP. Thus, a
-# valid CRL signed by the CA is required to be included in the ca_cert file.
-# This can be done by using PEM format for CA certificate and CRL and
-# concatenating these into one file. Whenever CRL changes, hostapd needs to be
-# restarted to take the new CRL into use.
-# 0 = do not verify CRLs (default)
-# 1 = check the CRL of the user certificate
-# 2 = check all CRLs in the certificate path
-#check_crl=1
-
-# dh_file: File path to DH/DSA parameters file (in PEM format)
-# This is an optional configuration file for setting parameters for an
-# ephemeral DH key exchange. In most cases, the default RSA authentication does
-# not use this configuration. However, it is possible setup RSA to use
-# ephemeral DH key exchange. In addition, ciphers with DSA keys always use
-# ephemeral DH keys. This can be used to achieve forward secrecy. If the file
-# is in DSA parameters format, it will be automatically converted into DH
-# params. This parameter is required if anonymous EAP-FAST is used.
-# You can generate DH parameters file with OpenSSL, e.g.,
-# "openssl dhparam -out /etc/hostapd.dh.pem 1024"
-#dh_file=/etc/hostapd.dh.pem
-
-# Fragment size for EAP methods
-#fragment_size=1400
-
-# Configuration data for EAP-SIM database/authentication gateway interface.
-# This is a text string in implementation specific format. The example
-# implementation in eap_sim_db.c uses this as the UNIX domain socket name for
-# the HLR/AuC gateway (e.g., hlr_auc_gw). In this case, the path uses "unix:"
-# prefix.
-#eap_sim_db=unix:/tmp/hlr_auc_gw.sock
-
-# Encryption key for EAP-FAST PAC-Opaque values. This key must be a secret,
-# random value. It is configured as a 16-octet value in hex format. It can be
-# generated, e.g., with the following command:
-# od -tx1 -v -N16 /dev/random | colrm 1 8 | tr -d ' '
-#pac_opaque_encr_key=000102030405060708090a0b0c0d0e0f
-
-# EAP-FAST authority identity (A-ID)
-# A-ID indicates the identity of the authority that issues PACs. The A-ID
-# should be unique across all issuing servers. In theory, this is a variable
-# length field, but due to some existing implementations requiring A-ID to be
-# 16 octets in length, it is strongly recommended to use that length for the
-# field to provid interoperability with deployed peer implementations. This
-# field is configured in hex format.
-#eap_fast_a_id=101112131415161718191a1b1c1d1e1f
-
-# EAP-FAST authority identifier information (A-ID-Info)
-# This is a user-friendly name for the A-ID. For example, the enterprise name
-# and server name in a human-readable format. This field is encoded as UTF-8.
-#eap_fast_a_id_info=test server
-
-# Enable/disable different EAP-FAST provisioning modes:
-#0 = provisioning disabled
-#1 = only anonymous provisioning allowed
-#2 = only authenticated provisioning allowed
-#3 = both provisioning modes allowed (default)
-#eap_fast_prov=3
-
-# EAP-FAST PAC-Key lifetime in seconds (hard limit)
-#pac_key_lifetime=604800
-
-# EAP-FAST PAC-Key refresh time in seconds (soft limit on remaining hard
-# limit). The server will generate a new PAC-Key when this number of seconds
-# (or fewer) of the lifetime remains.
-#pac_key_refresh_time=86400
-
-# EAP-SIM and EAP-AKA protected success/failure indication using AT_RESULT_IND
-# (default: 0 = disabled).
-#eap_sim_aka_result_ind=1
-
-# Trusted Network Connect (TNC)
-# If enabled, TNC validation will be required before the peer is allowed to
-# connect. Note: This is only used with EAP-TTLS and EAP-FAST. If any other
-# EAP method is enabled, the peer will be allowed to connect without TNC.
-#tnc=1
-
-
-##### IEEE 802.11f - Inter-Access Point Protocol (IAPP) #######################
-
-# Interface to be used for IAPP broadcast packets
-#iapp_interface=eth0
-
-
-##### RADIUS client configuration #############################################
-# for IEEE 802.1X with external Authentication Server, IEEE 802.11
-# authentication with external ACL for MAC addresses, and accounting
-
-# The own IP address of the access point (used as NAS-IP-Address)
-own_ip_addr=127.0.0.1
-
-# Optional NAS-Identifier string for RADIUS messages. When used, this should be
-# a unique to the NAS within the scope of the RADIUS server. For example, a
-# fully qualified domain name can be used here.
-# When using IEEE 802.11r, nas_identifier must be set and must be between 1 and
-# 48 octets long.
-#nas_identifier=ap.example.com
-
-# RADIUS authentication server
-#auth_server_addr=127.0.0.1
-#auth_server_port=1812
-#auth_server_shared_secret=secret
-
-# RADIUS accounting server
-#acct_server_addr=127.0.0.1
-#acct_server_port=1813
-#acct_server_shared_secret=secret
-
-# Secondary RADIUS servers; to be used if primary one does not reply to
-# RADIUS packets. These are optional and there can be more than one secondary
-# server listed.
-#auth_server_addr=127.0.0.2
-#auth_server_port=1812
-#auth_server_shared_secret=secret2
-#
-#acct_server_addr=127.0.0.2
-#acct_server_port=1813
-#acct_server_shared_secret=secret2
-
-# Retry interval for trying to return to the primary RADIUS server (in
-# seconds). RADIUS client code will automatically try to use the next server
-# when the current server is not replying to requests. If this interval is set,
-# primary server will be retried after configured amount of time even if the
-# currently used secondary server is still working.
-#radius_retry_primary_interval=600
-
-
-# Interim accounting update interval
-# If this is set (larger than 0) and acct_server is configured, hostapd will
-# send interim accounting updates every N seconds. Note: if set, this overrides
-# possible Acct-Interim-Interval attribute in Access-Accept message. Thus, this
-# value should not be configured in hostapd.conf, if RADIUS server is used to
-# control the interim interval.
-# This value should not be less 600 (10 minutes) and must not be less than
-# 60 (1 minute).
-#radius_acct_interim_interval=600
-
-# Dynamic VLAN mode; allow RADIUS authentication server to decide which VLAN
-# is used for the stations. This information is parsed from following RADIUS
-# attributes based on RFC 3580 and RFC 2868: Tunnel-Type (value 13 = VLAN),
-# Tunnel-Medium-Type (value 6 = IEEE 802), Tunnel-Private-Group-ID (value
-# VLANID as a string). vlan_file option below must be configured if dynamic
-# VLANs are used. Optionally, the local MAC ACL list (accept_mac_file) can be
-# used to set static client MAC address to VLAN ID mapping.
-# 0 = disabled (default)
-# 1 = option; use default interface if RADIUS server does not include VLAN ID
-# 2 = required; reject authentication if RADIUS server does not include VLAN ID
-#dynamic_vlan=0
-
-# VLAN interface list for dynamic VLAN mode is read from a separate text file.
-# This list is used to map VLAN ID from the RADIUS server to a network
-# interface. Each station is bound to one interface in the same way as with
-# multiple BSSIDs or SSIDs. Each line in this text file is defining a new
-# interface and the line must include VLAN ID and interface name separated by
-# white space (space or tab).
-#vlan_file=/etc/hostapd.vlan
-
-# Interface where 802.1q tagged packets should appear when a RADIUS server is
-# used to determine which VLAN a station is on. hostapd creates a bridge for
-# each VLAN. Then hostapd adds a VLAN interface (associated with the interface
-# indicated by 'vlan_tagged_interface') and the appropriate wireless interface
-# to the bridge.
-#vlan_tagged_interface=eth0
-
-
-##### RADIUS authentication server configuration ##############################
-
-# hostapd can be used as a RADIUS authentication server for other hosts. This
-# requires that the integrated EAP server is also enabled and both
-# authentication services are sharing the same configuration.
-
-# File name of the RADIUS clients configuration for the RADIUS server. If this
-# commented out, RADIUS server is disabled.
-#radius_server_clients=/etc/hostapd.radius_clients
-
-# The UDP port number for the RADIUS authentication server
-#radius_server_auth_port=1812
-
-# Use IPv6 with RADIUS server (IPv4 will also be supported using IPv6 API)
-#radius_server_ipv6=1
-
-
-##### WPA/IEEE 802.11i configuration ##########################################
-
-# Enable WPA. Setting this variable configures the AP to require WPA (either
-# WPA-PSK or WPA-RADIUS/EAP based on other configuration). For WPA-PSK, either
-# wpa_psk or wpa_passphrase must be set and wpa_key_mgmt must include WPA-PSK.
-# For WPA-RADIUS/EAP, ieee8021x must be set (but without dynamic WEP keys),
-# RADIUS authentication server must be configured, and WPA-EAP must be included
-# in wpa_key_mgmt.
-# This field is a bit field that can be used to enable WPA (IEEE 802.11i/D3.0)
-# and/or WPA2 (full IEEE 802.11i/RSN):
-# bit0 = WPA
-# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
-#wpa=1
-
-# WPA pre-shared keys for WPA-PSK. This can be either entered as a 256-bit
-# secret in hex format (64 hex digits), wpa_psk, or as an ASCII passphrase
-# (8..63 characters) that will be converted to PSK. This conversion uses SSID
-# so the PSK changes when ASCII passphrase is used and the SSID is changed.
-# wpa_psk (dot11RSNAConfigPSKValue)
-# wpa_passphrase (dot11RSNAConfigPSKPassPhrase)
-#wpa_psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
-#wpa_passphrase=secret passphrase
-
-# Optionally, WPA PSKs can be read from a separate text file (containing list
-# of (PSK,MAC address) pairs. This allows more than one PSK to be configured.
-# Use absolute path name to make sure that the files can be read on SIGHUP
-# configuration reloads.
-#wpa_psk_file=/etc/hostapd.wpa_psk
-
-# Set of accepted key management algorithms (WPA-PSK, WPA-EAP, or both). The
-# entries are separated with a space. WPA-PSK-SHA256 and WPA-EAP-SHA256 can be
-# added to enable SHA256-based stronger algorithms.
-# (dot11RSNAConfigAuthenticationSuitesTable)
-#wpa_key_mgmt=WPA-PSK WPA-EAP
-
-# Set of accepted cipher suites (encryption algorithms) for pairwise keys
-# (unicast packets). This is a space separated list of algorithms:
-# CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0]
-# TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
-# Group cipher suite (encryption algorithm for broadcast and multicast frames)
-# is automatically selected based on this configuration. If only CCMP is
-# allowed as the pairwise cipher, group cipher will also be CCMP. Otherwise,
-# TKIP will be used as the group cipher.
-# (dot11RSNAConfigPairwiseCiphersTable)
-# Pairwise cipher for WPA (v1) (default: TKIP)
-#wpa_pairwise=TKIP CCMP
-# Pairwise cipher for RSN/WPA2 (default: use wpa_pairwise value)
-#rsn_pairwise=CCMP
-
-# Time interval for rekeying GTK (broadcast/multicast encryption keys) in
-# seconds. (dot11RSNAConfigGroupRekeyTime)
-#wpa_group_rekey=600
-
-# Rekey GTK when any STA that possesses the current GTK is leaving the BSS.
-# (dot11RSNAConfigGroupRekeyStrict)
-#wpa_strict_rekey=1
-
-# Time interval for rekeying GMK (master key used internally to generate GTKs
-# (in seconds).
-#wpa_gmk_rekey=86400
-
-# Maximum lifetime for PTK in seconds. This can be used to enforce rekeying of
-# PTK to mitigate some attacks against TKIP deficiencies.
-#wpa_ptk_rekey=600
-
-# Enable IEEE 802.11i/RSN/WPA2 pre-authentication. This is used to speed up
-# roaming be pre-authenticating IEEE 802.1X/EAP part of the full RSN
-# authentication and key handshake before actually associating with a new AP.
-# (dot11RSNAPreauthenticationEnabled)
-#rsn_preauth=1
-#
-# Space separated list of interfaces from which pre-authentication frames are
-# accepted (e.g., 'eth0' or 'eth0 wlan0wds0'. This list should include all
-# interface that are used for connections to other APs. This could include
-# wired interfaces and WDS links. The normal wireless data interface towards
-# associated stations (e.g., wlan0) should not be added, since
-# pre-authentication is only used with APs other than the currently associated
-# one.
-#rsn_preauth_interfaces=eth0
-
-# peerkey: Whether PeerKey negotiation for direct links (IEEE 802.11e) is
-# allowed. This is only used with RSN/WPA2.
-# 0 = disabled (default)
-# 1 = enabled
-#peerkey=1
-
-# ieee80211w: Whether management frame protection (MFP) is enabled
-# 0 = disabled (default)
-# 1 = optional
-# 2 = required
-#ieee80211w=0
-
-# Association SA Query maximum timeout (in TU = 1.024 ms; for MFP)
-# (maximum time to wait for a SA Query response)
-# dot11AssociationSAQueryMaximumTimeout, 1...4294967295
-#assoc_sa_query_max_timeout=1000
-
-# Association SA Query retry timeout (in TU = 1.024 ms; for MFP)
-# (time between two subsequent SA Query requests)
-# dot11AssociationSAQueryRetryTimeout, 1...4294967295
-#assoc_sa_query_retry_timeout=201
-
-
-# okc: Opportunistic Key Caching (aka Proactive Key Caching)
-# Allow PMK cache to be shared opportunistically among configured interfaces
-# and BSSes (i.e., all configurations within a single hostapd process).
-# 0 = disabled (default)
-# 1 = enabled
-#okc=1
-
-
-##### IEEE 802.11r configuration ##############################################
-
-# Mobility Domain identifier (dot11FTMobilityDomainID, MDID)
-# MDID is used to indicate a group of APs (within an ESS, i.e., sharing the
-# same SSID) between which a STA can use Fast BSS Transition.
-# 2-octet identifier as a hex string.
-#mobility_domain=a1b2
-
-# PMK-R0 Key Holder identifier (dot11FTR0KeyHolderID)
-# 1 to 48 octet identifier.
-# This is configured with nas_identifier (see RADIUS client section above).
-
-# Default lifetime of the PMK-RO in minutes; range 1..65535
-# (dot11FTR0KeyLifetime)
-#r0_key_lifetime=10000
-
-# PMK-R1 Key Holder identifier (dot11FTR1KeyHolderID)
-# 6-octet identifier as a hex string.
-#r1_key_holder=000102030405
-
-# Reassociation deadline in time units (TUs / 1.024 ms; range 1000..65535)
-# (dot11FTReassociationDeadline)
-#reassociation_deadline=1000
-
-# List of R0KHs in the same Mobility Domain
-# format: <128-bit key as hex string>
-# This list is used to map R0KH-ID (NAS Identifier) to a destination MAC
-# address when requesting PMK-R1 key from the R0KH that the STA used during the
-# Initial Mobility Domain Association.
-#r0kh=02:01:02:03:04:05 r0kh-1.example.com 000102030405060708090a0b0c0d0e0f
-#r0kh=02:01:02:03:04:06 r0kh-2.example.com 00112233445566778899aabbccddeeff
-# And so on.. One line per R0KH.
-
-# List of R1KHs in the same Mobility Domain
-# format: <128-bit key as hex string>
-# This list is used to map R1KH-ID to a destination MAC address when sending
-# PMK-R1 key from the R0KH. This is also the list of authorized R1KHs in the MD
-# that can request PMK-R1 keys.
-#r1kh=02:01:02:03:04:05 02:11:22:33:44:55 000102030405060708090a0b0c0d0e0f
-#r1kh=02:01:02:03:04:06 02:11:22:33:44:66 00112233445566778899aabbccddeeff
-# And so on.. One line per R1KH.
-
-# Whether PMK-R1 push is enabled at R0KH
-# 0 = do not push PMK-R1 to all configured R1KHs (default)
-# 1 = push PMK-R1 to all configured R1KHs whenever a new PMK-R0 is derived
-#pmk_r1_push=1
-
-##### Neighbor table ##########################################################
-# Maximum number of entries kept in AP table (either for neigbor table or for
-# detecting Overlapping Legacy BSS Condition). The oldest entry will be
-# removed when adding a new entry that would make the list grow over this
-# limit. Note! WFA certification for IEEE 802.11g requires that OLBC is
-# enabled, so this field should not be set to 0 when using IEEE 802.11g.
-# default: 255
-#ap_table_max_size=255
-
-# Number of seconds of no frames received after which entries may be deleted
-# from the AP table. Since passive scanning is not usually performed frequently
-# this should not be set to very small value. In addition, there is no
-# guarantee that every scan cycle will receive beacon frames from the
-# neighboring APs.
-# default: 60
-#ap_table_expiration_time=3600
-
-
-##### Wi-Fi Protected Setup (WPS) #############################################
-
-# WPS state
-# 0 = WPS disabled (default)
-# 1 = WPS enabled, not configured
-# 2 = WPS enabled, configured
-#wps_state=2
-
-# AP can be configured into a locked state where new WPS Registrar are not
-# accepted, but previously authorized Registrars (including the internal one)
-# can continue to add new Enrollees.
-#ap_setup_locked=1
-
-# Universally Unique IDentifier (UUID; see RFC 4122) of the device
-# This value is used as the UUID for the internal WPS Registrar. If the AP
-# is also using UPnP, this value should be set to the device's UPnP UUID.
-# If not configured, UUID will be generated based on the local MAC address.
-#uuid=12345678-9abc-def0-1234-56789abcdef0
-
-# Note: If wpa_psk_file is set, WPS is used to generate random, per-device PSKs
-# that will be appended to the wpa_psk_file. If wpa_psk_file is not set, the
-# default PSK (wpa_psk/wpa_passphrase) will be delivered to Enrollees. Use of
-# per-device PSKs is recommended as the more secure option (i.e., make sure to
-# set wpa_psk_file when using WPS with WPA-PSK).
-
-# When an Enrollee requests access to the network with PIN method, the Enrollee
-# PIN will need to be entered for the Registrar. PIN request notifications are
-# sent to hostapd ctrl_iface monitor. In addition, they can be written to a
-# text file that could be used, e.g., to populate the AP administration UI with
-# pending PIN requests. If the following variable is set, the PIN requests will
-# be written to the configured file.
-#wps_pin_requests=/var/run/hostapd_wps_pin_requests
-
-# Device Name
-# User-friendly description of device; up to 32 octets encoded in UTF-8
-#device_name=Wireless AP
-
-# Manufacturer
-# The manufacturer of the device (up to 64 ASCII characters)
-#manufacturer=Company
-
-# Model Name
-# Model of the device (up to 32 ASCII characters)
-#model_name=WAP
-
-# Model Number
-# Additional device description (up to 32 ASCII characters)
-#model_number=123
-
-# Serial Number
-# Serial number of the device (up to 32 characters)
-#serial_number=12345
-
-# Primary Device Type
-# Used format: --
-# categ = Category as an integer value
-# OUI = OUI and type octet as a 4-octet hex-encoded value; 0050F204 for
-# default WPS OUI
-# subcateg = OUI-specific Sub Category as an integer value
-# Examples:
-# 1-0050F204-1 (Computer / PC)
-# 1-0050F204-2 (Computer / Server)
-# 5-0050F204-1 (Storage / NAS)
-# 6-0050F204-1 (Network Infrastructure / AP)
-#device_type=6-0050F204-1
-
-# OS Version
-# 4-octet operating system version number (hex string)
-#os_version=01020300
-
-# Config Methods
-# List of the supported configuration methods
-# Available methods: usba ethernet label display ext_nfc_token int_nfc_token
-# nfc_interface push_button keypad virtual_display physical_display
-# virtual_push_button physical_push_button
-#config_methods=label virtual_display virtual_push_button keypad
-
-# Static access point PIN for initial configuration and adding Registrars
-# If not set, hostapd will not allow external WPS Registrars to control the
-# access point. The AP PIN can also be set at runtime with hostapd_cli
-# wps_ap_pin command. Use of temporary (enabled by user action) and random
-# AP PIN is much more secure than configuring a static AP PIN here. As such,
-# use of the ap_pin parameter is not recommended if the AP device has means for
-# displaying a random PIN.
-#ap_pin=12345670
-
-# Skip building of automatic WPS credential
-# This can be used to allow the automatically generated Credential attribute to
-# be replaced with pre-configured Credential(s).
-#skip_cred_build=1
-
-# Additional Credential attribute(s)
-# This option can be used to add pre-configured Credential attributes into M8
-# message when acting as a Registrar. If skip_cred_build=1, this data will also
-# be able to override the Credential attribute that would have otherwise been
-# automatically generated based on network configuration. This configuration
-# option points to an external file that much contain the WPS Credential
-# attribute(s) as binary data.
-#extra_cred=hostapd.cred
-
-# Credential processing
-# 0 = process received credentials internally (default)
-# 1 = do not process received credentials; just pass them over ctrl_iface to
-# external program(s)
-# 2 = process received credentials internally and pass them over ctrl_iface
-# to external program(s)
-# Note: With wps_cred_processing=1, skip_cred_build should be set to 1 and
-# extra_cred be used to provide the Credential data for Enrollees.
-#
-# wps_cred_processing=1 will disabled automatic updates of hostapd.conf file
-# both for Credential processing and for marking AP Setup Locked based on
-# validation failures of AP PIN. An external program is responsible on updating
-# the configuration appropriately in this case.
-#wps_cred_processing=0
-
-# AP Settings Attributes for M7
-# By default, hostapd generates the AP Settings Attributes for M7 based on the
-# current configuration. It is possible to override this by providing a file
-# with pre-configured attributes. This is similar to extra_cred file format,
-# but the AP Settings attributes are not encapsulated in a Credential
-# attribute.
-#ap_settings=hostapd.ap_settings
-
-# WPS UPnP interface
-# If set, support for external Registrars is enabled.
-#upnp_iface=br0
-
-# Friendly Name (required for UPnP)
-# Short description for end use. Should be less than 64 characters.
-#friendly_name=WPS Access Point
-
-# Manufacturer URL (optional for UPnP)
-#manufacturer_url=http://www.example.com/
-
-# Model Description (recommended for UPnP)
-# Long description for end user. Should be less than 128 characters.
-#model_description=Wireless Access Point
-
-# Model URL (optional for UPnP)
-#model_url=http://www.example.com/model/
-
-# Universal Product Code (optional for UPnP)
-# 12-digit, all-numeric code that identifies the consumer package.
-#upc=123456789012
-
-##### Wi-Fi Direct (P2P) ######################################################
-
-# Enable P2P Device management
-#manage_p2p=1
-
-# Allow cross connection
-#allow_cross_connection=1
-
-#### TDLS (IEEE 802.11z-2010) #################################################
-
-# Prohibit use of TDLS in this BSS
-#tdls_prohibit=1
-
-# Prohibit use of TDLS Channel Switching in this BSS
-#tdls_prohibit_chan_switch=1
-
-##### Multiple BSSID support ##################################################
-#
-# Above configuration is using the default interface (wlan#, or multi-SSID VLAN
-# interfaces). Other BSSIDs can be added by using separator 'bss' with
-# default interface name to be allocated for the data packets of the new BSS.
-#
-# hostapd will generate BSSID mask based on the BSSIDs that are
-# configured. hostapd will verify that dev_addr & MASK == dev_addr. If this is
-# not the case, the MAC address of the radio must be changed before starting
-# hostapd (ifconfig wlan0 hw ether ). If a BSSID is configured for
-# every secondary BSS, this limitation is not applied at hostapd and other
-# masks may be used if the driver supports them (e.g., swap the locally
-# administered bit)
-#
-# BSSIDs are assigned in order to each BSS, unless an explicit BSSID is
-# specified using the 'bssid' parameter.
-# If an explicit BSSID is specified, it must be chosen such that it:
-# - results in a valid MASK that covers it and the dev_addr
-# - is not the same as the MAC address of the radio
-# - is not the same as any other explicitly specified BSSID
-#
-# Please note that hostapd uses some of the values configured for the first BSS
-# as the defaults for the following BSSes. However, it is recommended that all
-# BSSes include explicit configuration of all relevant configuration items.
-#
-#bss=wlan0_0
-#ssid=test2
-# most of the above items can be used here (apart from radio interface specific
-# items, like channel)
-
-#bss=wlan0_1
-#bssid=00:13:10:95:fe:0b
-# ...
diff --git a/hostapd-0.8/hostapd/hostapd.deny b/hostapd-0.8/hostapd/hostapd.deny
deleted file mode 100644
index 1616678..0000000
--- a/hostapd-0.8/hostapd/hostapd.deny
+++ /dev/null
@@ -1,5 +0,0 @@
-# List of MAC addresses that are not allowed to authenticate (IEEE 802.11)
-# with the AP.
-00:20:30:40:50:60
-00:ab:cd:ef:12:34
-00:00:30:40:50:60
diff --git a/hostapd-0.8/hostapd/hostapd.eap_user b/hostapd-0.8/hostapd/hostapd.eap_user
deleted file mode 100644
index ac9a5d8..0000000
--- a/hostapd-0.8/hostapd/hostapd.eap_user
+++ /dev/null
@@ -1,91 +0,0 @@
-# hostapd user database for integrated EAP server
-
-# Each line must contain an identity, EAP method(s), and an optional password
-# separated with whitespace (space or tab). The identity and password must be
-# double quoted ("user"). Password can alternatively be stored as
-# NtPasswordHash (16-byte MD4 hash of the unicode presentation of the password
-# in unicode) if it is used for MSCHAP or MSCHAPv2 authentication. This means
-# that the plaintext password does not need to be included in the user file.
-# Password hash is stored as hash:<16-octets of hex data> without quotation
-# marks.
-
-# [2] flag in the end of the line can be used to mark users for tunneled phase
-# 2 authentication (e.g., within EAP-PEAP). In these cases, an anonymous
-# identity can be used in the unencrypted phase 1 and the real user identity
-# is transmitted only within the encrypted tunnel in phase 2. If non-anonymous
-# access is needed, two user entries is needed, one for phase 1 and another
-# with the same username for phase 2.
-#
-# EAP-TLS, EAP-PEAP, EAP-TTLS, EAP-FAST, EAP-SIM, and EAP-AKA do not use
-# password option.
-# EAP-MD5, EAP-MSCHAPV2, EAP-GTC, EAP-PAX, EAP-PSK, and EAP-SAKE require a
-# password.
-# EAP-PEAP, EAP-TTLS, and EAP-FAST require Phase 2 configuration.
-#
-# * can be used as a wildcard to match any user identity. The main purposes for
-# this are to set anonymous phase 1 identity for EAP-PEAP and EAP-TTLS and to
-# avoid having to configure every certificate for EAP-TLS authentication. The
-# first matching entry is selected, so * should be used as the last phase 1
-# user entry.
-#
-# "prefix"* can be used to match the given prefix and anything after this. The
-# main purpose for this is to be able to avoid EAP method negotiation when the
-# method is using known prefix in identities (e.g., EAP-SIM and EAP-AKA). This
-# is only allowed for phase 1 identities.
-#
-# Multiple methods can be configured to make the authenticator try them one by
-# one until the peer accepts one. The method names are separated with a
-# comma (,).
-#
-# [ver=0] and [ver=1] flags after EAP type PEAP can be used to force PEAP
-# version based on the Phase 1 identity. Without this flag, the EAP
-# authenticator advertises the highest supported version and select the version
-# based on the first PEAP packet from the supplicant.
-#
-# EAP-TTLS supports both EAP and non-EAP authentication inside the tunnel.
-# Tunneled EAP methods are configured with standard EAP method name and [2]
-# flag. Non-EAP methods can be enabled by following method names: TTLS-PAP,
-# TTLS-CHAP, TTLS-MSCHAP, TTLS-MSCHAPV2. TTLS-PAP and TTLS-CHAP require a
-# plaintext password while TTLS-MSCHAP and TTLS-MSCHAPV2 can use NT password
-# hash.
-
-# Phase 1 users
-"user" MD5 "password"
-"test user" MD5 "secret"
-"example user" TLS
-"DOMAIN\user" MSCHAPV2 "password"
-"gtc user" GTC "password"
-"pax user" PAX "unknown"
-"pax.user@example.com" PAX 0123456789abcdef0123456789abcdef
-"psk user" PSK "unknown"
-"psk.user@example.com" PSK 0123456789abcdef0123456789abcdef
-"sake.user@example.com" SAKE 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
-"ttls" TTLS
-"not anonymous" PEAP
-# Default to EAP-SIM and EAP-AKA based on fixed identity prefixes
-"0"* AKA,TTLS,TLS,PEAP,SIM
-"1"* SIM,TTLS,TLS,PEAP,AKA
-"2"* AKA,TTLS,TLS,PEAP,SIM
-"3"* SIM,TTLS,TLS,PEAP,AKA
-"4"* AKA,TTLS,TLS,PEAP,SIM
-"5"* SIM,TTLS,TLS,PEAP,AKA
-
-# Wildcard for all other identities
-* PEAP,TTLS,TLS,SIM,AKA
-
-# Phase 2 (tunnelled within EAP-PEAP or EAP-TTLS) users
-"t-md5" MD5 "password" [2]
-"DOMAIN\t-mschapv2" MSCHAPV2 "password" [2]
-"t-gtc" GTC "password" [2]
-"not anonymous" MSCHAPV2 "password" [2]
-"user" MD5,GTC,MSCHAPV2 "password" [2]
-"test user" MSCHAPV2 hash:000102030405060708090a0b0c0d0e0f [2]
-"ttls-user" TTLS-PAP,TTLS-CHAP,TTLS-MSCHAP,TTLS-MSCHAPV2 "password" [2]
-
-# Default to EAP-SIM and EAP-AKA based on fixed identity prefixes in phase 2
-"0"* AKA [2]
-"1"* SIM [2]
-"2"* AKA [2]
-"3"* SIM [2]
-"4"* AKA [2]
-"5"* SIM [2]
diff --git a/hostapd-0.8/hostapd/hostapd.radius_clients b/hostapd-0.8/hostapd/hostapd.radius_clients
deleted file mode 100644
index 3980427..0000000
--- a/hostapd-0.8/hostapd/hostapd.radius_clients
+++ /dev/null
@@ -1,4 +0,0 @@
-# RADIUS client configuration for the RADIUS server
-10.1.2.3 secret passphrase
-192.168.1.0/24 another very secret passphrase
-0.0.0.0/0 radius
diff --git a/hostapd-0.8/hostapd/hostapd.sim_db b/hostapd-0.8/hostapd/hostapd.sim_db
deleted file mode 100644
index 01c593d..0000000
--- a/hostapd-0.8/hostapd/hostapd.sim_db
+++ /dev/null
@@ -1,9 +0,0 @@
-# Example GSM authentication triplet file for EAP-SIM authenticator
-# IMSI:Kc:SRES:RAND
-# IMSI: ASCII string (numbers)
-# Kc: hex, 8 octets
-# SRES: hex, 4 octets
-# RAND: hex, 16 octets
-234567898765432:A0A1A2A3A4A5A6A7:D1D2D3D4:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-234567898765432:B0B1B2B3B4B5B6B7:E1E2E3E4:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-234567898765432:C0C1C2C3C4C5C6C7:F1F2F3F4:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
diff --git a/hostapd-0.8/hostapd/hostapd.vlan b/hostapd-0.8/hostapd/hostapd.vlan
deleted file mode 100644
index 98254fa..0000000
--- a/hostapd-0.8/hostapd/hostapd.vlan
+++ /dev/null
@@ -1,9 +0,0 @@
-# VLAN ID to network interface mapping
-1 vlan1
-2 vlan2
-3 vlan3
-100 guest
-# Optional wildcard entry matching all VLAN IDs. The first # in the interface
-# name will be replaced with the VLAN ID. The network interfaces are created
-# (and removed) dynamically based on the use.
-* vlan#
diff --git a/hostapd-0.8/hostapd/hostapd.wpa_psk b/hostapd-0.8/hostapd/hostapd.wpa_psk
deleted file mode 100644
index 0a9499a..0000000
--- a/hostapd-0.8/hostapd/hostapd.wpa_psk
+++ /dev/null
@@ -1,9 +0,0 @@
-# List of WPA PSKs. Each line, except for empty lines and lines starting
-# with #, must contain a MAC address and PSK separated with a space.
-# Special MAC address 00:00:00:00:00:00 can be used to configure PSKs that
-# anyone can use. PSK can be configured as an ASCII passphrase of 8..63
-# characters or as a 256-bit hex PSK (64 hex digits).
-00:00:00:00:00:00 secret passphrase
-00:11:22:33:44:55 another passphrase
-00:22:33:44:55:66 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
-00:00:00:00:00:00 another passphrase for all STAs
diff --git a/hostapd-0.8/hostapd/hostapd_cli.1 b/hostapd-0.8/hostapd/hostapd_cli.1
deleted file mode 100644
index 218ea15..0000000
--- a/hostapd-0.8/hostapd/hostapd_cli.1
+++ /dev/null
@@ -1,89 +0,0 @@
-.TH HOSTAPD_CLI 1 "April 7, 2005" hostapd_cli "hostapd command-line interface"
-.SH NAME
-hostapd_cli \- hostapd command-line interface
-.SH SYNOPSIS
-.B hostapd_cli
-[\-p] [\-i] [\-a] [\-hvB] [command..]
-.SH DESCRIPTION
-This manual page documents briefly the
-.B hostapd_cli
-utility.
-.PP
-.B hostapd_cli
-is a command-line interface for the
-.B hostapd
-daemon.
-
-.B hostapd
-is a user space daemon for access point and authentication servers.
-It implements IEEE 802.11 access point management, IEEE 802.1X/WPA/WPA2/EAP Authenticators and RADIUS authentication server.
-For more information about
-.B hostapd
-refer to the
-.BR hostapd (8)
-man page.
-.SH OPTIONS
-A summary of options is included below.
-For a complete description, run
-.BR hostapd_cli
-from the command line.
-.TP
-.B \-p
-Path to find control sockets.
-
-Default: /var/run/hostapd
-.TP
-.B \-i
-Interface to listen on.
-
-Default: first interface found in socket path.
-.TP
-.B \-a
-Run in daemon mode executing the action file based on events from hostapd.
-.TP
-.B \-B
-Run a daemon in the background.
-.TP
-.B \-h
-Show usage.
-.TP
-.B \-v
-Show hostapd_cli version.
-.SH COMMANDS
-A summary of commands is included below.
-For a complete description, run
-.BR hostapd_cli
-from the command line.
-.TP
-.B mib
-Get MIB variables (dot1x, dot11, radius).
-.TP
-.B sta
-Get MIB variables for one station.
-.TP
-.B all_sta
-Get MIB variables for all stations.
-.TP
-.B help
-Get usage help.
-.TP
-.B interface [ifname]
-Show interfaces/select interface.
-.TP
-.B level
-Change debug level.
-.TP
-.B license
-Show full
-.B hostapd_cli
-license.
-.TP
-.B quit
-Exit hostapd_cli.
-.SH SEE ALSO
-.BR hostapd (8).
-.SH AUTHOR
-hostapd_cli was written by Jouni Malinen .
-.PP
-This manual page was written by Faidon Liambotis ,
-for the Debian project (but may be used by others).
diff --git a/hostapd-0.8/hostapd/hostapd_cli.c b/hostapd-0.8/hostapd/hostapd_cli.c
deleted file mode 100644
index a48d773..0000000
--- a/hostapd-0.8/hostapd/hostapd_cli.c
+++ /dev/null
@@ -1,1044 +0,0 @@
-/*
- * hostapd - command line interface for hostapd daemon
- * Copyright (c) 2004-2011, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "includes.h"
-#include
-
-#include "common/wpa_ctrl.h"
-#include "common.h"
-#include "common/version.h"
-
-
-static const char *hostapd_cli_version =
-"hostapd_cli v" VERSION_STR "\n"
-"Copyright (c) 2004-2011, Jouni Malinen and contributors";
-
-
-static const char *hostapd_cli_license =
-"This program is free software. You can distribute it and/or modify it\n"
-"under the terms of the GNU General Public License version 2.\n"
-"\n"
-"Alternatively, this software may be distributed under the terms of the\n"
-"BSD license. See README and COPYING for more details.\n";
-
-static const char *hostapd_cli_full_license =
-"This program is free software; you can redistribute it and/or modify\n"
-"it under the terms of the GNU General Public License version 2 as\n"
-"published by the Free Software Foundation.\n"
-"\n"
-"This program is distributed in the hope that it will be useful,\n"
-"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
-"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
-"GNU General Public License for more details.\n"
-"\n"
-"You should have received a copy of the GNU General Public License\n"
-"along with this program; if not, write to the Free Software\n"
-"Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
-"\n"
-"Alternatively, this software may be distributed under the terms of the\n"
-"BSD license.\n"
-"\n"
-"Redistribution and use in source and binary forms, with or without\n"
-"modification, are permitted provided that the following conditions are\n"
-"met:\n"
-"\n"
-"1. Redistributions of source code must retain the above copyright\n"
-" notice, this list of conditions and the following disclaimer.\n"
-"\n"
-"2. Redistributions in binary form must reproduce the above copyright\n"
-" notice, this list of conditions and the following disclaimer in the\n"
-" documentation and/or other materials provided with the distribution.\n"
-"\n"
-"3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
-" names of its contributors may be used to endorse or promote products\n"
-" derived from this software without specific prior written permission.\n"
-"\n"
-"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
-"\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
-"LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
-"A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
-"OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
-"SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
-"LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
-"DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
-"THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
-"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
-"OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
-"\n";
-
-static const char *commands_help =
-"Commands:\n"
-" mib get MIB variables (dot1x, dot11, radius)\n"
-" sta get MIB variables for one station\n"
-" all_sta get MIB variables for all stations\n"
-" new_sta add a new station\n"
-" deauthenticate deauthenticate a station\n"
-" disassociate disassociate a station\n"
-#ifdef CONFIG_IEEE80211W
-" sa_query send SA Query to a station\n"
-#endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_WPS
-" wps_pin [timeout] [addr] add WPS Enrollee PIN\n"
-" wps_check_pin verify PIN checksum\n"
-" wps_pbc indicate button pushed to initiate PBC\n"
-#ifdef CONFIG_WPS_OOB
-" wps_oob use WPS with out-of-band (UFD)\n"
-#endif /* CONFIG_WPS_OOB */
-" wps_ap_pin [params..] enable/disable AP PIN\n"
-" wps_config configure AP\n"
-#endif /* CONFIG_WPS */
-" get_config show current configuration\n"
-" help show this usage help\n"
-" interface [ifname] show interfaces/select interface\n"
-" level change debug level\n"
-" license show full hostapd_cli license\n"
-" quit exit hostapd_cli\n";
-
-static struct wpa_ctrl *ctrl_conn;
-static int hostapd_cli_quit = 0;
-static int hostapd_cli_attached = 0;
-static const char *ctrl_iface_dir = "/var/run/hostapd";
-static char *ctrl_ifname = NULL;
-static const char *pid_file = NULL;
-static const char *action_file = NULL;
-static int ping_interval = 5;
-
-
-static void usage(void)
-{
- fprintf(stderr, "%s\n", hostapd_cli_version);
- fprintf(stderr,
- "\n"
- "usage: hostapd_cli [-p] [-i] [-hvB] "
- "[-a] \\\n"
- " [-G] [command..]\n"
- "\n"
- "Options:\n"
- " -h help (show this usage text)\n"
- " -v shown version information\n"
- " -p path to find control sockets (default: "
- "/var/run/hostapd)\n"
- " -a run in daemon mode executing the action file "
- "based on events\n"
- " from hostapd\n"
- " -B run a daemon in the background\n"
- " -i Interface to listen on (default: first "
- "interface found in the\n"
- " socket path)\n\n"
- "%s",
- commands_help);
-}
-
-
-static struct wpa_ctrl * hostapd_cli_open_connection(const char *ifname)
-{
- char *cfile;
- int flen;
-
- if (ifname == NULL)
- return NULL;
-
- flen = strlen(ctrl_iface_dir) + strlen(ifname) + 2;
- cfile = malloc(flen);
- if (cfile == NULL)
- return NULL;
- snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, ifname);
-
- ctrl_conn = wpa_ctrl_open(cfile);
- free(cfile);
- return ctrl_conn;
-}
-
-
-static void hostapd_cli_close_connection(void)
-{
- if (ctrl_conn == NULL)
- return;
-
- if (hostapd_cli_attached) {
- wpa_ctrl_detach(ctrl_conn);
- hostapd_cli_attached = 0;
- }
- wpa_ctrl_close(ctrl_conn);
- ctrl_conn = NULL;
-}
-
-
-static void hostapd_cli_msg_cb(char *msg, size_t len)
-{
- printf("%s\n", msg);
-}
-
-
-static int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print)
-{
- char buf[4096];
- size_t len;
- int ret;
-
- if (ctrl_conn == NULL) {
- printf("Not connected to hostapd - command dropped.\n");
- return -1;
- }
- len = sizeof(buf) - 1;
- ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len,
- hostapd_cli_msg_cb);
- if (ret == -2) {
- printf("'%s' command timed out.\n", cmd);
- return -2;
- } else if (ret < 0) {
- printf("'%s' command failed.\n", cmd);
- return -1;
- }
- if (print) {
- buf[len] = '\0';
- printf("%s", buf);
- }
- return 0;
-}
-
-
-static inline int wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd)
-{
- return _wpa_ctrl_command(ctrl, cmd, 1);
-}
-
-
-static int hostapd_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[])
-{
- return wpa_ctrl_command(ctrl, "PING");
-}
-
-
-static int hostapd_cli_cmd_relog(struct wpa_ctrl *ctrl, int argc, char *argv[])
-{
- return wpa_ctrl_command(ctrl, "RELOG");
-}
-
-
-static int hostapd_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[])
-{
- return wpa_ctrl_command(ctrl, "MIB");
-}
-
-
-static int hostapd_cli_exec(const char *program, const char *arg1,
- const char *arg2)
-{
- char *cmd;
- size_t len;
- int res;
- int ret = 0;
-
- len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3;
- cmd = os_malloc(len);
- if (cmd == NULL)
- return -1;
- res = os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2);
- if (res < 0 || (size_t) res >= len) {
- os_free(cmd);
- return -1;
- }
- cmd[len - 1] = '\0';
-#ifndef _WIN32_WCE
- if (system(cmd) < 0)
- ret = -1;
-#endif /* _WIN32_WCE */
- os_free(cmd);
-
- return ret;
-}
-
-
-static void hostapd_cli_action_process(char *msg, size_t len)
-{
- const char *pos;
-
- pos = msg;
- if (*pos == '<') {
- pos = os_strchr(pos, '>');
- if (pos)
- pos++;
- else
- pos = msg;
- }
-
- hostapd_cli_exec(action_file, ctrl_ifname, pos);
-}
-
-
-static int hostapd_cli_cmd_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
-{
- char buf[64];
- if (argc != 1) {
- printf("Invalid 'sta' command - exactly one argument, STA "
- "address, is required.\n");
- return -1;
- }
- snprintf(buf, sizeof(buf), "STA %s", argv[0]);
- return wpa_ctrl_command(ctrl, buf);
-}
-
-
-static int hostapd_cli_cmd_new_sta(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- char buf[64];
- if (argc != 1) {
- printf("Invalid 'new_sta' command - exactly one argument, STA "
- "address, is required.\n");
- return -1;
- }
- snprintf(buf, sizeof(buf), "NEW_STA %s", argv[0]);
- return wpa_ctrl_command(ctrl, buf);
-}
-
-
-static int hostapd_cli_cmd_deauthenticate(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- char buf[64];
- if (argc < 1) {
- printf("Invalid 'deauthenticate' command - exactly one "
- "argument, STA address, is required.\n");
- return -1;
- }
- if (argc > 1)
- os_snprintf(buf, sizeof(buf), "DEAUTHENTICATE %s %s",
- argv[0], argv[1]);
- else
- os_snprintf(buf, sizeof(buf), "DEAUTHENTICATE %s", argv[0]);
- return wpa_ctrl_command(ctrl, buf);
-}
-
-
-static int hostapd_cli_cmd_disassociate(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- char buf[64];
- if (argc < 1) {
- printf("Invalid 'disassociate' command - exactly one "
- "argument, STA address, is required.\n");
- return -1;
- }
- if (argc > 1)
- os_snprintf(buf, sizeof(buf), "DISASSOCIATE %s %s",
- argv[0], argv[1]);
- else
- os_snprintf(buf, sizeof(buf), "DISASSOCIATE %s", argv[0]);
- return wpa_ctrl_command(ctrl, buf);
-}
-
-
-#ifdef CONFIG_IEEE80211W
-static int hostapd_cli_cmd_sa_query(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- char buf[64];
- if (argc != 1) {
- printf("Invalid 'sa_query' command - exactly one argument, "
- "STA address, is required.\n");
- return -1;
- }
- snprintf(buf, sizeof(buf), "SA_QUERY %s", argv[0]);
- return wpa_ctrl_command(ctrl, buf);
-}
-#endif /* CONFIG_IEEE80211W */
-
-
-#ifdef CONFIG_WPS
-static int hostapd_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- char buf[256];
- if (argc < 2) {
- printf("Invalid 'wps_pin' command - at least two arguments, "
- "UUID and PIN, are required.\n");
- return -1;
- }
- if (argc > 3)
- snprintf(buf, sizeof(buf), "WPS_PIN %s %s %s %s",
- argv[0], argv[1], argv[2], argv[3]);
- else if (argc > 2)
- snprintf(buf, sizeof(buf), "WPS_PIN %s %s %s",
- argv[0], argv[1], argv[2]);
- else
- snprintf(buf, sizeof(buf), "WPS_PIN %s %s", argv[0], argv[1]);
- return wpa_ctrl_command(ctrl, buf);
-}
-
-
-static int hostapd_cli_cmd_wps_check_pin(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- char cmd[256];
- int res;
-
- if (argc != 1 && argc != 2) {
- printf("Invalid WPS_CHECK_PIN command: needs one argument:\n"
- "- PIN to be verified\n");
- return -1;
- }
-
- if (argc == 2)
- res = os_snprintf(cmd, sizeof(cmd), "WPS_CHECK_PIN %s %s",
- argv[0], argv[1]);
- else
- res = os_snprintf(cmd, sizeof(cmd), "WPS_CHECK_PIN %s",
- argv[0]);
- if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
- printf("Too long WPS_CHECK_PIN command.\n");
- return -1;
- }
- return wpa_ctrl_command(ctrl, cmd);
-}
-
-
-static int hostapd_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- return wpa_ctrl_command(ctrl, "WPS_PBC");
-}
-
-
-#ifdef CONFIG_WPS_OOB
-static int hostapd_cli_cmd_wps_oob(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- char cmd[256];
- int res;
-
- if (argc != 3 && argc != 4) {
- printf("Invalid WPS_OOB command: need three or four "
- "arguments:\n"
- "- DEV_TYPE: use 'ufd' or 'nfc'\n"
- "- PATH: path of OOB device like '/mnt'\n"
- "- METHOD: OOB method 'pin-e' or 'pin-r', "
- "'cred'\n"
- "- DEV_NAME: (only for NFC) device name like "
- "'pn531'\n");
- return -1;
- }
-
- if (argc == 3)
- res = os_snprintf(cmd, sizeof(cmd), "WPS_OOB %s %s %s",
- argv[0], argv[1], argv[2]);
- else
- res = os_snprintf(cmd, sizeof(cmd), "WPS_OOB %s %s %s %s",
- argv[0], argv[1], argv[2], argv[3]);
- if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
- printf("Too long WPS_OOB command.\n");
- return -1;
- }
- return wpa_ctrl_command(ctrl, cmd);
-}
-#endif /* CONFIG_WPS_OOB */
-
-
-static int hostapd_cli_cmd_wps_ap_pin(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- char buf[64];
- if (argc < 1) {
- printf("Invalid 'wps_ap_pin' command - at least one argument "
- "is required.\n");
- return -1;
- }
- if (argc > 2)
- snprintf(buf, sizeof(buf), "WPS_AP_PIN %s %s %s",
- argv[0], argv[1], argv[2]);
- else if (argc > 1)
- snprintf(buf, sizeof(buf), "WPS_AP_PIN %s %s",
- argv[0], argv[1]);
- else
- snprintf(buf, sizeof(buf), "WPS_AP_PIN %s", argv[0]);
- return wpa_ctrl_command(ctrl, buf);
-}
-
-
-static int hostapd_cli_cmd_wps_config(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- char buf[256];
- char ssid_hex[2 * 32 + 1];
- char key_hex[2 * 64 + 1];
- int i;
-
- if (argc < 1) {
- printf("Invalid 'wps_config' command - at least two arguments "
- "are required.\n");
- return -1;
- }
-
- ssid_hex[0] = '\0';
- for (i = 0; i < 32; i++) {
- if (argv[0][i] == '\0')
- break;
- os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[0][i]);
- }
-
- key_hex[0] = '\0';
- if (argc > 3) {
- for (i = 0; i < 64; i++) {
- if (argv[3][i] == '\0')
- break;
- os_snprintf(&key_hex[i * 2], 3, "%02x",
- argv[3][i]);
- }
- }
-
- if (argc > 3)
- snprintf(buf, sizeof(buf), "WPS_CONFIG %s %s %s %s",
- ssid_hex, argv[1], argv[2], key_hex);
- else if (argc > 2)
- snprintf(buf, sizeof(buf), "WPS_CONFIG %s %s %s",
- ssid_hex, argv[1], argv[2]);
- else
- snprintf(buf, sizeof(buf), "WPS_CONFIG %s %s",
- ssid_hex, argv[1]);
- return wpa_ctrl_command(ctrl, buf);
-}
-#endif /* CONFIG_WPS */
-
-
-static int hostapd_cli_cmd_get_config(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- return wpa_ctrl_command(ctrl, "GET_CONFIG");
-}
-
-
-static int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd,
- char *addr, size_t addr_len)
-{
- char buf[4096], *pos;
- size_t len;
- int ret;
-
- if (ctrl_conn == NULL) {
- printf("Not connected to hostapd - command dropped.\n");
- return -1;
- }
- len = sizeof(buf) - 1;
- ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len,
- hostapd_cli_msg_cb);
- if (ret == -2) {
- printf("'%s' command timed out.\n", cmd);
- return -2;
- } else if (ret < 0) {
- printf("'%s' command failed.\n", cmd);
- return -1;
- }
-
- buf[len] = '\0';
- if (memcmp(buf, "FAIL", 4) == 0)
- return -1;
- printf("%s", buf);
-
- pos = buf;
- while (*pos != '\0' && *pos != '\n')
- pos++;
- *pos = '\0';
- os_strlcpy(addr, buf, addr_len);
- return 0;
-}
-
-
-static int hostapd_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- char addr[32], cmd[64];
-
- if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr)))
- return 0;
- do {
- snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
- } while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr)) == 0);
-
- return -1;
-}
-
-
-static int hostapd_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[])
-{
- printf("%s", commands_help);
- return 0;
-}
-
-
-static int hostapd_cli_cmd_license(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- printf("%s\n\n%s\n", hostapd_cli_version, hostapd_cli_full_license);
- return 0;
-}
-
-
-static int hostapd_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[])
-{
- hostapd_cli_quit = 1;
- return 0;
-}
-
-
-static int hostapd_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
-{
- char cmd[256];
- if (argc != 1) {
- printf("Invalid LEVEL command: needs one argument (debug "
- "level)\n");
- return 0;
- }
- snprintf(cmd, sizeof(cmd), "LEVEL %s", argv[0]);
- return wpa_ctrl_command(ctrl, cmd);
-}
-
-
-static void hostapd_cli_list_interfaces(struct wpa_ctrl *ctrl)
-{
- struct dirent *dent;
- DIR *dir;
-
- dir = opendir(ctrl_iface_dir);
- if (dir == NULL) {
- printf("Control interface directory '%s' could not be "
- "openned.\n", ctrl_iface_dir);
- return;
- }
-
- printf("Available interfaces:\n");
- while ((dent = readdir(dir))) {
- if (strcmp(dent->d_name, ".") == 0 ||
- strcmp(dent->d_name, "..") == 0)
- continue;
- printf("%s\n", dent->d_name);
- }
- closedir(dir);
-}
-
-
-static int hostapd_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc,
- char *argv[])
-{
- if (argc < 1) {
- hostapd_cli_list_interfaces(ctrl);
- return 0;
- }
-
- hostapd_cli_close_connection();
- free(ctrl_ifname);
- ctrl_ifname = strdup(argv[0]);
-
- if (hostapd_cli_open_connection(ctrl_ifname)) {
- printf("Connected to interface '%s.\n", ctrl_ifname);
- if (wpa_ctrl_attach(ctrl_conn) == 0) {
- hostapd_cli_attached = 1;
- } else {
- printf("Warning: Failed to attach to "
- "hostapd.\n");
- }
- } else {
- printf("Could not connect to interface '%s' - re-trying\n",
- ctrl_ifname);
- }
- return 0;
-}
-
-
-static int hostapd_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
-{
- char cmd[256];
- int res;
-
- if (argc != 2) {
- printf("Invalid SET command: needs two arguments (variable "
- "name and value)\n");
- return -1;
- }
-
- res = os_snprintf(cmd, sizeof(cmd), "SET %s %s", argv[0], argv[1]);
- if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
- printf("Too long SET command.\n");
- return -1;
- }
- return wpa_ctrl_command(ctrl, cmd);
-}
-
-
-static int hostapd_cli_cmd_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
-{
- char cmd[256];
- int res;
-
- if (argc != 1) {
- printf("Invalid GET command: needs one argument (variable "
- "name)\n");
- return -1;
- }
-
- res = os_snprintf(cmd, sizeof(cmd), "GET %s", argv[0]);
- if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
- printf("Too long GET command.\n");
- return -1;
- }
- return wpa_ctrl_command(ctrl, cmd);
-}
-
-
-struct hostapd_cli_cmd {
- const char *cmd;
- int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
-};
-
-static struct hostapd_cli_cmd hostapd_cli_commands[] = {
- { "ping", hostapd_cli_cmd_ping },
- { "mib", hostapd_cli_cmd_mib },
- { "relog", hostapd_cli_cmd_relog },
- { "sta", hostapd_cli_cmd_sta },
- { "all_sta", hostapd_cli_cmd_all_sta },
- { "new_sta", hostapd_cli_cmd_new_sta },
- { "deauthenticate", hostapd_cli_cmd_deauthenticate },
- { "disassociate", hostapd_cli_cmd_disassociate },
-#ifdef CONFIG_IEEE80211W
- { "sa_query", hostapd_cli_cmd_sa_query },
-#endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_WPS
- { "wps_pin", hostapd_cli_cmd_wps_pin },
- { "wps_check_pin", hostapd_cli_cmd_wps_check_pin },
- { "wps_pbc", hostapd_cli_cmd_wps_pbc },
-#ifdef CONFIG_WPS_OOB
- { "wps_oob", hostapd_cli_cmd_wps_oob },
-#endif /* CONFIG_WPS_OOB */
- { "wps_ap_pin", hostapd_cli_cmd_wps_ap_pin },
- { "wps_config", hostapd_cli_cmd_wps_config },
-#endif /* CONFIG_WPS */
- { "get_config", hostapd_cli_cmd_get_config },
- { "help", hostapd_cli_cmd_help },
- { "interface", hostapd_cli_cmd_interface },
- { "level", hostapd_cli_cmd_level },
- { "license", hostapd_cli_cmd_license },
- { "quit", hostapd_cli_cmd_quit },
- { "set", hostapd_cli_cmd_set },
- { "get", hostapd_cli_cmd_get },
- { NULL, NULL }
-};
-
-
-static void wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
-{
- struct hostapd_cli_cmd *cmd, *match = NULL;
- int count;
-
- count = 0;
- cmd = hostapd_cli_commands;
- while (cmd->cmd) {
- if (strncasecmp(cmd->cmd, argv[0], strlen(argv[0])) == 0) {
- match = cmd;
- if (os_strcasecmp(cmd->cmd, argv[0]) == 0) {
- /* we have an exact match */
- count = 1;
- break;
- }
- count++;
- }
- cmd++;
- }
-
- if (count > 1) {
- printf("Ambiguous command '%s'; possible commands:", argv[0]);
- cmd = hostapd_cli_commands;
- while (cmd->cmd) {
- if (strncasecmp(cmd->cmd, argv[0], strlen(argv[0])) ==
- 0) {
- printf(" %s", cmd->cmd);
- }
- cmd++;
- }
- printf("\n");
- } else if (count == 0) {
- printf("Unknown command '%s'\n", argv[0]);
- } else {
- match->handler(ctrl, argc - 1, &argv[1]);
- }
-}
-
-
-static void hostapd_cli_recv_pending(struct wpa_ctrl *ctrl, int in_read,
- int action_monitor)
-{
- int first = 1;
- if (ctrl_conn == NULL)
- return;
- while (wpa_ctrl_pending(ctrl)) {
- char buf[256];
- size_t len = sizeof(buf) - 1;
- if (wpa_ctrl_recv(ctrl, buf, &len) == 0) {
- buf[len] = '\0';
- if (action_monitor)
- hostapd_cli_action_process(buf, len);
- else {
- if (in_read && first)
- printf("\n");
- first = 0;
- printf("%s\n", buf);
- }
- } else {
- printf("Could not read pending message.\n");
- break;
- }
- }
-}
-
-
-static void hostapd_cli_interactive(void)
-{
- const int max_args = 10;
- char cmd[256], *res, *argv[max_args], *pos;
- int argc;
-
- printf("\nInteractive mode\n\n");
-
- do {
- hostapd_cli_recv_pending(ctrl_conn, 0, 0);
- printf("> ");
- alarm(ping_interval);
- res = fgets(cmd, sizeof(cmd), stdin);
- alarm(0);
- if (res == NULL)
- break;
- pos = cmd;
- while (*pos != '\0') {
- if (*pos == '\n') {
- *pos = '\0';
- break;
- }
- pos++;
- }
- argc = 0;
- pos = cmd;
- for (;;) {
- while (*pos == ' ')
- pos++;
- if (*pos == '\0')
- break;
- argv[argc] = pos;
- argc++;
- if (argc == max_args)
- break;
- while (*pos != '\0' && *pos != ' ')
- pos++;
- if (*pos == ' ')
- *pos++ = '\0';
- }
- if (argc)
- wpa_request(ctrl_conn, argc, argv);
- } while (!hostapd_cli_quit);
-}
-
-
-static void hostapd_cli_cleanup(void)
-{
- hostapd_cli_close_connection();
- if (pid_file)
- os_daemonize_terminate(pid_file);
-
- os_program_deinit();
-}
-
-
-static void hostapd_cli_terminate(int sig)
-{
- hostapd_cli_cleanup();
- exit(0);
-}
-
-
-static void hostapd_cli_alarm(int sig)
-{
- if (ctrl_conn && _wpa_ctrl_command(ctrl_conn, "PING", 0)) {
- printf("Connection to hostapd lost - trying to reconnect\n");
- hostapd_cli_close_connection();
- }
- if (!ctrl_conn) {
- ctrl_conn = hostapd_cli_open_connection(ctrl_ifname);
- if (ctrl_conn) {
- printf("Connection to hostapd re-established\n");
- if (wpa_ctrl_attach(ctrl_conn) == 0) {
- hostapd_cli_attached = 1;
- } else {
- printf("Warning: Failed to attach to "
- "hostapd.\n");
- }
- }
- }
- if (ctrl_conn)
- hostapd_cli_recv_pending(ctrl_conn, 1, 0);
- alarm(ping_interval);
-}
-
-
-static void hostapd_cli_action(struct wpa_ctrl *ctrl)
-{
- fd_set rfds;
- int fd, res;
- struct timeval tv;
- char buf[256];
- size_t len;
-
- fd = wpa_ctrl_get_fd(ctrl);
-
- while (!hostapd_cli_quit) {
- FD_ZERO(&rfds);
- FD_SET(fd, &rfds);
- tv.tv_sec = ping_interval;
- tv.tv_usec = 0;
- res = select(fd + 1, &rfds, NULL, NULL, &tv);
- if (res < 0 && errno != EINTR) {
- perror("select");
- break;
- }
-
- if (FD_ISSET(fd, &rfds))
- hostapd_cli_recv_pending(ctrl, 0, 1);
- else {
- len = sizeof(buf) - 1;
- if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len,
- hostapd_cli_action_process) < 0 ||
- len < 4 || os_memcmp(buf, "PONG", 4) != 0) {
- printf("hostapd did not reply to PING "
- "command - exiting\n");
- break;
- }
- }
- }
-}
-
-
-int main(int argc, char *argv[])
-{
- int interactive;
- int warning_displayed = 0;
- int c;
- int daemonize = 0;
-
- if (os_program_init())
- return -1;
-
- for (;;) {
- c = getopt(argc, argv, "a:BhG:i:p:v");
- if (c < 0)
- break;
- switch (c) {
- case 'a':
- action_file = optarg;
- break;
- case 'B':
- daemonize = 1;
- break;
- case 'G':
- ping_interval = atoi(optarg);
- break;
- case 'h':
- usage();
- return 0;
- case 'v':
- printf("%s\n", hostapd_cli_version);
- return 0;
- case 'i':
- os_free(ctrl_ifname);
- ctrl_ifname = os_strdup(optarg);
- break;
- case 'p':
- ctrl_iface_dir = optarg;
- break;
- default:
- usage();
- return -1;
- }
- }
-
- interactive = (argc == optind) && (action_file == NULL);
-
- if (interactive) {
- printf("%s\n\n%s\n\n", hostapd_cli_version,
- hostapd_cli_license);
- }
-
- for (;;) {
- if (ctrl_ifname == NULL) {
- struct dirent *dent;
- DIR *dir = opendir(ctrl_iface_dir);
- if (dir) {
- while ((dent = readdir(dir))) {
- if (os_strcmp(dent->d_name, ".") == 0
- ||
- os_strcmp(dent->d_name, "..") == 0)
- continue;
- printf("Selected interface '%s'\n",
- dent->d_name);
- ctrl_ifname = os_strdup(dent->d_name);
- break;
- }
- closedir(dir);
- }
- }
- ctrl_conn = hostapd_cli_open_connection(ctrl_ifname);
- if (ctrl_conn) {
- if (warning_displayed)
- printf("Connection established.\n");
- break;
- }
-
- if (!interactive) {
- perror("Failed to connect to hostapd - "
- "wpa_ctrl_open");
- return -1;
- }
-
- if (!warning_displayed) {
- printf("Could not connect to hostapd - re-trying\n");
- warning_displayed = 1;
- }
- os_sleep(1, 0);
- continue;
- }
-
- signal(SIGINT, hostapd_cli_terminate);
- signal(SIGTERM, hostapd_cli_terminate);
- signal(SIGALRM, hostapd_cli_alarm);
-
- if (interactive || action_file) {
- if (wpa_ctrl_attach(ctrl_conn) == 0) {
- hostapd_cli_attached = 1;
- } else {
- printf("Warning: Failed to attach to hostapd.\n");
- if (action_file)
- return -1;
- }
- }
-
- if (daemonize && os_daemonize(pid_file))
- return -1;
-
- if (interactive)
- hostapd_cli_interactive();
- else if (action_file)
- hostapd_cli_action(ctrl_conn);
- else
- wpa_request(ctrl_conn, argc - optind, &argv[optind]);
-
- os_free(ctrl_ifname);
- hostapd_cli_cleanup();
- return 0;
-}
diff --git a/hostapd-0.8/hostapd/logwatch/README b/hostapd-0.8/hostapd/logwatch/README
deleted file mode 100644
index 3cba511..0000000
--- a/hostapd-0.8/hostapd/logwatch/README
+++ /dev/null
@@ -1,9 +0,0 @@
-Logwatch is a utility for analyzing system logs and provide a human
-readable summary. This directory has a configuration file and a log
-analyzer script for parsing hostapd system log entries for logwatch.
-These files can be installed by copying them to following locations:
-
-/etc/log.d/conf/services/hostapd.conf
-/etc/log.d/scripts/services/hostapd
-
-More information about logwatch is available from http://www.logwatch.org/
diff --git a/hostapd-0.8/hostapd/logwatch/hostapd b/hostapd-0.8/hostapd/logwatch/hostapd
deleted file mode 100644
index 97b24ef..0000000
--- a/hostapd-0.8/hostapd/logwatch/hostapd
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/perl -w
-#
-# Logwatch script for hostapd
-#
-# Copyright 2005 Henrik Brix Andersen
-# Distributed under the terms of the GNU General Public License v2
-# Alternatively, this file may be distributed under the terms of the BSD License
-
-use strict;
-
-my $debug = $ENV{'LOGWATCH_DEBUG'} || 0;
-my $detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
-my $debugcounter = 1;
-
-my %hostapd;
-my @unmatched;
-
-if ($debug >= 5) {
- print STDERR "\n\nDEBUG: Inside HOSTAPD Filter\n\n";
-}
-
-while (defined(my $line = )) {
- if ($debug >= 5) {
- print STDERR "DEBUG($debugcounter): $line";
- $debugcounter++;
- }
- chomp($line);
-
- if (my ($iface,$mac,$layer,$details) = ($line =~ /(.*?): STA (.*?) (.*?): (.*?)$/i)) {
- unless ($detail == 10) {
- # collapse association events
- $details =~ s/^(associated) .*$/$1/i;
- }
- $hostapd{$iface}->{$mac}->{$layer}->{$details}++;
- } else {
- push @unmatched, "$line\n";
- }
-}
-
-if (keys %hostapd) {
- foreach my $iface (sort keys %hostapd) {
- print "Interface $iface:\n";
- foreach my $mac (sort keys %{$hostapd{$iface}}) {
- print " Client MAC Address $mac:\n";
- foreach my $layer (sort keys %{$hostapd{$iface}->{$mac}}) {
- print " $layer:\n";
- foreach my $details (sort keys %{$hostapd{$iface}->{$mac}->{$layer}}) {
- print " $details";
- my $count = $hostapd{$iface}->{$mac}->{$layer}->{$details};
- if ($count > 1) {
- print ": " . $count . " Times";
- }
- print "\n";
- }
- }
- }
- }
-}
-
-if ($#unmatched >= 0) {
- print "\n**Unmatched Entries**\n";
- print @unmatched;
-}
-
-exit(0);
diff --git a/hostapd-0.8/hostapd/logwatch/hostapd.conf b/hostapd-0.8/hostapd/logwatch/hostapd.conf
deleted file mode 100644
index 5bebe6a..0000000
--- a/hostapd-0.8/hostapd/logwatch/hostapd.conf
+++ /dev/null
@@ -1,10 +0,0 @@
-# Logwatch configuration for hostapd
-#
-# Copyright 2005 Henrik Brix Andersen
-# Distributed under the terms of the GNU General Public License v2
-# Alternatively, this file may be distributed under the terms of the BSD License
-
-Title = "hostapd"
-LogFile = messages
-*OnlyService = hostapd
-*RemoveHeaders
diff --git a/hostapd-0.8/hostapd/main.c b/hostapd-0.8/hostapd/main.c
deleted file mode 100644
index 7a4cfb0..0000000
--- a/hostapd-0.8/hostapd/main.c
+++ /dev/null
@@ -1,599 +0,0 @@
-/*
- * hostapd / main()
- * Copyright (c) 2002-2011, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-#ifndef CONFIG_NATIVE_WINDOWS
-#include
-#endif /* CONFIG_NATIVE_WINDOWS */
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "crypto/random.h"
-#include "crypto/tls.h"
-#include "common/version.h"
-#include "drivers/driver.h"
-#include "eap_server/eap.h"
-#include "eap_server/tncs.h"
-#include "ap/hostapd.h"
-#include "ap/ap_config.h"
-#include "config_file.h"
-#include "eap_register.h"
-#include "dump_state.h"
-#include "ctrl_iface.h"
-
-
-extern int wpa_debug_level;
-extern int wpa_debug_show_keys;
-extern int wpa_debug_timestamp;
-
-
-struct hapd_interfaces {
- size_t count;
- struct hostapd_iface **iface;
-};
-
-
-static int hostapd_for_each_interface(struct hapd_interfaces *interfaces,
- int (*cb)(struct hostapd_iface *iface,
- void *ctx), void *ctx)
-{
- size_t i;
- int ret;
-
- for (i = 0; i < interfaces->count; i++) {
- ret = cb(interfaces->iface[i], ctx);
- if (ret)
- return ret;
- }
-
- return 0;
-}
-
-
-#ifndef CONFIG_NO_HOSTAPD_LOGGER
-static void hostapd_logger_cb(void *ctx, const u8 *addr, unsigned int module,
- int level, const char *txt, size_t len)
-{
- struct hostapd_data *hapd = ctx;
- char *format, *module_str;
- int maxlen;
- int conf_syslog_level, conf_stdout_level;
- unsigned int conf_syslog, conf_stdout;
-
- maxlen = len + 100;
- format = os_malloc(maxlen);
- if (!format)
- return;
-
- if (hapd && hapd->conf) {
- conf_syslog_level = hapd->conf->logger_syslog_level;
- conf_stdout_level = hapd->conf->logger_stdout_level;
- conf_syslog = hapd->conf->logger_syslog;
- conf_stdout = hapd->conf->logger_stdout;
- } else {
- conf_syslog_level = conf_stdout_level = 0;
- conf_syslog = conf_stdout = (unsigned int) -1;
- }
-
- switch (module) {
- case HOSTAPD_MODULE_IEEE80211:
- module_str = "IEEE 802.11";
- break;
- case HOSTAPD_MODULE_IEEE8021X:
- module_str = "IEEE 802.1X";
- break;
- case HOSTAPD_MODULE_RADIUS:
- module_str = "RADIUS";
- break;
- case HOSTAPD_MODULE_WPA:
- module_str = "WPA";
- break;
- case HOSTAPD_MODULE_DRIVER:
- module_str = "DRIVER";
- break;
- case HOSTAPD_MODULE_IAPP:
- module_str = "IAPP";
- break;
- case HOSTAPD_MODULE_MLME:
- module_str = "MLME";
- break;
- default:
- module_str = NULL;
- break;
- }
-
- if (hapd && hapd->conf && addr)
- os_snprintf(format, maxlen, "%s: STA " MACSTR "%s%s: %s",
- hapd->conf->iface, MAC2STR(addr),
- module_str ? " " : "", module_str, txt);
- else if (hapd && hapd->conf)
- os_snprintf(format, maxlen, "%s:%s%s %s",
- hapd->conf->iface, module_str ? " " : "",
- module_str, txt);
- else if (addr)
- os_snprintf(format, maxlen, "STA " MACSTR "%s%s: %s",
- MAC2STR(addr), module_str ? " " : "",
- module_str, txt);
- else
- os_snprintf(format, maxlen, "%s%s%s",
- module_str, module_str ? ": " : "", txt);
-
- if ((conf_stdout & module) && level >= conf_stdout_level) {
- wpa_debug_print_timestamp();
- printf("%s\n", format);
- }
-
-#ifndef CONFIG_NATIVE_WINDOWS
- if ((conf_syslog & module) && level >= conf_syslog_level) {
- int priority;
- switch (level) {
- case HOSTAPD_LEVEL_DEBUG_VERBOSE:
- case HOSTAPD_LEVEL_DEBUG:
- priority = LOG_DEBUG;
- break;
- case HOSTAPD_LEVEL_INFO:
- priority = LOG_INFO;
- break;
- case HOSTAPD_LEVEL_NOTICE:
- priority = LOG_NOTICE;
- break;
- case HOSTAPD_LEVEL_WARNING:
- priority = LOG_WARNING;
- break;
- default:
- priority = LOG_INFO;
- break;
- }
- syslog(priority, "%s", format);
- }
-#endif /* CONFIG_NATIVE_WINDOWS */
-
- os_free(format);
-}
-#endif /* CONFIG_NO_HOSTAPD_LOGGER */
-
-
-/**
- * hostapd_init - Allocate and initialize per-interface data
- * @config_file: Path to the configuration file
- * Returns: Pointer to the allocated interface data or %NULL on failure
- *
- * This function is used to allocate main data structures for per-interface
- * data. The allocated data buffer will be freed by calling
- * hostapd_cleanup_iface().
- */
-static struct hostapd_iface * hostapd_init(const char *config_file)
-{
- struct hostapd_iface *hapd_iface = NULL;
- struct hostapd_config *conf = NULL;
- struct hostapd_data *hapd;
- size_t i;
-
- hapd_iface = os_zalloc(sizeof(*hapd_iface));
- if (hapd_iface == NULL)
- goto fail;
-
- hapd_iface->reload_config = hostapd_reload_config;
- hapd_iface->config_read_cb = hostapd_config_read;
- hapd_iface->config_fname = os_strdup(config_file);
- if (hapd_iface->config_fname == NULL)
- goto fail;
- hapd_iface->ctrl_iface_init = hostapd_ctrl_iface_init;
- hapd_iface->ctrl_iface_deinit = hostapd_ctrl_iface_deinit;
- hapd_iface->for_each_interface = hostapd_for_each_interface;
-
- conf = hostapd_config_read(hapd_iface->config_fname);
- if (conf == NULL)
- goto fail;
- hapd_iface->conf = conf;
-
- hapd_iface->num_bss = conf->num_bss;
- hapd_iface->bss = os_zalloc(conf->num_bss *
- sizeof(struct hostapd_data *));
- if (hapd_iface->bss == NULL)
- goto fail;
-
- for (i = 0; i < conf->num_bss; i++) {
- hapd = hapd_iface->bss[i] =
- hostapd_alloc_bss_data(hapd_iface, conf,
- &conf->bss[i]);
- if (hapd == NULL)
- goto fail;
- hapd->msg_ctx = hapd;
- }
-
- return hapd_iface;
-
-fail:
- if (conf)
- hostapd_config_free(conf);
- if (hapd_iface) {
- os_free(hapd_iface->config_fname);
- os_free(hapd_iface->bss);
- os_free(hapd_iface);
- }
- return NULL;
-}
-
-
-static int hostapd_driver_init(struct hostapd_iface *iface)
-{
- struct wpa_init_params params;
- size_t i;
- struct hostapd_data *hapd = iface->bss[0];
- struct hostapd_bss_config *conf = hapd->conf;
- u8 *b = conf->bssid;
- struct wpa_driver_capa capa;
-
- if (hapd->driver == NULL || hapd->driver->hapd_init == NULL) {
- wpa_printf(MSG_ERROR, "No hostapd driver wrapper available");
- return -1;
- }
-
- /* Initialize the driver interface */
- if (!(b[0] | b[1] | b[2] | b[3] | b[4] | b[5]))
- b = NULL;
-
- os_memset(¶ms, 0, sizeof(params));
- params.bssid = b;
- params.ifname = hapd->conf->iface;
- params.ssid = (const u8 *) hapd->conf->ssid.ssid;
- params.ssid_len = hapd->conf->ssid.ssid_len;
- params.test_socket = hapd->conf->test_socket;
- params.use_pae_group_addr = hapd->conf->use_pae_group_addr;
-
- params.num_bridge = hapd->iface->num_bss;
- params.bridge = os_zalloc(hapd->iface->num_bss * sizeof(char *));
- if (params.bridge == NULL)
- return -1;
- for (i = 0; i < hapd->iface->num_bss; i++) {
- struct hostapd_data *bss = hapd->iface->bss[i];
- if (bss->conf->bridge[0])
- params.bridge[i] = bss->conf->bridge;
- }
-
- params.own_addr = hapd->own_addr;
-
- hapd->drv_priv = hapd->driver->hapd_init(hapd, ¶ms);
- os_free(params.bridge);
- if (hapd->drv_priv == NULL) {
- wpa_printf(MSG_ERROR, "%s driver initialization failed.",
- hapd->driver->name);
- hapd->driver = NULL;
- return -1;
- }
-
- if (hapd->driver->get_capa &&
- hapd->driver->get_capa(hapd->drv_priv, &capa) == 0)
- iface->drv_flags = capa.flags;
-
- return 0;
-}
-
-
-static void hostapd_interface_deinit_free(struct hostapd_iface *iface)
-{
- const struct wpa_driver_ops *driver;
- void *drv_priv;
- if (iface == NULL)
- return;
- driver = iface->bss[0]->driver;
- drv_priv = iface->bss[0]->drv_priv;
- hostapd_interface_deinit(iface);
- if (driver && driver->hapd_deinit)
- driver->hapd_deinit(drv_priv);
- hostapd_interface_free(iface);
-}
-
-
-static struct hostapd_iface *
-hostapd_interface_init(struct hapd_interfaces *interfaces,
- const char *config_fname, int debug)
-{
- struct hostapd_iface *iface;
- int k;
-
- wpa_printf(MSG_ERROR, "Configuration file: %s", config_fname);
- iface = hostapd_init(config_fname);
- if (!iface)
- return NULL;
- iface->interfaces = interfaces;
-
- for (k = 0; k < debug; k++) {
- if (iface->bss[0]->conf->logger_stdout_level > 0)
- iface->bss[0]->conf->logger_stdout_level--;
- }
-
- if (hostapd_driver_init(iface) ||
- hostapd_setup_interface(iface)) {
- hostapd_interface_deinit_free(iface);
- return NULL;
- }
-
- return iface;
-}
-
-
-/**
- * handle_term - SIGINT and SIGTERM handler to terminate hostapd process
- */
-static void handle_term(int sig, void *signal_ctx)
-{
- wpa_printf(MSG_DEBUG, "Signal %d received - terminating", sig);
- eloop_terminate();
-}
-
-
-#ifndef CONFIG_NATIVE_WINDOWS
-
-static int handle_reload_iface(struct hostapd_iface *iface, void *ctx)
-{
- if (hostapd_reload_config(iface) < 0) {
- wpa_printf(MSG_WARNING, "Failed to read new configuration "
- "file - continuing with old.");
- }
- return 0;
-}
-
-
-/**
- * handle_reload - SIGHUP handler to reload configuration
- */
-static void handle_reload(int sig, void *signal_ctx)
-{
- struct hapd_interfaces *interfaces = signal_ctx;
- wpa_printf(MSG_DEBUG, "Signal %d received - reloading configuration",
- sig);
- hostapd_for_each_interface(interfaces, handle_reload_iface, NULL);
-}
-
-
-static void handle_dump_state(int sig, void *signal_ctx)
-{
-#ifdef HOSTAPD_DUMP_STATE
- struct hapd_interfaces *interfaces = signal_ctx;
- hostapd_for_each_interface(interfaces, handle_dump_state_iface, NULL);
-#endif /* HOSTAPD_DUMP_STATE */
-}
-#endif /* CONFIG_NATIVE_WINDOWS */
-
-
-static int hostapd_global_init(struct hapd_interfaces *interfaces)
-{
- hostapd_logger_register_cb(hostapd_logger_cb);
-
- if (eap_server_register_methods()) {
- wpa_printf(MSG_ERROR, "Failed to register EAP methods");
- return -1;
- }
-
- if (eloop_init()) {
- wpa_printf(MSG_ERROR, "Failed to initialize event loop");
- return -1;
- }
-
- random_init();
-
-#ifndef CONFIG_NATIVE_WINDOWS
- eloop_register_signal(SIGHUP, handle_reload, interfaces);
- eloop_register_signal(SIGUSR1, handle_dump_state, interfaces);
-#endif /* CONFIG_NATIVE_WINDOWS */
- eloop_register_signal_terminate(handle_term, interfaces);
-
-#ifndef CONFIG_NATIVE_WINDOWS
- openlog("hostapd", 0, LOG_DAEMON);
-#endif /* CONFIG_NATIVE_WINDOWS */
-
- return 0;
-}
-
-
-static void hostapd_global_deinit(const char *pid_file)
-{
-#ifdef EAP_SERVER_TNC
- tncs_global_deinit();
-#endif /* EAP_SERVER_TNC */
-
- random_deinit();
-
- eloop_destroy();
-
-#ifndef CONFIG_NATIVE_WINDOWS
- closelog();
-#endif /* CONFIG_NATIVE_WINDOWS */
-
- eap_server_unregister_methods();
-
- os_daemonize_terminate(pid_file);
-}
-
-
-static int hostapd_global_run(struct hapd_interfaces *ifaces, int daemonize,
- const char *pid_file)
-{
-#ifdef EAP_SERVER_TNC
- int tnc = 0;
- size_t i, k;
-
- for (i = 0; !tnc && i < ifaces->count; i++) {
- for (k = 0; k < ifaces->iface[i]->num_bss; k++) {
- if (ifaces->iface[i]->bss[0]->conf->tnc) {
- tnc++;
- break;
- }
- }
- }
-
- if (tnc && tncs_global_init() < 0) {
- wpa_printf(MSG_ERROR, "Failed to initialize TNCS");
- return -1;
- }
-#endif /* EAP_SERVER_TNC */
-
- if (daemonize && os_daemonize(pid_file)) {
- perror("daemon");
- return -1;
- }
-
- eloop_run();
-
- return 0;
-}
-
-
-static void show_version(void)
-{
- fprintf(stderr,
- "hostapd v" VERSION_STR "\n"
- "User space daemon for IEEE 802.11 AP management,\n"
- "IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator\n"
- "Copyright (c) 2002-2011, Jouni Malinen "
- "and contributors\n");
-}
-
-
-static void usage(void)
-{
- show_version();
- fprintf(stderr,
- "\n"
- "usage: hostapd [-hdBKtv] [-P ] "
- "\n"
- "\n"
- "options:\n"
- " -h show this usage\n"
- " -d show more debug messages (-dd for even more)\n"
- " -B run daemon in the background\n"
- " -P PID file\n"
- " -K include key data in debug messages\n"
-#ifdef CONFIG_DEBUG_FILE
- " -f log output to debug file instead of stdout\n"
-#endif /* CONFIG_DEBUG_FILE */
- " -t include timestamps in some debug messages\n"
- " -v show hostapd version\n");
-
- exit(1);
-}
-
-
-static const char * hostapd_msg_ifname_cb(void *ctx)
-{
- struct hostapd_data *hapd = ctx;
- if (hapd && hapd->iconf && hapd->iconf->bss)
- return hapd->iconf->bss->iface;
- return NULL;
-}
-
-
-int main(int argc, char *argv[])
-{
- struct hapd_interfaces interfaces;
- int ret = 1;
- size_t i;
- int c, debug = 0, daemonize = 0;
- char *pid_file = NULL;
- const char *log_file = NULL;
-
- if (os_program_init())
- return -1;
-
- for (;;) {
- c = getopt(argc, argv, "Bdf:hKP:tv");
- if (c < 0)
- break;
- switch (c) {
- case 'h':
- usage();
- break;
- case 'd':
- debug++;
- if (wpa_debug_level > 0)
- wpa_debug_level--;
- break;
- case 'B':
- daemonize++;
- break;
- case 'f':
- log_file = optarg;
- break;
- case 'K':
- wpa_debug_show_keys++;
- break;
- case 'P':
- os_free(pid_file);
- pid_file = os_rel2abs_path(optarg);
- break;
- case 't':
- wpa_debug_timestamp++;
- break;
- case 'v':
- show_version();
- exit(1);
- break;
-
- default:
- usage();
- break;
- }
- }
-
- if (optind == argc)
- usage();
-
- wpa_msg_register_ifname_cb(hostapd_msg_ifname_cb);
-
- if (log_file)
- wpa_debug_open_file(log_file);
-
- interfaces.count = argc - optind;
- interfaces.iface = os_zalloc(interfaces.count *
- sizeof(struct hostapd_iface *));
- if (interfaces.iface == NULL) {
- wpa_printf(MSG_ERROR, "malloc failed");
- return -1;
- }
-
- if (hostapd_global_init(&interfaces))
- return -1;
-
- /* Initialize interfaces */
- for (i = 0; i < interfaces.count; i++) {
- interfaces.iface[i] = hostapd_interface_init(&interfaces,
- argv[optind + i],
- debug);
- if (!interfaces.iface[i])
- goto out;
- }
-
- if (hostapd_global_run(&interfaces, daemonize, pid_file))
- goto out;
-
- ret = 0;
-
- out:
- /* Deinitialize all interfaces */
- for (i = 0; i < interfaces.count; i++)
- hostapd_interface_deinit_free(interfaces.iface[i]);
- os_free(interfaces.iface);
-
- hostapd_global_deinit(pid_file);
- os_free(pid_file);
-
- if (log_file)
- wpa_debug_close_file();
-
- os_program_deinit();
-
- return ret;
-}
diff --git a/hostapd-0.8/hostapd/nt_password_hash.c b/hostapd-0.8/hostapd/nt_password_hash.c
deleted file mode 100644
index 839802a..0000000
--- a/hostapd-0.8/hostapd/nt_password_hash.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * hostapd - Plaintext password to NtPasswordHash
- * Copyright (c) 2005, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "includes.h"
-
-#include "common.h"
-#include "crypto/ms_funcs.h"
-
-
-int main(int argc, char *argv[])
-{
- unsigned char password_hash[16];
- size_t i;
- char *password, buf[64], *pos;
-
- if (argc > 1)
- password = argv[1];
- else {
- if (fgets(buf, sizeof(buf), stdin) == NULL) {
- printf("Failed to read password\n");
- return 1;
- }
- buf[sizeof(buf) - 1] = '\0';
- pos = buf;
- while (*pos != '\0') {
- if (*pos == '\r' || *pos == '\n') {
- *pos = '\0';
- break;
- }
- pos++;
- }
- password = buf;
- }
-
- if (nt_password_hash((u8 *) password, strlen(password), password_hash))
- return -1;
- for (i = 0; i < sizeof(password_hash); i++)
- printf("%02x", password_hash[i]);
- printf("\n");
-
- return 0;
-}
diff --git a/hostapd-0.8/hostapd/wired.conf b/hostapd-0.8/hostapd/wired.conf
deleted file mode 100644
index 956f8c5..0000000
--- a/hostapd-0.8/hostapd/wired.conf
+++ /dev/null
@@ -1,40 +0,0 @@
-##### hostapd configuration file ##############################################
-# Empty lines and lines starting with # are ignored
-
-# Example configuration file for wired authenticator. See hostapd.conf for
-# more details.
-
-interface=eth0
-driver=wired
-logger_stdout=-1
-logger_stdout_level=1
-debug=2
-dump_file=/tmp/hostapd.dump
-
-ieee8021x=1
-eap_reauth_period=3600
-
-use_pae_group_addr=1
-
-
-##### RADIUS configuration ####################################################
-# for IEEE 802.1X with external Authentication Server, IEEE 802.11
-# authentication with external ACL for MAC addresses, and accounting
-
-# The own IP address of the access point (used as NAS-IP-Address)
-own_ip_addr=127.0.0.1
-
-# Optional NAS-Identifier string for RADIUS messages. When used, this should be
-# a unique to the NAS within the scope of the RADIUS server. For example, a
-# fully qualified domain name can be used here.
-nas_identifier=ap.example.com
-
-# RADIUS authentication server
-auth_server_addr=127.0.0.1
-auth_server_port=1812
-auth_server_shared_secret=radius
-
-# RADIUS accounting server
-acct_server_addr=127.0.0.1
-acct_server_port=1813
-acct_server_shared_secret=radius
diff --git a/hostapd-0.8/src/Makefile b/hostapd-0.8/src/Makefile
deleted file mode 100644
index d73a175..0000000
--- a/hostapd-0.8/src/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-SUBDIRS=ap common crypto drivers eapol_auth eapol_supp eap_common eap_peer eap_server l2_packet p2p radius rsn_supp tls utils wps
-
-all:
- for d in $(SUBDIRS); do [ -d $$d ] && $(MAKE) -C $$d; done
-
-clean:
- for d in $(SUBDIRS); do [ -d $$d ] && $(MAKE) -C $$d clean; done
- rm -f *~
-
-install:
- for d in $(SUBDIRS); do [ -d $$d ] && $(MAKE) -C $$d install; done
diff --git a/hostapd-0.8/src/ap/Makefile b/hostapd-0.8/src/ap/Makefile
deleted file mode 100644
index 9c41962..0000000
--- a/hostapd-0.8/src/ap/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-all:
- @echo Nothing to be made.
-
-clean:
- rm -f *~ *.o *.d
-
-install:
- @echo Nothing to be made.
diff --git a/hostapd-0.8/src/ap/accounting.c b/hostapd-0.8/src/ap/accounting.c
deleted file mode 100644
index dbfb058..0000000
--- a/hostapd-0.8/src/ap/accounting.c
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * hostapd / RADIUS Accounting
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "drivers/driver.h"
-#include "radius/radius.h"
-#include "radius/radius_client.h"
-#include "hostapd.h"
-#include "ieee802_1x.h"
-#include "ap_config.h"
-#include "sta_info.h"
-#include "ap_drv_ops.h"
-#include "accounting.h"
-
-
-/* Default interval in seconds for polling TX/RX octets from the driver if
- * STA is not using interim accounting. This detects wrap arounds for
- * input/output octets and updates Acct-{Input,Output}-Gigawords. */
-#define ACCT_DEFAULT_UPDATE_INTERVAL 300
-
-static void accounting_sta_get_id(struct hostapd_data *hapd,
- struct sta_info *sta);
-
-
-static struct radius_msg * accounting_msg(struct hostapd_data *hapd,
- struct sta_info *sta,
- int status_type)
-{
- struct radius_msg *msg;
- char buf[128];
- u8 *val;
- size_t len;
- int i;
-
- msg = radius_msg_new(RADIUS_CODE_ACCOUNTING_REQUEST,
- radius_client_get_id(hapd->radius));
- if (msg == NULL) {
- printf("Could not create net RADIUS packet\n");
- return NULL;
- }
-
- if (sta) {
- radius_msg_make_authenticator(msg, (u8 *) sta, sizeof(*sta));
-
- os_snprintf(buf, sizeof(buf), "%08X-%08X",
- sta->acct_session_id_hi, sta->acct_session_id_lo);
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_ACCT_SESSION_ID,
- (u8 *) buf, os_strlen(buf))) {
- printf("Could not add Acct-Session-Id\n");
- goto fail;
- }
- } else {
- radius_msg_make_authenticator(msg, (u8 *) hapd, sizeof(*hapd));
- }
-
- if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_ACCT_STATUS_TYPE,
- status_type)) {
- printf("Could not add Acct-Status-Type\n");
- goto fail;
- }
-
- if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_ACCT_AUTHENTIC,
- hapd->conf->ieee802_1x ?
- RADIUS_ACCT_AUTHENTIC_RADIUS :
- RADIUS_ACCT_AUTHENTIC_LOCAL)) {
- printf("Could not add Acct-Authentic\n");
- goto fail;
- }
-
- if (sta) {
- val = ieee802_1x_get_identity(sta->eapol_sm, &len);
- if (!val) {
- os_snprintf(buf, sizeof(buf), RADIUS_ADDR_FORMAT,
- MAC2STR(sta->addr));
- val = (u8 *) buf;
- len = os_strlen(buf);
- }
-
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_USER_NAME, val,
- len)) {
- printf("Could not add User-Name\n");
- goto fail;
- }
- }
-
- if (hapd->conf->own_ip_addr.af == AF_INET &&
- !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IP_ADDRESS,
- (u8 *) &hapd->conf->own_ip_addr.u.v4, 4)) {
- printf("Could not add NAS-IP-Address\n");
- goto fail;
- }
-
-#ifdef CONFIG_IPV6
- if (hapd->conf->own_ip_addr.af == AF_INET6 &&
- !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IPV6_ADDRESS,
- (u8 *) &hapd->conf->own_ip_addr.u.v6, 16)) {
- printf("Could not add NAS-IPv6-Address\n");
- goto fail;
- }
-#endif /* CONFIG_IPV6 */
-
- if (hapd->conf->nas_identifier &&
- !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IDENTIFIER,
- (u8 *) hapd->conf->nas_identifier,
- os_strlen(hapd->conf->nas_identifier))) {
- printf("Could not add NAS-Identifier\n");
- goto fail;
- }
-
- if (sta &&
- !radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT, sta->aid)) {
- printf("Could not add NAS-Port\n");
- goto fail;
- }
-
- os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT ":%s",
- MAC2STR(hapd->own_addr), hapd->conf->ssid.ssid);
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_CALLED_STATION_ID,
- (u8 *) buf, os_strlen(buf))) {
- printf("Could not add Called-Station-Id\n");
- goto fail;
- }
-
- if (sta) {
- os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT,
- MAC2STR(sta->addr));
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_CALLING_STATION_ID,
- (u8 *) buf, os_strlen(buf))) {
- printf("Could not add Calling-Station-Id\n");
- goto fail;
- }
-
- if (!radius_msg_add_attr_int32(
- msg, RADIUS_ATTR_NAS_PORT_TYPE,
- RADIUS_NAS_PORT_TYPE_IEEE_802_11)) {
- printf("Could not add NAS-Port-Type\n");
- goto fail;
- }
-
- os_snprintf(buf, sizeof(buf), "CONNECT %d%sMbps %s",
- radius_sta_rate(hapd, sta) / 2,
- (radius_sta_rate(hapd, sta) & 1) ? ".5" : "",
- radius_mode_txt(hapd));
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_CONNECT_INFO,
- (u8 *) buf, os_strlen(buf))) {
- printf("Could not add Connect-Info\n");
- goto fail;
- }
-
- for (i = 0; ; i++) {
- val = ieee802_1x_get_radius_class(sta->eapol_sm, &len,
- i);
- if (val == NULL)
- break;
-
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_CLASS,
- val, len)) {
- printf("Could not add Class\n");
- goto fail;
- }
- }
- }
-
- return msg;
-
- fail:
- radius_msg_free(msg);
- return NULL;
-}
-
-
-static int accounting_sta_update_stats(struct hostapd_data *hapd,
- struct sta_info *sta,
- struct hostap_sta_driver_data *data)
-{
- if (hostapd_drv_read_sta_data(hapd, data, sta->addr))
- return -1;
-
- if (sta->last_rx_bytes > data->rx_bytes)
- sta->acct_input_gigawords++;
- if (sta->last_tx_bytes > data->tx_bytes)
- sta->acct_output_gigawords++;
- sta->last_rx_bytes = data->rx_bytes;
- sta->last_tx_bytes = data->tx_bytes;
-
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_RADIUS,
- HOSTAPD_LEVEL_DEBUG, "updated TX/RX stats: "
- "Acct-Input-Octets=%lu Acct-Input-Gigawords=%u "
- "Acct-Output-Octets=%lu Acct-Output-Gigawords=%u",
- sta->last_rx_bytes, sta->acct_input_gigawords,
- sta->last_tx_bytes, sta->acct_output_gigawords);
-
- return 0;
-}
-
-
-static void accounting_interim_update(void *eloop_ctx, void *timeout_ctx)
-{
- struct hostapd_data *hapd = eloop_ctx;
- struct sta_info *sta = timeout_ctx;
- int interval;
-
- if (sta->acct_interim_interval) {
- accounting_sta_interim(hapd, sta);
- interval = sta->acct_interim_interval;
- } else {
- struct hostap_sta_driver_data data;
- accounting_sta_update_stats(hapd, sta, &data);
- interval = ACCT_DEFAULT_UPDATE_INTERVAL;
- }
-
- eloop_register_timeout(interval, 0, accounting_interim_update,
- hapd, sta);
-}
-
-
-/**
- * accounting_sta_start - Start STA accounting
- * @hapd: hostapd BSS data
- * @sta: The station
- */
-void accounting_sta_start(struct hostapd_data *hapd, struct sta_info *sta)
-{
- struct radius_msg *msg;
- int interval;
-
- if (sta->acct_session_started)
- return;
-
- accounting_sta_get_id(hapd, sta);
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_RADIUS,
- HOSTAPD_LEVEL_INFO,
- "starting accounting session %08X-%08X",
- sta->acct_session_id_hi, sta->acct_session_id_lo);
-
- time(&sta->acct_session_start);
- sta->last_rx_bytes = sta->last_tx_bytes = 0;
- sta->acct_input_gigawords = sta->acct_output_gigawords = 0;
- hostapd_drv_sta_clear_stats(hapd, sta->addr);
-
- if (!hapd->conf->radius->acct_server)
- return;
-
- if (sta->acct_interim_interval)
- interval = sta->acct_interim_interval;
- else
- interval = ACCT_DEFAULT_UPDATE_INTERVAL;
- eloop_register_timeout(interval, 0, accounting_interim_update,
- hapd, sta);
-
- msg = accounting_msg(hapd, sta, RADIUS_ACCT_STATUS_TYPE_START);
- if (msg)
- radius_client_send(hapd->radius, msg, RADIUS_ACCT, sta->addr);
-
- sta->acct_session_started = 1;
-}
-
-
-static void accounting_sta_report(struct hostapd_data *hapd,
- struct sta_info *sta, int stop)
-{
- struct radius_msg *msg;
- int cause = sta->acct_terminate_cause;
- struct hostap_sta_driver_data data;
- struct os_time now;
- u32 gigawords;
-
- if (!hapd->conf->radius->acct_server)
- return;
-
- msg = accounting_msg(hapd, sta,
- stop ? RADIUS_ACCT_STATUS_TYPE_STOP :
- RADIUS_ACCT_STATUS_TYPE_INTERIM_UPDATE);
- if (!msg) {
- printf("Could not create RADIUS Accounting message\n");
- return;
- }
-
- os_get_time(&now);
- if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_ACCT_SESSION_TIME,
- now.sec - sta->acct_session_start)) {
- printf("Could not add Acct-Session-Time\n");
- goto fail;
- }
-
- if (accounting_sta_update_stats(hapd, sta, &data) == 0) {
- if (!radius_msg_add_attr_int32(msg,
- RADIUS_ATTR_ACCT_INPUT_PACKETS,
- data.rx_packets)) {
- printf("Could not add Acct-Input-Packets\n");
- goto fail;
- }
- if (!radius_msg_add_attr_int32(msg,
- RADIUS_ATTR_ACCT_OUTPUT_PACKETS,
- data.tx_packets)) {
- printf("Could not add Acct-Output-Packets\n");
- goto fail;
- }
- if (!radius_msg_add_attr_int32(msg,
- RADIUS_ATTR_ACCT_INPUT_OCTETS,
- data.rx_bytes)) {
- printf("Could not add Acct-Input-Octets\n");
- goto fail;
- }
- gigawords = sta->acct_input_gigawords;
-#if __WORDSIZE == 64
- gigawords += data.rx_bytes >> 32;
-#endif
- if (gigawords &&
- !radius_msg_add_attr_int32(
- msg, RADIUS_ATTR_ACCT_INPUT_GIGAWORDS,
- gigawords)) {
- printf("Could not add Acct-Input-Gigawords\n");
- goto fail;
- }
- if (!radius_msg_add_attr_int32(msg,
- RADIUS_ATTR_ACCT_OUTPUT_OCTETS,
- data.tx_bytes)) {
- printf("Could not add Acct-Output-Octets\n");
- goto fail;
- }
- gigawords = sta->acct_output_gigawords;
-#if __WORDSIZE == 64
- gigawords += data.tx_bytes >> 32;
-#endif
- if (gigawords &&
- !radius_msg_add_attr_int32(
- msg, RADIUS_ATTR_ACCT_OUTPUT_GIGAWORDS,
- gigawords)) {
- printf("Could not add Acct-Output-Gigawords\n");
- goto fail;
- }
- }
-
- if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_EVENT_TIMESTAMP,
- now.sec)) {
- printf("Could not add Event-Timestamp\n");
- goto fail;
- }
-
- if (eloop_terminated())
- cause = RADIUS_ACCT_TERMINATE_CAUSE_ADMIN_REBOOT;
-
- if (stop && cause &&
- !radius_msg_add_attr_int32(msg, RADIUS_ATTR_ACCT_TERMINATE_CAUSE,
- cause)) {
- printf("Could not add Acct-Terminate-Cause\n");
- goto fail;
- }
-
- radius_client_send(hapd->radius, msg,
- stop ? RADIUS_ACCT : RADIUS_ACCT_INTERIM,
- sta->addr);
- return;
-
- fail:
- radius_msg_free(msg);
-}
-
-
-/**
- * accounting_sta_interim - Send a interim STA accounting report
- * @hapd: hostapd BSS data
- * @sta: The station
- */
-void accounting_sta_interim(struct hostapd_data *hapd, struct sta_info *sta)
-{
- if (sta->acct_session_started)
- accounting_sta_report(hapd, sta, 0);
-}
-
-
-/**
- * accounting_sta_stop - Stop STA accounting
- * @hapd: hostapd BSS data
- * @sta: The station
- */
-void accounting_sta_stop(struct hostapd_data *hapd, struct sta_info *sta)
-{
- if (sta->acct_session_started) {
- accounting_sta_report(hapd, sta, 1);
- eloop_cancel_timeout(accounting_interim_update, hapd, sta);
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_RADIUS,
- HOSTAPD_LEVEL_INFO,
- "stopped accounting session %08X-%08X",
- sta->acct_session_id_hi,
- sta->acct_session_id_lo);
- sta->acct_session_started = 0;
- }
-}
-
-
-static void accounting_sta_get_id(struct hostapd_data *hapd,
- struct sta_info *sta)
-{
- sta->acct_session_id_lo = hapd->acct_session_id_lo++;
- if (hapd->acct_session_id_lo == 0) {
- hapd->acct_session_id_hi++;
- }
- sta->acct_session_id_hi = hapd->acct_session_id_hi;
-}
-
-
-/**
- * accounting_receive - Process the RADIUS frames from Accounting Server
- * @msg: RADIUS response message
- * @req: RADIUS request message
- * @shared_secret: RADIUS shared secret
- * @shared_secret_len: Length of shared_secret in octets
- * @data: Context data (struct hostapd_data *)
- * Returns: Processing status
- */
-static RadiusRxResult
-accounting_receive(struct radius_msg *msg, struct radius_msg *req,
- const u8 *shared_secret, size_t shared_secret_len,
- void *data)
-{
- if (radius_msg_get_hdr(msg)->code != RADIUS_CODE_ACCOUNTING_RESPONSE) {
- printf("Unknown RADIUS message code\n");
- return RADIUS_RX_UNKNOWN;
- }
-
- if (radius_msg_verify(msg, shared_secret, shared_secret_len, req, 0)) {
- printf("Incoming RADIUS packet did not have correct "
- "Authenticator - dropped\n");
- return RADIUS_RX_INVALID_AUTHENTICATOR;
- }
-
- return RADIUS_RX_PROCESSED;
-}
-
-
-static void accounting_report_state(struct hostapd_data *hapd, int on)
-{
- struct radius_msg *msg;
-
- if (!hapd->conf->radius->acct_server || hapd->radius == NULL)
- return;
-
- /* Inform RADIUS server that accounting will start/stop so that the
- * server can close old accounting sessions. */
- msg = accounting_msg(hapd, NULL,
- on ? RADIUS_ACCT_STATUS_TYPE_ACCOUNTING_ON :
- RADIUS_ACCT_STATUS_TYPE_ACCOUNTING_OFF);
- if (!msg)
- return;
-
- if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_ACCT_TERMINATE_CAUSE,
- RADIUS_ACCT_TERMINATE_CAUSE_NAS_REBOOT))
- {
- printf("Could not add Acct-Terminate-Cause\n");
- radius_msg_free(msg);
- return;
- }
-
- radius_client_send(hapd->radius, msg, RADIUS_ACCT, NULL);
-}
-
-
-/**
- * accounting_init: Initialize accounting
- * @hapd: hostapd BSS data
- * Returns: 0 on success, -1 on failure
- */
-int accounting_init(struct hostapd_data *hapd)
-{
- struct os_time now;
-
- /* Acct-Session-Id should be unique over reboots. If reliable clock is
- * not available, this could be replaced with reboot counter, etc. */
- os_get_time(&now);
- hapd->acct_session_id_hi = now.sec;
-
- if (radius_client_register(hapd->radius, RADIUS_ACCT,
- accounting_receive, hapd))
- return -1;
-
- accounting_report_state(hapd, 1);
-
- return 0;
-}
-
-
-/**
- * accounting_deinit: Deinitilize accounting
- * @hapd: hostapd BSS data
- */
-void accounting_deinit(struct hostapd_data *hapd)
-{
- accounting_report_state(hapd, 0);
-}
diff --git a/hostapd-0.8/src/ap/accounting.h b/hostapd-0.8/src/ap/accounting.h
deleted file mode 100644
index f3d60f0..0000000
--- a/hostapd-0.8/src/ap/accounting.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * hostapd / RADIUS Accounting
- * Copyright (c) 2002-2005, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef ACCOUNTING_H
-#define ACCOUNTING_H
-
-void accounting_sta_interim(struct hostapd_data *hapd, struct sta_info *sta);
-#ifdef CONFIG_NO_ACCOUNTING
-static inline void accounting_sta_start(struct hostapd_data *hapd,
- struct sta_info *sta)
-{
-}
-
-static inline void accounting_sta_stop(struct hostapd_data *hapd,
- struct sta_info *sta)
-{
-}
-
-static inline int accounting_init(struct hostapd_data *hapd)
-{
- return 0;
-}
-
-static inline void accounting_deinit(struct hostapd_data *hapd)
-{
-}
-#else /* CONFIG_NO_ACCOUNTING */
-void accounting_sta_start(struct hostapd_data *hapd, struct sta_info *sta);
-void accounting_sta_stop(struct hostapd_data *hapd, struct sta_info *sta);
-int accounting_init(struct hostapd_data *hapd);
-void accounting_deinit(struct hostapd_data *hapd);
-#endif /* CONFIG_NO_ACCOUNTING */
-
-#endif /* ACCOUNTING_H */
diff --git a/hostapd-0.8/src/ap/ap_config.c b/hostapd-0.8/src/ap/ap_config.c
deleted file mode 100644
index e77716b..0000000
--- a/hostapd-0.8/src/ap/ap_config.c
+++ /dev/null
@@ -1,627 +0,0 @@
-/*
- * hostapd / Configuration helper functions
- * Copyright (c) 2003-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "crypto/sha1.h"
-#include "radius/radius_client.h"
-#include "common/ieee802_11_defs.h"
-#include "common/eapol_common.h"
-#include "eap_common/eap_wsc_common.h"
-#include "eap_server/eap.h"
-#include "wpa_auth.h"
-#include "sta_info.h"
-#include "ap_config.h"
-
-
-static void hostapd_config_free_vlan(struct hostapd_bss_config *bss)
-{
- struct hostapd_vlan *vlan, *prev;
-
- vlan = bss->vlan;
- prev = NULL;
- while (vlan) {
- prev = vlan;
- vlan = vlan->next;
- os_free(prev);
- }
-
- bss->vlan = NULL;
-}
-
-
-void hostapd_config_defaults_bss(struct hostapd_bss_config *bss)
-{
- bss->logger_syslog_level = HOSTAPD_LEVEL_INFO;
- bss->logger_stdout_level = HOSTAPD_LEVEL_INFO;
- bss->logger_syslog = (unsigned int) -1;
- bss->logger_stdout = (unsigned int) -1;
-
- bss->auth_algs = WPA_AUTH_ALG_OPEN | WPA_AUTH_ALG_SHARED;
-
- bss->wep_rekeying_period = 300;
- /* use key0 in individual key and key1 in broadcast key */
- bss->broadcast_key_idx_min = 1;
- bss->broadcast_key_idx_max = 2;
- bss->eap_reauth_period = 3600;
-
- bss->wpa_group_rekey = 600;
- bss->wpa_gmk_rekey = 86400;
- bss->wpa_key_mgmt = WPA_KEY_MGMT_PSK;
- bss->wpa_pairwise = WPA_CIPHER_TKIP;
- bss->wpa_group = WPA_CIPHER_TKIP;
- bss->rsn_pairwise = 0;
-
- bss->max_num_sta = MAX_STA_COUNT;
-
- bss->dtim_period = 2;
-
- bss->radius_server_auth_port = 1812;
- bss->ap_max_inactivity = AP_MAX_INACTIVITY;
- bss->eapol_version = EAPOL_VERSION;
-
- bss->max_listen_interval = 65535;
-
- bss->pwd_group = 19; /* ECC: GF(p=256) */
-
-#ifdef CONFIG_IEEE80211W
- bss->assoc_sa_query_max_timeout = 1000;
- bss->assoc_sa_query_retry_timeout = 201;
-#endif /* CONFIG_IEEE80211W */
-#ifdef EAP_SERVER_FAST
- /* both anonymous and authenticated provisioning */
- bss->eap_fast_prov = 3;
- bss->pac_key_lifetime = 7 * 24 * 60 * 60;
- bss->pac_key_refresh_time = 1 * 24 * 60 * 60;
-#endif /* EAP_SERVER_FAST */
-
- /* Set to -1 as defaults depends on HT in setup */
- bss->wmm_enabled = -1;
-
-#ifdef CONFIG_IEEE80211R
- bss->ft_over_ds = 1;
-#endif /* CONFIG_IEEE80211R */
-}
-
-
-struct hostapd_config * hostapd_config_defaults(void)
-{
-#define ecw2cw(ecw) ((1 << (ecw)) - 1)
-
- struct hostapd_config *conf;
- struct hostapd_bss_config *bss;
- const int aCWmin = 4, aCWmax = 10;
- const struct hostapd_wmm_ac_params ac_bk =
- { aCWmin, aCWmax, 7, 0, 0 }; /* background traffic */
- const struct hostapd_wmm_ac_params ac_be =
- { aCWmin, aCWmax, 3, 0, 0 }; /* best effort traffic */
- const struct hostapd_wmm_ac_params ac_vi = /* video traffic */
- { aCWmin - 1, aCWmin, 2, 3000 / 32, 1 };
- const struct hostapd_wmm_ac_params ac_vo = /* voice traffic */
- { aCWmin - 2, aCWmin - 1, 2, 1500 / 32, 1 };
- const struct hostapd_tx_queue_params txq_bk =
- { 7, ecw2cw(aCWmin), ecw2cw(aCWmax), 0 };
- const struct hostapd_tx_queue_params txq_be =
- { 3, ecw2cw(aCWmin), 4 * (ecw2cw(aCWmin) + 1) - 1, 0};
- const struct hostapd_tx_queue_params txq_vi =
- { 1, (ecw2cw(aCWmin) + 1) / 2 - 1, ecw2cw(aCWmin), 30};
- const struct hostapd_tx_queue_params txq_vo =
- { 1, (ecw2cw(aCWmin) + 1) / 4 - 1,
- (ecw2cw(aCWmin) + 1) / 2 - 1, 15};
-
-#undef ecw2cw
-
- conf = os_zalloc(sizeof(*conf));
- bss = os_zalloc(sizeof(*bss));
- if (conf == NULL || bss == NULL) {
- wpa_printf(MSG_ERROR, "Failed to allocate memory for "
- "configuration data.");
- os_free(conf);
- os_free(bss);
- return NULL;
- }
-
- bss->radius = os_zalloc(sizeof(*bss->radius));
- if (bss->radius == NULL) {
- os_free(conf);
- os_free(bss);
- return NULL;
- }
-
- hostapd_config_defaults_bss(bss);
-
- conf->num_bss = 1;
- conf->bss = bss;
-
- conf->beacon_int = 100;
- conf->rts_threshold = -1; /* use driver default: 2347 */
- conf->fragm_threshold = -1; /* user driver default: 2346 */
- conf->send_probe_response = 1;
-
- conf->wmm_ac_params[0] = ac_be;
- conf->wmm_ac_params[1] = ac_bk;
- conf->wmm_ac_params[2] = ac_vi;
- conf->wmm_ac_params[3] = ac_vo;
-
- conf->tx_queue[0] = txq_vo;
- conf->tx_queue[1] = txq_vi;
- conf->tx_queue[2] = txq_be;
- conf->tx_queue[3] = txq_bk;
-
- conf->ht_capab = HT_CAP_INFO_SMPS_DISABLED;
-
- return conf;
-}
-
-
-int hostapd_mac_comp(const void *a, const void *b)
-{
- return os_memcmp(a, b, sizeof(macaddr));
-}
-
-
-int hostapd_mac_comp_empty(const void *a)
-{
- macaddr empty = { 0 };
- return os_memcmp(a, empty, sizeof(macaddr));
-}
-
-
-static int hostapd_config_read_wpa_psk(const char *fname,
- struct hostapd_ssid *ssid)
-{
- FILE *f;
- char buf[128], *pos;
- int line = 0, ret = 0, len, ok;
- u8 addr[ETH_ALEN];
- struct hostapd_wpa_psk *psk;
-
- if (!fname)
- return 0;
-
- f = fopen(fname, "r");
- if (!f) {
- wpa_printf(MSG_ERROR, "WPA PSK file '%s' not found.", fname);
- return -1;
- }
-
- while (fgets(buf, sizeof(buf), f)) {
- line++;
-
- if (buf[0] == '#')
- continue;
- pos = buf;
- while (*pos != '\0') {
- if (*pos == '\n') {
- *pos = '\0';
- break;
- }
- pos++;
- }
- if (buf[0] == '\0')
- continue;
-
- if (hwaddr_aton(buf, addr)) {
- wpa_printf(MSG_ERROR, "Invalid MAC address '%s' on "
- "line %d in '%s'", buf, line, fname);
- ret = -1;
- break;
- }
-
- psk = os_zalloc(sizeof(*psk));
- if (psk == NULL) {
- wpa_printf(MSG_ERROR, "WPA PSK allocation failed");
- ret = -1;
- break;
- }
- if (is_zero_ether_addr(addr))
- psk->group = 1;
- else
- os_memcpy(psk->addr, addr, ETH_ALEN);
-
- pos = buf + 17;
- if (*pos == '\0') {
- wpa_printf(MSG_ERROR, "No PSK on line %d in '%s'",
- line, fname);
- os_free(psk);
- ret = -1;
- break;
- }
- pos++;
-
- ok = 0;
- len = os_strlen(pos);
- if (len == 64 && hexstr2bin(pos, psk->psk, PMK_LEN) == 0)
- ok = 1;
- else if (len >= 8 && len < 64) {
- pbkdf2_sha1(pos, ssid->ssid, ssid->ssid_len,
- 4096, psk->psk, PMK_LEN);
- ok = 1;
- }
- if (!ok) {
- wpa_printf(MSG_ERROR, "Invalid PSK '%s' on line %d in "
- "'%s'", pos, line, fname);
- os_free(psk);
- ret = -1;
- break;
- }
-
- psk->next = ssid->wpa_psk;
- ssid->wpa_psk = psk;
- }
-
- fclose(f);
-
- return ret;
-}
-
-
-static int hostapd_derive_psk(struct hostapd_ssid *ssid)
-{
- ssid->wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk));
- if (ssid->wpa_psk == NULL) {
- wpa_printf(MSG_ERROR, "Unable to alloc space for PSK");
- return -1;
- }
- wpa_hexdump_ascii(MSG_DEBUG, "SSID",
- (u8 *) ssid->ssid, ssid->ssid_len);
- wpa_hexdump_ascii_key(MSG_DEBUG, "PSK (ASCII passphrase)",
- (u8 *) ssid->wpa_passphrase,
- os_strlen(ssid->wpa_passphrase));
- pbkdf2_sha1(ssid->wpa_passphrase,
- ssid->ssid, ssid->ssid_len,
- 4096, ssid->wpa_psk->psk, PMK_LEN);
- wpa_hexdump_key(MSG_DEBUG, "PSK (from passphrase)",
- ssid->wpa_psk->psk, PMK_LEN);
- return 0;
-}
-
-
-int hostapd_setup_wpa_psk(struct hostapd_bss_config *conf)
-{
- struct hostapd_ssid *ssid = &conf->ssid;
-
- if (ssid->wpa_passphrase != NULL) {
- if (ssid->wpa_psk != NULL) {
- wpa_printf(MSG_DEBUG, "Using pre-configured WPA PSK "
- "instead of passphrase");
- } else {
- wpa_printf(MSG_DEBUG, "Deriving WPA PSK based on "
- "passphrase");
- if (hostapd_derive_psk(ssid) < 0)
- return -1;
- }
- ssid->wpa_psk->group = 1;
- }
-
- if (ssid->wpa_psk_file) {
- if (hostapd_config_read_wpa_psk(ssid->wpa_psk_file,
- &conf->ssid))
- return -1;
- }
-
- return 0;
-}
-
-
-int hostapd_wep_key_cmp(struct hostapd_wep_keys *a, struct hostapd_wep_keys *b)
-{
- int i;
-
- if (a->idx != b->idx || a->default_len != b->default_len)
- return 1;
- for (i = 0; i < NUM_WEP_KEYS; i++)
- if (a->len[i] != b->len[i] ||
- os_memcmp(a->key[i], b->key[i], a->len[i]) != 0)
- return 1;
- return 0;
-}
-
-
-static void hostapd_config_free_radius(struct hostapd_radius_server *servers,
- int num_servers)
-{
- int i;
-
- for (i = 0; i < num_servers; i++) {
- os_free(servers[i].shared_secret);
- }
- os_free(servers);
-}
-
-
-static void hostapd_config_free_eap_user(struct hostapd_eap_user *user)
-{
- os_free(user->identity);
- os_free(user->password);
- os_free(user);
-}
-
-
-static void hostapd_config_free_wep(struct hostapd_wep_keys *keys)
-{
- int i;
- for (i = 0; i < NUM_WEP_KEYS; i++) {
- os_free(keys->key[i]);
- keys->key[i] = NULL;
- }
-}
-
-
-static void hostapd_config_free_bss(struct hostapd_bss_config *conf)
-{
- struct hostapd_wpa_psk *psk, *prev;
- struct hostapd_eap_user *user, *prev_user;
-
- if (conf == NULL)
- return;
-
- psk = conf->ssid.wpa_psk;
- while (psk) {
- prev = psk;
- psk = psk->next;
- os_free(prev);
- }
-
- os_free(conf->ssid.wpa_passphrase);
- os_free(conf->ssid.wpa_psk_file);
- hostapd_config_free_wep(&conf->ssid.wep);
-#ifdef CONFIG_FULL_DYNAMIC_VLAN
- os_free(conf->ssid.vlan_tagged_interface);
-#endif /* CONFIG_FULL_DYNAMIC_VLAN */
-
- user = conf->eap_user;
- while (user) {
- prev_user = user;
- user = user->next;
- hostapd_config_free_eap_user(prev_user);
- }
-
- os_free(conf->dump_log_name);
- os_free(conf->eap_req_id_text);
- os_free(conf->accept_mac);
- os_free(conf->deny_mac);
- os_free(conf->nas_identifier);
- hostapd_config_free_radius(conf->radius->auth_servers,
- conf->radius->num_auth_servers);
- hostapd_config_free_radius(conf->radius->acct_servers,
- conf->radius->num_acct_servers);
- os_free(conf->rsn_preauth_interfaces);
- os_free(conf->ctrl_interface);
- os_free(conf->ca_cert);
- os_free(conf->server_cert);
- os_free(conf->private_key);
- os_free(conf->private_key_passwd);
- os_free(conf->dh_file);
- os_free(conf->pac_opaque_encr_key);
- os_free(conf->eap_fast_a_id);
- os_free(conf->eap_fast_a_id_info);
- os_free(conf->eap_sim_db);
- os_free(conf->radius_server_clients);
- os_free(conf->test_socket);
- os_free(conf->radius);
- hostapd_config_free_vlan(conf);
- if (conf->ssid.dyn_vlan_keys) {
- struct hostapd_ssid *ssid = &conf->ssid;
- size_t i;
- for (i = 0; i <= ssid->max_dyn_vlan_keys; i++) {
- if (ssid->dyn_vlan_keys[i] == NULL)
- continue;
- hostapd_config_free_wep(ssid->dyn_vlan_keys[i]);
- os_free(ssid->dyn_vlan_keys[i]);
- }
- os_free(ssid->dyn_vlan_keys);
- ssid->dyn_vlan_keys = NULL;
- }
-
-#ifdef CONFIG_IEEE80211R
- {
- struct ft_remote_r0kh *r0kh, *r0kh_prev;
- struct ft_remote_r1kh *r1kh, *r1kh_prev;
-
- r0kh = conf->r0kh_list;
- conf->r0kh_list = NULL;
- while (r0kh) {
- r0kh_prev = r0kh;
- r0kh = r0kh->next;
- os_free(r0kh_prev);
- }
-
- r1kh = conf->r1kh_list;
- conf->r1kh_list = NULL;
- while (r1kh) {
- r1kh_prev = r1kh;
- r1kh = r1kh->next;
- os_free(r1kh_prev);
- }
- }
-#endif /* CONFIG_IEEE80211R */
-
-#ifdef CONFIG_WPS
- os_free(conf->wps_pin_requests);
- os_free(conf->device_name);
- os_free(conf->manufacturer);
- os_free(conf->model_name);
- os_free(conf->model_number);
- os_free(conf->serial_number);
- os_free(conf->config_methods);
- os_free(conf->ap_pin);
- os_free(conf->extra_cred);
- os_free(conf->ap_settings);
- os_free(conf->upnp_iface);
- os_free(conf->friendly_name);
- os_free(conf->manufacturer_url);
- os_free(conf->model_description);
- os_free(conf->model_url);
- os_free(conf->upc);
-#endif /* CONFIG_WPS */
-}
-
-
-/**
- * hostapd_config_free - Free hostapd configuration
- * @conf: Configuration data from hostapd_config_read().
- */
-void hostapd_config_free(struct hostapd_config *conf)
-{
- size_t i;
-
- if (conf == NULL)
- return;
-
- for (i = 0; i < conf->num_bss; i++)
- hostapd_config_free_bss(&conf->bss[i]);
- os_free(conf->bss);
- os_free(conf->supported_rates);
- os_free(conf->basic_rates);
-
- os_free(conf);
-}
-
-
-/**
- * hostapd_maclist_found - Find a MAC address from a list
- * @list: MAC address list
- * @num_entries: Number of addresses in the list
- * @addr: Address to search for
- * @vlan_id: Buffer for returning VLAN ID or %NULL if not needed
- * Returns: 1 if address is in the list or 0 if not.
- *
- * Perform a binary search for given MAC address from a pre-sorted list.
- */
-int hostapd_maclist_found(struct mac_acl_entry *list, int num_entries,
- const u8 *addr, int *vlan_id)
-{
- int start, end, middle, res;
-
- start = 0;
- end = num_entries - 1;
-
- while (start <= end) {
- middle = (start + end) / 2;
- res = os_memcmp(list[middle].addr, addr, ETH_ALEN);
- if (res == 0) {
- if (vlan_id)
- *vlan_id = list[middle].vlan_id;
- return 1;
- }
- if (res < 0)
- start = middle + 1;
- else
- end = middle - 1;
- }
-
- return 0;
-}
-
-
-int hostapd_rate_found(int *list, int rate)
-{
- int i;
-
- if (list == NULL)
- return 0;
-
- for (i = 0; list[i] >= 0; i++)
- if (list[i] == rate)
- return 1;
-
- return 0;
-}
-
-
-const char * hostapd_get_vlan_id_ifname(struct hostapd_vlan *vlan, int vlan_id)
-{
- struct hostapd_vlan *v = vlan;
- while (v) {
- if (v->vlan_id == vlan_id || v->vlan_id == VLAN_ID_WILDCARD)
- return v->ifname;
- v = v->next;
- }
- return NULL;
-}
-
-
-const u8 * hostapd_get_psk(const struct hostapd_bss_config *conf,
- const u8 *addr, const u8 *prev_psk)
-{
- struct hostapd_wpa_psk *psk;
- int next_ok = prev_psk == NULL;
-
- for (psk = conf->ssid.wpa_psk; psk != NULL; psk = psk->next) {
- if (next_ok &&
- (psk->group || os_memcmp(psk->addr, addr, ETH_ALEN) == 0))
- return psk->psk;
-
- if (psk->psk == prev_psk)
- next_ok = 1;
- }
-
- return NULL;
-}
-
-
-const struct hostapd_eap_user *
-hostapd_get_eap_user(const struct hostapd_bss_config *conf, const u8 *identity,
- size_t identity_len, int phase2)
-{
- struct hostapd_eap_user *user = conf->eap_user;
-
-#ifdef CONFIG_WPS
- if (conf->wps_state && identity_len == WSC_ID_ENROLLEE_LEN &&
- os_memcmp(identity, WSC_ID_ENROLLEE, WSC_ID_ENROLLEE_LEN) == 0) {
- static struct hostapd_eap_user wsc_enrollee;
- os_memset(&wsc_enrollee, 0, sizeof(wsc_enrollee));
- wsc_enrollee.methods[0].method = eap_server_get_type(
- "WSC", &wsc_enrollee.methods[0].vendor);
- return &wsc_enrollee;
- }
-
- if (conf->wps_state && identity_len == WSC_ID_REGISTRAR_LEN &&
- os_memcmp(identity, WSC_ID_REGISTRAR, WSC_ID_REGISTRAR_LEN) == 0) {
- static struct hostapd_eap_user wsc_registrar;
- os_memset(&wsc_registrar, 0, sizeof(wsc_registrar));
- wsc_registrar.methods[0].method = eap_server_get_type(
- "WSC", &wsc_registrar.methods[0].vendor);
- wsc_registrar.password = (u8 *) conf->ap_pin;
- wsc_registrar.password_len = conf->ap_pin ?
- os_strlen(conf->ap_pin) : 0;
- return &wsc_registrar;
- }
-#endif /* CONFIG_WPS */
-
- while (user) {
- if (!phase2 && user->identity == NULL) {
- /* Wildcard match */
- break;
- }
-
- if (user->phase2 == !!phase2 && user->wildcard_prefix &&
- identity_len >= user->identity_len &&
- os_memcmp(user->identity, identity, user->identity_len) ==
- 0) {
- /* Wildcard prefix match */
- break;
- }
-
- if (user->phase2 == !!phase2 &&
- user->identity_len == identity_len &&
- os_memcmp(user->identity, identity, identity_len) == 0)
- break;
- user = user->next;
- }
-
- return user;
-}
diff --git a/hostapd-0.8/src/ap/ap_config.h b/hostapd-0.8/src/ap/ap_config.h
deleted file mode 100644
index 25720b8..0000000
--- a/hostapd-0.8/src/ap/ap_config.h
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- * hostapd / Configuration definitions and helpers functions
- * Copyright (c) 2003-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef HOSTAPD_CONFIG_H
-#define HOSTAPD_CONFIG_H
-
-#include "common/defs.h"
-#include "ip_addr.h"
-#include "common/wpa_common.h"
-#include "wps/wps.h"
-
-#define MAX_STA_COUNT 2007
-#define MAX_VLAN_ID 4094
-
-typedef u8 macaddr[ETH_ALEN];
-
-struct mac_acl_entry {
- macaddr addr;
- int vlan_id;
-};
-
-struct hostapd_radius_servers;
-struct ft_remote_r0kh;
-struct ft_remote_r1kh;
-
-#define HOSTAPD_MAX_SSID_LEN 32
-
-#define NUM_WEP_KEYS 4
-struct hostapd_wep_keys {
- u8 idx;
- u8 *key[NUM_WEP_KEYS];
- size_t len[NUM_WEP_KEYS];
- int keys_set;
- size_t default_len; /* key length used for dynamic key generation */
-};
-
-typedef enum hostap_security_policy {
- SECURITY_PLAINTEXT = 0,
- SECURITY_STATIC_WEP = 1,
- SECURITY_IEEE_802_1X = 2,
- SECURITY_WPA_PSK = 3,
- SECURITY_WPA = 4
-} secpolicy;
-
-struct hostapd_ssid {
- char ssid[HOSTAPD_MAX_SSID_LEN + 1];
- size_t ssid_len;
- int ssid_set;
-
- char vlan[IFNAMSIZ + 1];
- secpolicy security_policy;
-
- struct hostapd_wpa_psk *wpa_psk;
- char *wpa_passphrase;
- char *wpa_psk_file;
-
- struct hostapd_wep_keys wep;
-
-#define DYNAMIC_VLAN_DISABLED 0
-#define DYNAMIC_VLAN_OPTIONAL 1
-#define DYNAMIC_VLAN_REQUIRED 2
- int dynamic_vlan;
-#ifdef CONFIG_FULL_DYNAMIC_VLAN
- char *vlan_tagged_interface;
-#endif /* CONFIG_FULL_DYNAMIC_VLAN */
- struct hostapd_wep_keys **dyn_vlan_keys;
- size_t max_dyn_vlan_keys;
-};
-
-
-#define VLAN_ID_WILDCARD -1
-
-struct hostapd_vlan {
- struct hostapd_vlan *next;
- int vlan_id; /* VLAN ID or -1 (VLAN_ID_WILDCARD) for wildcard entry */
- char ifname[IFNAMSIZ + 1];
- int dynamic_vlan;
-#ifdef CONFIG_FULL_DYNAMIC_VLAN
-
-#define DVLAN_CLEAN_BR 0x1
-#define DVLAN_CLEAN_VLAN 0x2
-#define DVLAN_CLEAN_VLAN_PORT 0x4
-#define DVLAN_CLEAN_WLAN_PORT 0x8
- int clean;
-#endif /* CONFIG_FULL_DYNAMIC_VLAN */
-};
-
-#define PMK_LEN 32
-struct hostapd_wpa_psk {
- struct hostapd_wpa_psk *next;
- int group;
- u8 psk[PMK_LEN];
- u8 addr[ETH_ALEN];
-};
-
-#define EAP_USER_MAX_METHODS 8
-struct hostapd_eap_user {
- struct hostapd_eap_user *next;
- u8 *identity;
- size_t identity_len;
- struct {
- int vendor;
- u32 method;
- } methods[EAP_USER_MAX_METHODS];
- u8 *password;
- size_t password_len;
- int phase2;
- int force_version;
- unsigned int wildcard_prefix:1;
- unsigned int password_hash:1; /* whether password is hashed with
- * nt_password_hash() */
- int ttls_auth; /* EAP_TTLS_AUTH_* bitfield */
-};
-
-
-#define NUM_TX_QUEUES 4
-
-struct hostapd_tx_queue_params {
- int aifs;
- int cwmin;
- int cwmax;
- int burst; /* maximum burst time in 0.1 ms, i.e., 10 = 1 ms */
-};
-
-struct hostapd_wmm_ac_params {
- int cwmin;
- int cwmax;
- int aifs;
- int txop_limit; /* in units of 32us */
- int admission_control_mandatory;
-};
-
-
-/**
- * struct hostapd_bss_config - Per-BSS configuration
- */
-struct hostapd_bss_config {
- char iface[IFNAMSIZ + 1];
- char bridge[IFNAMSIZ + 1];
- char wds_bridge[IFNAMSIZ + 1];
-
- enum hostapd_logger_level logger_syslog_level, logger_stdout_level;
-
- unsigned int logger_syslog; /* module bitfield */
- unsigned int logger_stdout; /* module bitfield */
-
- char *dump_log_name; /* file name for state dump (SIGUSR1) */
-
- int max_num_sta; /* maximum number of STAs in station table */
-
- int dtim_period;
-
- int ieee802_1x; /* use IEEE 802.1X */
- int eapol_version;
- int eap_server; /* Use internal EAP server instead of external
- * RADIUS server */
- struct hostapd_eap_user *eap_user;
- char *eap_sim_db;
- struct hostapd_ip_addr own_ip_addr;
- char *nas_identifier;
- struct hostapd_radius_servers *radius;
- int acct_interim_interval;
-
- struct hostapd_ssid ssid;
-
- char *eap_req_id_text; /* optional displayable message sent with
- * EAP Request-Identity */
- size_t eap_req_id_text_len;
- int eapol_key_index_workaround;
-
- size_t default_wep_key_len;
- int individual_wep_key_len;
- int wep_rekeying_period;
- int broadcast_key_idx_min, broadcast_key_idx_max;
- int eap_reauth_period;
-
- int ieee802_11f; /* use IEEE 802.11f (IAPP) */
- char iapp_iface[IFNAMSIZ + 1]; /* interface used with IAPP broadcast
- * frames */
-
- enum {
- ACCEPT_UNLESS_DENIED = 0,
- DENY_UNLESS_ACCEPTED = 1,
- USE_EXTERNAL_RADIUS_AUTH = 2
- } macaddr_acl;
- struct mac_acl_entry *accept_mac;
- int num_accept_mac;
- struct mac_acl_entry *deny_mac;
- int num_deny_mac;
- int wds_sta;
- int isolate;
-
- int auth_algs; /* bitfield of allowed IEEE 802.11 authentication
- * algorithms, WPA_AUTH_ALG_{OPEN,SHARED,LEAP} */
-
- int wpa; /* bitfield of WPA_PROTO_WPA, WPA_PROTO_RSN */
- int wpa_key_mgmt;
-#ifdef CONFIG_IEEE80211W
- enum mfp_options ieee80211w;
- /* dot11AssociationSAQueryMaximumTimeout (in TUs) */
- unsigned int assoc_sa_query_max_timeout;
- /* dot11AssociationSAQueryRetryTimeout (in TUs) */
- int assoc_sa_query_retry_timeout;
-#endif /* CONFIG_IEEE80211W */
- int wpa_pairwise;
- int wpa_group;
- int wpa_group_rekey;
- int wpa_strict_rekey;
- int wpa_gmk_rekey;
- int wpa_ptk_rekey;
- int rsn_pairwise;
- int rsn_preauth;
- char *rsn_preauth_interfaces;
- int peerkey;
-
-#ifdef CONFIG_IEEE80211R
- /* IEEE 802.11r - Fast BSS Transition */
- u8 mobility_domain[MOBILITY_DOMAIN_ID_LEN];
- u8 r1_key_holder[FT_R1KH_ID_LEN];
- u32 r0_key_lifetime;
- u32 reassociation_deadline;
- struct ft_remote_r0kh *r0kh_list;
- struct ft_remote_r1kh *r1kh_list;
- int pmk_r1_push;
- int ft_over_ds;
-#endif /* CONFIG_IEEE80211R */
-
- char *ctrl_interface; /* directory for UNIX domain sockets */
-#ifndef CONFIG_NATIVE_WINDOWS
- gid_t ctrl_interface_gid;
-#endif /* CONFIG_NATIVE_WINDOWS */
- int ctrl_interface_gid_set;
-
- char *ca_cert;
- char *server_cert;
- char *private_key;
- char *private_key_passwd;
- int check_crl;
- char *dh_file;
- u8 *pac_opaque_encr_key;
- u8 *eap_fast_a_id;
- size_t eap_fast_a_id_len;
- char *eap_fast_a_id_info;
- int eap_fast_prov;
- int pac_key_lifetime;
- int pac_key_refresh_time;
- int eap_sim_aka_result_ind;
- int tnc;
- int fragment_size;
- u16 pwd_group;
-
- char *radius_server_clients;
- int radius_server_auth_port;
- int radius_server_ipv6;
-
- char *test_socket; /* UNIX domain socket path for driver_test */
-
- int use_pae_group_addr; /* Whether to send EAPOL frames to PAE group
- * address instead of individual address
- * (for driver_wired.c).
- */
-
- int ap_max_inactivity;
- int ignore_broadcast_ssid;
-
- int wmm_enabled;
- int wmm_uapsd;
-
- struct hostapd_vlan *vlan, *vlan_tail;
-
- macaddr bssid;
-
- /*
- * Maximum listen interval that STAs can use when associating with this
- * BSS. If a STA tries to use larger value, the association will be
- * denied with status code 51.
- */
- u16 max_listen_interval;
-
- int okc; /* Opportunistic Key Caching */
-
- int wps_state;
-#ifdef CONFIG_WPS
- int ap_setup_locked;
- u8 uuid[16];
- char *wps_pin_requests;
- char *device_name;
- char *manufacturer;
- char *model_name;
- char *model_number;
- char *serial_number;
- u8 device_type[WPS_DEV_TYPE_LEN];
- char *config_methods;
- u8 os_version[4];
- char *ap_pin;
- int skip_cred_build;
- u8 *extra_cred;
- size_t extra_cred_len;
- int wps_cred_processing;
- u8 *ap_settings;
- size_t ap_settings_len;
- char *upnp_iface;
- char *friendly_name;
- char *manufacturer_url;
- char *model_description;
- char *model_url;
- char *upc;
- struct wpabuf *wps_vendor_ext[MAX_WPS_VENDOR_EXTENSIONS];
-#endif /* CONFIG_WPS */
-
-#define P2P_ENABLED BIT(0)
-#define P2P_GROUP_OWNER BIT(1)
-#define P2P_GROUP_FORMATION BIT(2)
-#define P2P_MANAGE BIT(3)
-#define P2P_ALLOW_CROSS_CONNECTION BIT(4)
- int p2p;
-
- int disassoc_low_ack;
-
-#define TDLS_PROHIBIT BIT(0)
-#define TDLS_PROHIBIT_CHAN_SWITCH BIT(1)
- int tdls;
- int disable_11n;
-};
-
-
-/**
- * struct hostapd_config - Per-radio interface configuration
- */
-struct hostapd_config {
- struct hostapd_bss_config *bss, *last_bss;
- size_t num_bss;
-
- u16 beacon_int;
- int rts_threshold;
- int fragm_threshold;
- u8 send_probe_response;
- u8 channel;
- enum hostapd_hw_mode hw_mode; /* HOSTAPD_MODE_IEEE80211A, .. */
- enum {
- LONG_PREAMBLE = 0,
- SHORT_PREAMBLE = 1
- } preamble;
- enum {
- CTS_PROTECTION_AUTOMATIC = 0,
- CTS_PROTECTION_FORCE_ENABLED = 1,
- CTS_PROTECTION_FORCE_DISABLED = 2,
- CTS_PROTECTION_AUTOMATIC_NO_OLBC = 3,
- } cts_protection_type;
-
- int *supported_rates;
- int *basic_rates;
-
- const struct wpa_driver_ops *driver;
-
- int ap_table_max_size;
- int ap_table_expiration_time;
-
- char country[3]; /* first two octets: country code as described in
- * ISO/IEC 3166-1. Third octet:
- * ' ' (ascii 32): all environments
- * 'O': Outdoor environemnt only
- * 'I': Indoor environment only
- */
-
- int ieee80211d;
-
- struct hostapd_tx_queue_params tx_queue[NUM_TX_QUEUES];
-
- /*
- * WMM AC parameters, in same order as 802.1D, i.e.
- * 0 = BE (best effort)
- * 1 = BK (background)
- * 2 = VI (video)
- * 3 = VO (voice)
- */
- struct hostapd_wmm_ac_params wmm_ac_params[4];
-
- int ht_op_mode_fixed;
- u16 ht_capab;
- int ieee80211n;
- int secondary_channel;
- int require_ht;
-};
-
-
-int hostapd_mac_comp(const void *a, const void *b);
-int hostapd_mac_comp_empty(const void *a);
-struct hostapd_config * hostapd_config_defaults(void);
-void hostapd_config_defaults_bss(struct hostapd_bss_config *bss);
-void hostapd_config_free(struct hostapd_config *conf);
-int hostapd_maclist_found(struct mac_acl_entry *list, int num_entries,
- const u8 *addr, int *vlan_id);
-int hostapd_rate_found(int *list, int rate);
-int hostapd_wep_key_cmp(struct hostapd_wep_keys *a,
- struct hostapd_wep_keys *b);
-const u8 * hostapd_get_psk(const struct hostapd_bss_config *conf,
- const u8 *addr, const u8 *prev_psk);
-int hostapd_setup_wpa_psk(struct hostapd_bss_config *conf);
-const char * hostapd_get_vlan_id_ifname(struct hostapd_vlan *vlan,
- int vlan_id);
-const struct hostapd_eap_user *
-hostapd_get_eap_user(const struct hostapd_bss_config *conf, const u8 *identity,
- size_t identity_len, int phase2);
-
-#endif /* HOSTAPD_CONFIG_H */
diff --git a/hostapd-0.8/src/ap/ap_drv_ops.c b/hostapd-0.8/src/ap/ap_drv_ops.c
deleted file mode 100644
index 0b6836c..0000000
--- a/hostapd-0.8/src/ap/ap_drv_ops.c
+++ /dev/null
@@ -1,632 +0,0 @@
-/*
- * hostapd - Driver operations
- * Copyright (c) 2009-2010, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "drivers/driver.h"
-#include "common/ieee802_11_defs.h"
-#include "wps/wps.h"
-#include "hostapd.h"
-#include "ieee802_11.h"
-#include "sta_info.h"
-#include "ap_config.h"
-#include "p2p_hostapd.h"
-#include "ap_drv_ops.h"
-
-
-u32 hostapd_sta_flags_to_drv(u32 flags)
-{
- int res = 0;
- if (flags & WLAN_STA_AUTHORIZED)
- res |= WPA_STA_AUTHORIZED;
- if (flags & WLAN_STA_WMM)
- res |= WPA_STA_WMM;
- if (flags & WLAN_STA_SHORT_PREAMBLE)
- res |= WPA_STA_SHORT_PREAMBLE;
- if (flags & WLAN_STA_MFP)
- res |= WPA_STA_MFP;
- return res;
-}
-
-
-int hostapd_set_ap_wps_ie(struct hostapd_data *hapd)
-{
- struct wpabuf *beacon, *proberesp, *assocresp = NULL;
- int ret;
-
- if (hapd->driver == NULL || hapd->driver->set_ap_wps_ie == NULL)
- return 0;
-
- beacon = hapd->wps_beacon_ie;
- proberesp = hapd->wps_probe_resp_ie;
-
-#ifdef CONFIG_P2P
- if (hapd->wps_beacon_ie == NULL && hapd->p2p_beacon_ie == NULL)
- beacon = NULL;
- else {
- beacon = wpabuf_alloc((hapd->wps_beacon_ie ?
- wpabuf_len(hapd->wps_beacon_ie) : 0) +
- (hapd->p2p_beacon_ie ?
- wpabuf_len(hapd->p2p_beacon_ie) : 0));
- if (beacon == NULL)
- return -1;
- if (hapd->wps_beacon_ie)
- wpabuf_put_buf(beacon, hapd->wps_beacon_ie);
- if (hapd->p2p_beacon_ie)
- wpabuf_put_buf(beacon, hapd->p2p_beacon_ie);
- }
-
- if (hapd->wps_probe_resp_ie == NULL && hapd->p2p_probe_resp_ie == NULL)
- proberesp = NULL;
- else {
- proberesp = wpabuf_alloc(
- (hapd->wps_probe_resp_ie ?
- wpabuf_len(hapd->wps_probe_resp_ie) : 0) +
- (hapd->p2p_probe_resp_ie ?
- wpabuf_len(hapd->p2p_probe_resp_ie) : 0));
- if (proberesp == NULL) {
- wpabuf_free(beacon);
- return -1;
- }
- if (hapd->wps_probe_resp_ie)
- wpabuf_put_buf(proberesp, hapd->wps_probe_resp_ie);
- if (hapd->p2p_probe_resp_ie)
- wpabuf_put_buf(proberesp, hapd->p2p_probe_resp_ie);
- }
-#endif /* CONFIG_P2P */
-
-#ifdef CONFIG_P2P_MANAGER
- if (hapd->conf->p2p & P2P_MANAGE) {
- struct wpabuf *a;
-
- a = wpabuf_alloc(100 + (beacon ? wpabuf_len(beacon) : 0));
- if (a) {
- u8 *start, *p;
- if (beacon)
- wpabuf_put_buf(a, beacon);
- if (beacon != hapd->wps_beacon_ie)
- wpabuf_free(beacon);
- start = wpabuf_put(a, 0);
- p = hostapd_eid_p2p_manage(hapd, start);
- wpabuf_put(a, p - start);
- beacon = a;
- }
-
- a = wpabuf_alloc(100 + (proberesp ? wpabuf_len(proberesp) :
- 0));
- if (a) {
- u8 *start, *p;
- if (proberesp)
- wpabuf_put_buf(a, proberesp);
- if (proberesp != hapd->wps_probe_resp_ie)
- wpabuf_free(proberesp);
- start = wpabuf_put(a, 0);
- p = hostapd_eid_p2p_manage(hapd, start);
- wpabuf_put(a, p - start);
- proberesp = a;
- }
- }
-#endif /* CONFIG_P2P_MANAGER */
-
-#ifdef CONFIG_WPS2
- if (hapd->conf->wps_state)
- assocresp = wps_build_assoc_resp_ie();
-#endif /* CONFIG_WPS2 */
-
-#ifdef CONFIG_P2P_MANAGER
- if (hapd->conf->p2p & P2P_MANAGE) {
- struct wpabuf *a;
- a = wpabuf_alloc(100 + (assocresp ? wpabuf_len(assocresp) :
- 0));
- if (a) {
- u8 *start, *p;
- start = wpabuf_put(a, 0);
- p = hostapd_eid_p2p_manage(hapd, start);
- wpabuf_put(a, p - start);
- if (assocresp) {
- wpabuf_put_buf(a, assocresp);
- wpabuf_free(assocresp);
- }
- assocresp = a;
- }
- }
-#endif /* CONFIG_P2P_MANAGER */
-
- ret = hapd->driver->set_ap_wps_ie(hapd->drv_priv, beacon, proberesp,
- assocresp);
-
- if (beacon != hapd->wps_beacon_ie)
- wpabuf_free(beacon);
- if (proberesp != hapd->wps_probe_resp_ie)
- wpabuf_free(proberesp);
- wpabuf_free(assocresp);
-
- return ret;
-}
-
-
-int hostapd_set_authorized(struct hostapd_data *hapd,
- struct sta_info *sta, int authorized)
-{
- if (authorized) {
- return hostapd_sta_set_flags(hapd, sta->addr,
- hostapd_sta_flags_to_drv(
- sta->flags),
- WPA_STA_AUTHORIZED, ~0);
- }
-
- return hostapd_sta_set_flags(hapd, sta->addr,
- hostapd_sta_flags_to_drv(sta->flags),
- 0, ~WPA_STA_AUTHORIZED);
-}
-
-
-int hostapd_set_sta_flags(struct hostapd_data *hapd, struct sta_info *sta)
-{
- int set_flags, total_flags, flags_and, flags_or;
- total_flags = hostapd_sta_flags_to_drv(sta->flags);
- set_flags = WPA_STA_SHORT_PREAMBLE | WPA_STA_WMM | WPA_STA_MFP;
- if (((!hapd->conf->ieee802_1x && !hapd->conf->wpa) ||
- sta->auth_alg == WLAN_AUTH_FT) &&
- sta->flags & WLAN_STA_AUTHORIZED)
- set_flags |= WPA_STA_AUTHORIZED;
- flags_or = total_flags & set_flags;
- flags_and = total_flags | ~set_flags;
- return hostapd_sta_set_flags(hapd, sta->addr, total_flags,
- flags_or, flags_and);
-}
-
-
-int hostapd_set_drv_ieee8021x(struct hostapd_data *hapd, const char *ifname,
- int enabled)
-{
- struct wpa_bss_params params;
- os_memset(¶ms, 0, sizeof(params));
- params.ifname = ifname;
- params.enabled = enabled;
- if (enabled) {
- params.wpa = hapd->conf->wpa;
- params.ieee802_1x = hapd->conf->ieee802_1x;
- params.wpa_group = hapd->conf->wpa_group;
- params.wpa_pairwise = hapd->conf->wpa_pairwise;
- params.wpa_key_mgmt = hapd->conf->wpa_key_mgmt;
- params.rsn_preauth = hapd->conf->rsn_preauth;
-#ifdef CONFIG_IEEE80211W
- params.ieee80211w = hapd->conf->ieee80211w;
-#endif /* CONFIG_IEEE80211W */
- }
- return hostapd_set_ieee8021x(hapd, ¶ms);
-}
-
-
-static int hostapd_set_ap_isolate(struct hostapd_data *hapd, int value)
-{
- if (hapd->driver == NULL || hapd->driver->set_intra_bss == NULL)
- return 0;
- return hapd->driver->set_intra_bss(hapd->drv_priv, !value);
-}
-
-
-int hostapd_set_bss_params(struct hostapd_data *hapd, int use_protection)
-{
- int ret = 0;
- int preamble;
-#ifdef CONFIG_IEEE80211N
- u8 buf[60], *ht_capab, *ht_oper, *pos;
-
- pos = buf;
- ht_capab = pos;
- pos = hostapd_eid_ht_capabilities(hapd, pos);
- ht_oper = pos;
- pos = hostapd_eid_ht_operation(hapd, pos);
- if (pos > ht_oper && ht_oper > ht_capab &&
- hostapd_set_ht_params(hapd, ht_capab + 2, ht_capab[1],
- ht_oper + 2, ht_oper[1])) {
- wpa_printf(MSG_ERROR, "Could not set HT capabilities "
- "for kernel driver");
- ret = -1;
- }
-
-#endif /* CONFIG_IEEE80211N */
-
- if (hostapd_set_cts_protect(hapd, use_protection)) {
- wpa_printf(MSG_ERROR, "Failed to set CTS protect in kernel "
- "driver");
- ret = -1;
- }
-
- if (hapd->iface->current_mode &&
- hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G &&
- hostapd_set_short_slot_time(hapd,
- hapd->iface->num_sta_no_short_slot_time
- > 0 ? 0 : 1)) {
- wpa_printf(MSG_ERROR, "Failed to set Short Slot Time option "
- "in kernel driver");
- ret = -1;
- }
-
- if (hapd->iface->num_sta_no_short_preamble == 0 &&
- hapd->iconf->preamble == SHORT_PREAMBLE)
- preamble = SHORT_PREAMBLE;
- else
- preamble = LONG_PREAMBLE;
- if (hostapd_set_preamble(hapd, preamble)) {
- wpa_printf(MSG_ERROR, "Could not set preamble for kernel "
- "driver");
- ret = -1;
- }
-
- if (hostapd_set_ap_isolate(hapd, hapd->conf->isolate) &&
- hapd->conf->isolate) {
- wpa_printf(MSG_ERROR, "Could not enable AP isolation in "
- "kernel driver");
- ret = -1;
- }
-
- return ret;
-}
-
-
-int hostapd_vlan_if_add(struct hostapd_data *hapd, const char *ifname)
-{
- char force_ifname[IFNAMSIZ];
- u8 if_addr[ETH_ALEN];
- return hostapd_if_add(hapd, WPA_IF_AP_VLAN, ifname, hapd->own_addr,
- NULL, NULL, force_ifname, if_addr, NULL);
-}
-
-
-int hostapd_vlan_if_remove(struct hostapd_data *hapd, const char *ifname)
-{
- return hostapd_if_remove(hapd, WPA_IF_AP_VLAN, ifname);
-}
-
-
-int hostapd_set_wds_sta(struct hostapd_data *hapd, const u8 *addr, int aid,
- int val)
-{
- const char *bridge = NULL;
-
- if (hapd->driver == NULL || hapd->driver->set_wds_sta == NULL)
- return 0;
- if (hapd->conf->wds_bridge[0])
- bridge = hapd->conf->wds_bridge;
- else if (hapd->conf->bridge[0])
- bridge = hapd->conf->bridge;
- return hapd->driver->set_wds_sta(hapd->drv_priv, addr, aid, val,
- bridge);
-}
-
-
-int hostapd_sta_add(struct hostapd_data *hapd,
- const u8 *addr, u16 aid, u16 capability,
- const u8 *supp_rates, size_t supp_rates_len,
- u16 listen_interval,
- const struct ieee80211_ht_capabilities *ht_capab)
-{
- struct hostapd_sta_add_params params;
-
- if (hapd->driver == NULL)
- return 0;
- if (hapd->driver->sta_add == NULL)
- return 0;
-
- os_memset(¶ms, 0, sizeof(params));
- params.addr = addr;
- params.aid = aid;
- params.capability = capability;
- params.supp_rates = supp_rates;
- params.supp_rates_len = supp_rates_len;
- params.listen_interval = listen_interval;
- params.ht_capabilities = ht_capab;
- return hapd->driver->sta_add(hapd->drv_priv, ¶ms);
-}
-
-
-int hostapd_set_privacy(struct hostapd_data *hapd, int enabled)
-{
- if (hapd->driver == NULL || hapd->driver->set_privacy == NULL)
- return 0;
- return hapd->driver->set_privacy(hapd->drv_priv, enabled);
-}
-
-
-int hostapd_set_generic_elem(struct hostapd_data *hapd, const u8 *elem,
- size_t elem_len)
-{
- if (hapd->driver == NULL || hapd->driver->set_generic_elem == NULL)
- return 0;
- return hapd->driver->set_generic_elem(hapd->drv_priv, elem, elem_len);
-}
-
-
-int hostapd_get_ssid(struct hostapd_data *hapd, u8 *buf, size_t len)
-{
- if (hapd->driver == NULL || hapd->driver->hapd_get_ssid == NULL)
- return 0;
- return hapd->driver->hapd_get_ssid(hapd->drv_priv, buf, len);
-}
-
-
-int hostapd_set_ssid(struct hostapd_data *hapd, const u8 *buf, size_t len)
-{
- if (hapd->driver == NULL || hapd->driver->hapd_set_ssid == NULL)
- return 0;
- return hapd->driver->hapd_set_ssid(hapd->drv_priv, buf, len);
-}
-
-
-int hostapd_if_add(struct hostapd_data *hapd, enum wpa_driver_if_type type,
- const char *ifname, const u8 *addr, void *bss_ctx,
- void **drv_priv, char *force_ifname, u8 *if_addr,
- const char *bridge)
-{
- if (hapd->driver == NULL || hapd->driver->if_add == NULL)
- return -1;
- return hapd->driver->if_add(hapd->drv_priv, type, ifname, addr,
- bss_ctx, drv_priv, force_ifname, if_addr,
- bridge);
-}
-
-
-int hostapd_if_remove(struct hostapd_data *hapd, enum wpa_driver_if_type type,
- const char *ifname)
-{
- if (hapd->driver == NULL || hapd->driver->if_remove == NULL)
- return -1;
- return hapd->driver->if_remove(hapd->drv_priv, type, ifname);
-}
-
-
-int hostapd_set_ieee8021x(struct hostapd_data *hapd,
- struct wpa_bss_params *params)
-{
- if (hapd->driver == NULL || hapd->driver->set_ieee8021x == NULL)
- return 0;
- return hapd->driver->set_ieee8021x(hapd->drv_priv, params);
-}
-
-
-int hostapd_get_seqnum(const char *ifname, struct hostapd_data *hapd,
- const u8 *addr, int idx, u8 *seq)
-{
- if (hapd->driver == NULL || hapd->driver->get_seqnum == NULL)
- return 0;
- return hapd->driver->get_seqnum(ifname, hapd->drv_priv, addr, idx,
- seq);
-}
-
-
-int hostapd_flush(struct hostapd_data *hapd)
-{
- if (hapd->driver == NULL || hapd->driver->flush == NULL)
- return 0;
- return hapd->driver->flush(hapd->drv_priv);
-}
-
-
-int hostapd_set_freq(struct hostapd_data *hapd, int mode, int freq,
- int channel, int ht_enabled, int sec_channel_offset)
-{
- struct hostapd_freq_params data;
- if (hapd->driver == NULL)
- return 0;
- if (hapd->driver->set_freq == NULL)
- return 0;
- os_memset(&data, 0, sizeof(data));
- data.mode = mode;
- data.freq = freq;
- data.channel = channel;
- data.ht_enabled = ht_enabled;
- data.sec_channel_offset = sec_channel_offset;
- return hapd->driver->set_freq(hapd->drv_priv, &data);
-}
-
-int hostapd_set_rts(struct hostapd_data *hapd, int rts)
-{
- if (hapd->driver == NULL || hapd->driver->set_rts == NULL)
- return 0;
- return hapd->driver->set_rts(hapd->drv_priv, rts);
-}
-
-
-int hostapd_set_frag(struct hostapd_data *hapd, int frag)
-{
- if (hapd->driver == NULL || hapd->driver->set_frag == NULL)
- return 0;
- return hapd->driver->set_frag(hapd->drv_priv, frag);
-}
-
-
-int hostapd_sta_set_flags(struct hostapd_data *hapd, u8 *addr,
- int total_flags, int flags_or, int flags_and)
-{
- if (hapd->driver == NULL || hapd->driver->sta_set_flags == NULL)
- return 0;
- return hapd->driver->sta_set_flags(hapd->drv_priv, addr, total_flags,
- flags_or, flags_and);
-}
-
-
-int hostapd_set_rate_sets(struct hostapd_data *hapd, int *supp_rates,
- int *basic_rates, int mode)
-{
- if (hapd->driver == NULL || hapd->driver->set_rate_sets == NULL)
- return 0;
- return hapd->driver->set_rate_sets(hapd->drv_priv, supp_rates,
- basic_rates, mode);
-}
-
-
-int hostapd_set_country(struct hostapd_data *hapd, const char *country)
-{
- if (hapd->driver == NULL ||
- hapd->driver->set_country == NULL)
- return 0;
- return hapd->driver->set_country(hapd->drv_priv, country);
-}
-
-
-int hostapd_set_cts_protect(struct hostapd_data *hapd, int value)
-{
- if (hapd->driver == NULL || hapd->driver->set_cts_protect == NULL)
- return 0;
- return hapd->driver->set_cts_protect(hapd->drv_priv, value);
-}
-
-
-int hostapd_set_preamble(struct hostapd_data *hapd, int value)
-{
- if (hapd->driver == NULL || hapd->driver->set_preamble == NULL)
- return 0;
- return hapd->driver->set_preamble(hapd->drv_priv, value);
-}
-
-
-int hostapd_set_short_slot_time(struct hostapd_data *hapd, int value)
-{
- if (hapd->driver == NULL || hapd->driver->set_short_slot_time == NULL)
- return 0;
- return hapd->driver->set_short_slot_time(hapd->drv_priv, value);
-}
-
-
-int hostapd_set_tx_queue_params(struct hostapd_data *hapd, int queue, int aifs,
- int cw_min, int cw_max, int burst_time)
-{
- if (hapd->driver == NULL || hapd->driver->set_tx_queue_params == NULL)
- return 0;
- return hapd->driver->set_tx_queue_params(hapd->drv_priv, queue, aifs,
- cw_min, cw_max, burst_time);
-}
-
-
-int hostapd_valid_bss_mask(struct hostapd_data *hapd, const u8 *addr,
- const u8 *mask)
-{
- if (hapd->driver == NULL || hapd->driver->valid_bss_mask == NULL)
- return 1;
- return hapd->driver->valid_bss_mask(hapd->drv_priv, addr, mask);
-}
-
-
-struct hostapd_hw_modes *
-hostapd_get_hw_feature_data(struct hostapd_data *hapd, u16 *num_modes,
- u16 *flags)
-{
- if (hapd->driver == NULL ||
- hapd->driver->get_hw_feature_data == NULL)
- return NULL;
- return hapd->driver->get_hw_feature_data(hapd->drv_priv, num_modes,
- flags);
-}
-
-
-int hostapd_driver_commit(struct hostapd_data *hapd)
-{
- if (hapd->driver == NULL || hapd->driver->commit == NULL)
- return 0;
- return hapd->driver->commit(hapd->drv_priv);
-}
-
-
-int hostapd_set_ht_params(struct hostapd_data *hapd,
- const u8 *ht_capab, size_t ht_capab_len,
- const u8 *ht_oper, size_t ht_oper_len)
-{
- if (hapd->driver == NULL || hapd->driver->set_ht_params == NULL ||
- ht_capab == NULL || ht_oper == NULL)
- return 0;
- return hapd->driver->set_ht_params(hapd->drv_priv,
- ht_capab, ht_capab_len,
- ht_oper, ht_oper_len);
-}
-
-
-int hostapd_drv_none(struct hostapd_data *hapd)
-{
- return hapd->driver && os_strcmp(hapd->driver->name, "none") == 0;
-}
-
-
-int hostapd_driver_scan(struct hostapd_data *hapd,
- struct wpa_driver_scan_params *params)
-{
- if (hapd->driver && hapd->driver->scan2)
- return hapd->driver->scan2(hapd->drv_priv, params);
- return -1;
-}
-
-
-struct wpa_scan_results * hostapd_driver_get_scan_results(
- struct hostapd_data *hapd)
-{
- if (hapd->driver && hapd->driver->get_scan_results2)
- return hapd->driver->get_scan_results2(hapd->drv_priv);
- return NULL;
-}
-
-
-int hostapd_driver_set_noa(struct hostapd_data *hapd, u8 count, int start,
- int duration)
-{
- if (hapd->driver && hapd->driver->set_noa)
- return hapd->driver->set_noa(hapd->drv_priv, count, start,
- duration);
- return -1;
-}
-
-
-int hostapd_drv_set_key(const char *ifname, struct hostapd_data *hapd,
- enum wpa_alg alg, const u8 *addr,
- int key_idx, int set_tx,
- const u8 *seq, size_t seq_len,
- const u8 *key, size_t key_len)
-{
- if (hapd->driver == NULL || hapd->driver->set_key == NULL)
- return 0;
- return hapd->driver->set_key(ifname, hapd->drv_priv, alg, addr,
- key_idx, set_tx, seq, seq_len, key,
- key_len);
-}
-
-
-int hostapd_drv_send_mlme(struct hostapd_data *hapd,
- const void *msg, size_t len)
-{
- if (hapd->driver == NULL || hapd->driver->send_mlme == NULL)
- return 0;
- return hapd->driver->send_mlme(hapd->drv_priv, msg, len);
-}
-
-
-int hostapd_drv_sta_deauth(struct hostapd_data *hapd,
- const u8 *addr, int reason)
-{
- if (hapd->driver == NULL || hapd->driver->sta_deauth == NULL)
- return 0;
- return hapd->driver->sta_deauth(hapd->drv_priv, hapd->own_addr, addr,
- reason);
-}
-
-
-int hostapd_drv_sta_disassoc(struct hostapd_data *hapd,
- const u8 *addr, int reason)
-{
- if (hapd->driver == NULL || hapd->driver->sta_disassoc == NULL)
- return 0;
- return hapd->driver->sta_disassoc(hapd->drv_priv, hapd->own_addr, addr,
- reason);
-}
diff --git a/hostapd-0.8/src/ap/ap_drv_ops.h b/hostapd-0.8/src/ap/ap_drv_ops.h
deleted file mode 100644
index 36bb826..0000000
--- a/hostapd-0.8/src/ap/ap_drv_ops.h
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * hostapd - Driver operations
- * Copyright (c) 2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef AP_DRV_OPS
-#define AP_DRV_OPS
-
-enum wpa_driver_if_type;
-struct wpa_bss_params;
-struct wpa_driver_scan_params;
-struct ieee80211_ht_capabilities;
-
-u32 hostapd_sta_flags_to_drv(u32 flags);
-int hostapd_set_ap_wps_ie(struct hostapd_data *hapd);
-int hostapd_set_authorized(struct hostapd_data *hapd,
- struct sta_info *sta, int authorized);
-int hostapd_set_sta_flags(struct hostapd_data *hapd, struct sta_info *sta);
-int hostapd_set_drv_ieee8021x(struct hostapd_data *hapd, const char *ifname,
- int enabled);
-int hostapd_set_bss_params(struct hostapd_data *hapd, int use_protection);
-int hostapd_vlan_if_add(struct hostapd_data *hapd, const char *ifname);
-int hostapd_vlan_if_remove(struct hostapd_data *hapd, const char *ifname);
-int hostapd_set_wds_sta(struct hostapd_data *hapd, const u8 *addr, int aid,
- int val);
-int hostapd_sta_add(struct hostapd_data *hapd,
- const u8 *addr, u16 aid, u16 capability,
- const u8 *supp_rates, size_t supp_rates_len,
- u16 listen_interval,
- const struct ieee80211_ht_capabilities *ht_capab);
-int hostapd_set_privacy(struct hostapd_data *hapd, int enabled);
-int hostapd_set_generic_elem(struct hostapd_data *hapd, const u8 *elem,
- size_t elem_len);
-int hostapd_get_ssid(struct hostapd_data *hapd, u8 *buf, size_t len);
-int hostapd_set_ssid(struct hostapd_data *hapd, const u8 *buf, size_t len);
-int hostapd_if_add(struct hostapd_data *hapd, enum wpa_driver_if_type type,
- const char *ifname, const u8 *addr, void *bss_ctx,
- void **drv_priv, char *force_ifname, u8 *if_addr,
- const char *bridge);
-int hostapd_if_remove(struct hostapd_data *hapd, enum wpa_driver_if_type type,
- const char *ifname);
-int hostapd_set_ieee8021x(struct hostapd_data *hapd,
- struct wpa_bss_params *params);
-int hostapd_get_seqnum(const char *ifname, struct hostapd_data *hapd,
- const u8 *addr, int idx, u8 *seq);
-int hostapd_flush(struct hostapd_data *hapd);
-int hostapd_set_freq(struct hostapd_data *hapd, int mode, int freq,
- int channel, int ht_enabled, int sec_channel_offset);
-int hostapd_set_rts(struct hostapd_data *hapd, int rts);
-int hostapd_set_frag(struct hostapd_data *hapd, int frag);
-int hostapd_sta_set_flags(struct hostapd_data *hapd, u8 *addr,
- int total_flags, int flags_or, int flags_and);
-int hostapd_set_rate_sets(struct hostapd_data *hapd, int *supp_rates,
- int *basic_rates, int mode);
-int hostapd_set_country(struct hostapd_data *hapd, const char *country);
-int hostapd_set_cts_protect(struct hostapd_data *hapd, int value);
-int hostapd_set_preamble(struct hostapd_data *hapd, int value);
-int hostapd_set_short_slot_time(struct hostapd_data *hapd, int value);
-int hostapd_set_tx_queue_params(struct hostapd_data *hapd, int queue, int aifs,
- int cw_min, int cw_max, int burst_time);
-int hostapd_valid_bss_mask(struct hostapd_data *hapd, const u8 *addr,
- const u8 *mask);
-struct hostapd_hw_modes *
-hostapd_get_hw_feature_data(struct hostapd_data *hapd, u16 *num_modes,
- u16 *flags);
-int hostapd_driver_commit(struct hostapd_data *hapd);
-int hostapd_set_ht_params(struct hostapd_data *hapd,
- const u8 *ht_capab, size_t ht_capab_len,
- const u8 *ht_oper, size_t ht_oper_len);
-int hostapd_drv_none(struct hostapd_data *hapd);
-int hostapd_driver_scan(struct hostapd_data *hapd,
- struct wpa_driver_scan_params *params);
-struct wpa_scan_results * hostapd_driver_get_scan_results(
- struct hostapd_data *hapd);
-int hostapd_driver_set_noa(struct hostapd_data *hapd, u8 count, int start,
- int duration);
-int hostapd_drv_set_key(const char *ifname,
- struct hostapd_data *hapd,
- enum wpa_alg alg, const u8 *addr,
- int key_idx, int set_tx,
- const u8 *seq, size_t seq_len,
- const u8 *key, size_t key_len);
-int hostapd_drv_send_mlme(struct hostapd_data *hapd,
- const void *msg, size_t len);
-int hostapd_drv_sta_deauth(struct hostapd_data *hapd,
- const u8 *addr, int reason);
-int hostapd_drv_sta_disassoc(struct hostapd_data *hapd,
- const u8 *addr, int reason);
-
-
-#include "drivers/driver.h"
-
-static inline int hostapd_drv_set_countermeasures(struct hostapd_data *hapd,
- int enabled)
-{
- if (hapd->driver == NULL ||
- hapd->driver->hapd_set_countermeasures == NULL)
- return 0;
- return hapd->driver->hapd_set_countermeasures(hapd->drv_priv, enabled);
-}
-
-static inline int hostapd_drv_set_sta_vlan(const char *ifname,
- struct hostapd_data *hapd,
- const u8 *addr, int vlan_id)
-{
- if (hapd->driver == NULL || hapd->driver->set_sta_vlan == NULL)
- return 0;
- return hapd->driver->set_sta_vlan(hapd->drv_priv, addr, ifname,
- vlan_id);
-}
-
-static inline int hostapd_drv_get_inact_sec(struct hostapd_data *hapd,
- const u8 *addr)
-{
- if (hapd->driver == NULL || hapd->driver->get_inact_sec == NULL)
- return 0;
- return hapd->driver->get_inact_sec(hapd->drv_priv, addr);
-}
-
-static inline int hostapd_drv_sta_remove(struct hostapd_data *hapd,
- const u8 *addr)
-{
- if (hapd->driver == NULL || hapd->driver->sta_remove == NULL)
- return 0;
- return hapd->driver->sta_remove(hapd->drv_priv, addr);
-}
-
-static inline int hostapd_drv_hapd_send_eapol(struct hostapd_data *hapd,
- const u8 *addr, const u8 *data,
- size_t data_len, int encrypt,
- u32 flags)
-{
- if (hapd->driver == NULL || hapd->driver->hapd_send_eapol == NULL)
- return 0;
- return hapd->driver->hapd_send_eapol(hapd->drv_priv, addr, data,
- data_len, encrypt,
- hapd->own_addr, flags);
-}
-
-static inline int hostapd_drv_read_sta_data(
- struct hostapd_data *hapd, struct hostap_sta_driver_data *data,
- const u8 *addr)
-{
- if (hapd->driver == NULL || hapd->driver->read_sta_data == NULL)
- return -1;
- return hapd->driver->read_sta_data(hapd->drv_priv, data, addr);
-}
-
-static inline int hostapd_drv_sta_clear_stats(struct hostapd_data *hapd,
- const u8 *addr)
-{
- if (hapd->driver == NULL || hapd->driver->sta_clear_stats == NULL)
- return 0;
- return hapd->driver->sta_clear_stats(hapd->drv_priv, addr);
-}
-
-static inline int hostapd_drv_set_beacon(struct hostapd_data *hapd,
- const u8 *head, size_t head_len,
- const u8 *tail, size_t tail_len,
- int dtim_period, int beacon_int)
-{
- if (hapd->driver == NULL || hapd->driver->set_beacon == NULL)
- return 0;
- return hapd->driver->set_beacon(hapd->drv_priv,
- head, head_len, tail, tail_len,
- dtim_period, beacon_int);
-}
-
-static inline int hostapd_drv_set_radius_acl_auth(struct hostapd_data *hapd,
- const u8 *mac, int accepted,
- u32 session_timeout)
-{
- if (hapd->driver == NULL || hapd->driver->set_radius_acl_auth == NULL)
- return 0;
- return hapd->driver->set_radius_acl_auth(hapd->drv_priv, mac, accepted,
- session_timeout);
-}
-
-static inline int hostapd_drv_set_radius_acl_expire(struct hostapd_data *hapd,
- const u8 *mac)
-{
- if (hapd->driver == NULL ||
- hapd->driver->set_radius_acl_expire == NULL)
- return 0;
- return hapd->driver->set_radius_acl_expire(hapd->drv_priv, mac);
-}
-
-#endif /* AP_DRV_OPS */
diff --git a/hostapd-0.8/src/ap/ap_list.c b/hostapd-0.8/src/ap/ap_list.c
deleted file mode 100644
index 9b9fc9e..0000000
--- a/hostapd-0.8/src/ap/ap_list.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * hostapd / AP table
- * Copyright (c) 2002-2009, Jouni Malinen
- * Copyright (c) 2003-2004, Instant802 Networks, Inc.
- * Copyright (c) 2006, Devicescape Software, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "common/ieee802_11_defs.h"
-#include "common/ieee802_11_common.h"
-#include "drivers/driver.h"
-#include "hostapd.h"
-#include "ap_config.h"
-#include "ieee802_11.h"
-#include "sta_info.h"
-#include "beacon.h"
-#include "ap_list.h"
-
-
-/* AP list is a double linked list with head->prev pointing to the end of the
- * list and tail->next = NULL. Entries are moved to the head of the list
- * whenever a beacon has been received from the AP in question. The tail entry
- * in this link will thus be the least recently used entry. */
-
-
-static int ap_list_beacon_olbc(struct hostapd_iface *iface, struct ap_info *ap)
-{
- int i;
-
- if (iface->current_mode->mode != HOSTAPD_MODE_IEEE80211G ||
- iface->conf->channel != ap->channel)
- return 0;
-
- if (ap->erp != -1 && (ap->erp & ERP_INFO_NON_ERP_PRESENT))
- return 1;
-
- for (i = 0; i < WLAN_SUPP_RATES_MAX; i++) {
- int rate = (ap->supported_rates[i] & 0x7f) * 5;
- if (rate == 60 || rate == 90 || rate > 110)
- return 0;
- }
-
- return 1;
-}
-
-
-struct ap_info * ap_get_ap(struct hostapd_iface *iface, const u8 *ap)
-{
- struct ap_info *s;
-
- s = iface->ap_hash[STA_HASH(ap)];
- while (s != NULL && os_memcmp(s->addr, ap, ETH_ALEN) != 0)
- s = s->hnext;
- return s;
-}
-
-
-static void ap_ap_list_add(struct hostapd_iface *iface, struct ap_info *ap)
-{
- if (iface->ap_list) {
- ap->prev = iface->ap_list->prev;
- iface->ap_list->prev = ap;
- } else
- ap->prev = ap;
- ap->next = iface->ap_list;
- iface->ap_list = ap;
-}
-
-
-static void ap_ap_list_del(struct hostapd_iface *iface, struct ap_info *ap)
-{
- if (iface->ap_list == ap)
- iface->ap_list = ap->next;
- else
- ap->prev->next = ap->next;
-
- if (ap->next)
- ap->next->prev = ap->prev;
- else if (iface->ap_list)
- iface->ap_list->prev = ap->prev;
-}
-
-
-static void ap_ap_iter_list_add(struct hostapd_iface *iface,
- struct ap_info *ap)
-{
- if (iface->ap_iter_list) {
- ap->iter_prev = iface->ap_iter_list->iter_prev;
- iface->ap_iter_list->iter_prev = ap;
- } else
- ap->iter_prev = ap;
- ap->iter_next = iface->ap_iter_list;
- iface->ap_iter_list = ap;
-}
-
-
-static void ap_ap_iter_list_del(struct hostapd_iface *iface,
- struct ap_info *ap)
-{
- if (iface->ap_iter_list == ap)
- iface->ap_iter_list = ap->iter_next;
- else
- ap->iter_prev->iter_next = ap->iter_next;
-
- if (ap->iter_next)
- ap->iter_next->iter_prev = ap->iter_prev;
- else if (iface->ap_iter_list)
- iface->ap_iter_list->iter_prev = ap->iter_prev;
-}
-
-
-static void ap_ap_hash_add(struct hostapd_iface *iface, struct ap_info *ap)
-{
- ap->hnext = iface->ap_hash[STA_HASH(ap->addr)];
- iface->ap_hash[STA_HASH(ap->addr)] = ap;
-}
-
-
-static void ap_ap_hash_del(struct hostapd_iface *iface, struct ap_info *ap)
-{
- struct ap_info *s;
-
- s = iface->ap_hash[STA_HASH(ap->addr)];
- if (s == NULL) return;
- if (os_memcmp(s->addr, ap->addr, ETH_ALEN) == 0) {
- iface->ap_hash[STA_HASH(ap->addr)] = s->hnext;
- return;
- }
-
- while (s->hnext != NULL &&
- os_memcmp(s->hnext->addr, ap->addr, ETH_ALEN) != 0)
- s = s->hnext;
- if (s->hnext != NULL)
- s->hnext = s->hnext->hnext;
- else
- printf("AP: could not remove AP " MACSTR " from hash table\n",
- MAC2STR(ap->addr));
-}
-
-
-static void ap_free_ap(struct hostapd_iface *iface, struct ap_info *ap)
-{
- ap_ap_hash_del(iface, ap);
- ap_ap_list_del(iface, ap);
- ap_ap_iter_list_del(iface, ap);
-
- iface->num_ap--;
- os_free(ap);
-}
-
-
-static void hostapd_free_aps(struct hostapd_iface *iface)
-{
- struct ap_info *ap, *prev;
-
- ap = iface->ap_list;
-
- while (ap) {
- prev = ap;
- ap = ap->next;
- ap_free_ap(iface, prev);
- }
-
- iface->ap_list = NULL;
-}
-
-
-int ap_ap_for_each(struct hostapd_iface *iface,
- int (*func)(struct ap_info *s, void *data), void *data)
-{
- struct ap_info *s;
- int ret = 0;
-
- s = iface->ap_list;
-
- while (s) {
- ret = func(s, data);
- if (ret)
- break;
- s = s->next;
- }
-
- return ret;
-}
-
-
-static struct ap_info * ap_ap_add(struct hostapd_iface *iface, const u8 *addr)
-{
- struct ap_info *ap;
-
- ap = os_zalloc(sizeof(struct ap_info));
- if (ap == NULL)
- return NULL;
-
- /* initialize AP info data */
- os_memcpy(ap->addr, addr, ETH_ALEN);
- ap_ap_list_add(iface, ap);
- iface->num_ap++;
- ap_ap_hash_add(iface, ap);
- ap_ap_iter_list_add(iface, ap);
-
- if (iface->num_ap > iface->conf->ap_table_max_size && ap != ap->prev) {
- wpa_printf(MSG_DEBUG, "Removing the least recently used AP "
- MACSTR " from AP table", MAC2STR(ap->prev->addr));
- ap_free_ap(iface, ap->prev);
- }
-
- return ap;
-}
-
-
-void ap_list_process_beacon(struct hostapd_iface *iface,
- const struct ieee80211_mgmt *mgmt,
- struct ieee802_11_elems *elems,
- struct hostapd_frame_info *fi)
-{
- struct ap_info *ap;
- struct os_time now;
- int new_ap = 0;
- size_t len;
- int set_beacon = 0;
-
- if (iface->conf->ap_table_max_size < 1)
- return;
-
- ap = ap_get_ap(iface, mgmt->bssid);
- if (!ap) {
- ap = ap_ap_add(iface, mgmt->bssid);
- if (!ap) {
- printf("Failed to allocate AP information entry\n");
- return;
- }
- new_ap = 1;
- }
-
- ap->beacon_int = le_to_host16(mgmt->u.beacon.beacon_int);
- ap->capability = le_to_host16(mgmt->u.beacon.capab_info);
-
- if (elems->ssid) {
- len = elems->ssid_len;
- if (len >= sizeof(ap->ssid))
- len = sizeof(ap->ssid) - 1;
- os_memcpy(ap->ssid, elems->ssid, len);
- ap->ssid[len] = '\0';
- ap->ssid_len = len;
- }
-
- os_memset(ap->supported_rates, 0, WLAN_SUPP_RATES_MAX);
- len = 0;
- if (elems->supp_rates) {
- len = elems->supp_rates_len;
- if (len > WLAN_SUPP_RATES_MAX)
- len = WLAN_SUPP_RATES_MAX;
- os_memcpy(ap->supported_rates, elems->supp_rates, len);
- }
- if (elems->ext_supp_rates) {
- int len2;
- if (len + elems->ext_supp_rates_len > WLAN_SUPP_RATES_MAX)
- len2 = WLAN_SUPP_RATES_MAX - len;
- else
- len2 = elems->ext_supp_rates_len;
- os_memcpy(ap->supported_rates + len, elems->ext_supp_rates,
- len2);
- }
-
- ap->wpa = elems->wpa_ie != NULL;
-
- if (elems->erp_info && elems->erp_info_len == 1)
- ap->erp = elems->erp_info[0];
- else
- ap->erp = -1;
-
- if (elems->ds_params && elems->ds_params_len == 1)
- ap->channel = elems->ds_params[0];
- else if (fi)
- ap->channel = fi->channel;
-
- if (elems->ht_capabilities)
- ap->ht_support = 1;
- else
- ap->ht_support = 0;
-
- ap->num_beacons++;
- os_get_time(&now);
- ap->last_beacon = now.sec;
- if (fi) {
- ap->ssi_signal = fi->ssi_signal;
- ap->datarate = fi->datarate;
- }
-
- if (!new_ap && ap != iface->ap_list) {
- /* move AP entry into the beginning of the list so that the
- * oldest entry is always in the end of the list */
- ap_ap_list_del(iface, ap);
- ap_ap_list_add(iface, ap);
- }
-
- if (!iface->olbc &&
- ap_list_beacon_olbc(iface, ap)) {
- iface->olbc = 1;
- wpa_printf(MSG_DEBUG, "OLBC AP detected: " MACSTR " - enable "
- "protection", MAC2STR(ap->addr));
- set_beacon++;
- }
-
-#ifdef CONFIG_IEEE80211N
- if (!iface->olbc_ht && !ap->ht_support) {
- iface->olbc_ht = 1;
- hostapd_ht_operation_update(iface);
- wpa_printf(MSG_DEBUG, "OLBC HT AP detected: " MACSTR
- " - enable protection", MAC2STR(ap->addr));
- set_beacon++;
- }
-#endif /* CONFIG_IEEE80211N */
-
- if (set_beacon)
- ieee802_11_set_beacons(iface);
-}
-
-
-static void ap_list_timer(void *eloop_ctx, void *timeout_ctx)
-{
- struct hostapd_iface *iface = eloop_ctx;
- struct os_time now;
- struct ap_info *ap;
- int set_beacon = 0;
-
- eloop_register_timeout(10, 0, ap_list_timer, iface, NULL);
-
- if (!iface->ap_list)
- return;
-
- os_get_time(&now);
-
- while (iface->ap_list) {
- ap = iface->ap_list->prev;
- if (ap->last_beacon + iface->conf->ap_table_expiration_time >=
- now.sec)
- break;
-
- ap_free_ap(iface, ap);
- }
-
- if (iface->olbc || iface->olbc_ht) {
- int olbc = 0;
- int olbc_ht = 0;
-
- ap = iface->ap_list;
- while (ap && (olbc == 0 || olbc_ht == 0)) {
- if (ap_list_beacon_olbc(iface, ap))
- olbc = 1;
- if (!ap->ht_support)
- olbc_ht = 1;
- ap = ap->next;
- }
- if (!olbc && iface->olbc) {
- wpa_printf(MSG_DEBUG, "OLBC not detected anymore");
- iface->olbc = 0;
- set_beacon++;
- }
-#ifdef CONFIG_IEEE80211N
- if (!olbc_ht && iface->olbc_ht) {
- wpa_printf(MSG_DEBUG, "OLBC HT not detected anymore");
- iface->olbc_ht = 0;
- hostapd_ht_operation_update(iface);
- set_beacon++;
- }
-#endif /* CONFIG_IEEE80211N */
- }
-
- if (set_beacon)
- ieee802_11_set_beacons(iface);
-}
-
-
-int ap_list_init(struct hostapd_iface *iface)
-{
- eloop_register_timeout(10, 0, ap_list_timer, iface, NULL);
- return 0;
-}
-
-
-void ap_list_deinit(struct hostapd_iface *iface)
-{
- eloop_cancel_timeout(ap_list_timer, iface, NULL);
- hostapd_free_aps(iface);
-}
diff --git a/hostapd-0.8/src/ap/ap_list.h b/hostapd-0.8/src/ap/ap_list.h
deleted file mode 100644
index 6df8981..0000000
--- a/hostapd-0.8/src/ap/ap_list.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * hostapd / AP table
- * Copyright (c) 2002-2003, Jouni Malinen
- * Copyright (c) 2003-2004, Instant802 Networks, Inc.
- * Copyright (c) 2006, Devicescape Software, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef AP_LIST_H
-#define AP_LIST_H
-
-struct ap_info {
- /* Note: next/prev pointers are updated whenever a new beacon is
- * received because these are used to find the least recently used
- * entries. iter_next/iter_prev are updated only when adding new BSSes
- * and when removing old ones. These should be used when iterating
- * through the table in a manner that allows beacons to be received
- * during the iteration. */
- struct ap_info *next; /* next entry in AP list */
- struct ap_info *prev; /* previous entry in AP list */
- struct ap_info *hnext; /* next entry in hash table list */
- struct ap_info *iter_next; /* next entry in AP iteration list */
- struct ap_info *iter_prev; /* previous entry in AP iteration list */
- u8 addr[6];
- u16 beacon_int;
- u16 capability;
- u8 supported_rates[WLAN_SUPP_RATES_MAX];
- u8 ssid[33];
- size_t ssid_len;
- int wpa;
- int erp; /* ERP Info or -1 if ERP info element not present */
-
- int channel;
- int datarate; /* in 100 kbps */
- int ssi_signal;
-
- int ht_support;
-
- unsigned int num_beacons; /* number of beacon frames received */
- os_time_t last_beacon;
-
- int already_seen; /* whether API call AP-NEW has already fetched
- * information about this AP */
-};
-
-struct ieee802_11_elems;
-struct hostapd_frame_info;
-
-struct ap_info * ap_get_ap(struct hostapd_iface *iface, const u8 *sta);
-int ap_ap_for_each(struct hostapd_iface *iface,
- int (*func)(struct ap_info *s, void *data), void *data);
-void ap_list_process_beacon(struct hostapd_iface *iface,
- const struct ieee80211_mgmt *mgmt,
- struct ieee802_11_elems *elems,
- struct hostapd_frame_info *fi);
-#ifdef NEED_AP_MLME
-int ap_list_init(struct hostapd_iface *iface);
-void ap_list_deinit(struct hostapd_iface *iface);
-#else /* NEED_AP_MLME */
-static inline int ap_list_init(struct hostapd_iface *iface)
-{
- return 0;
-}
-
-static inline void ap_list_deinit(struct hostapd_iface *iface)
-{
-}
-#endif /* NEED_AP_MLME */
-
-#endif /* AP_LIST_H */
diff --git a/hostapd-0.8/src/ap/ap_mlme.c b/hostapd-0.8/src/ap/ap_mlme.c
deleted file mode 100644
index 2b09b11..0000000
--- a/hostapd-0.8/src/ap/ap_mlme.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * hostapd / IEEE 802.11 MLME
- * Copyright 2003-2006, Jouni Malinen
- * Copyright 2003-2004, Instant802 Networks, Inc.
- * Copyright 2005-2006, Devicescape Software, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "common/ieee802_11_defs.h"
-#include "ieee802_11.h"
-#include "wpa_auth.h"
-#include "sta_info.h"
-#include "ap_mlme.h"
-
-
-#ifndef CONFIG_NO_HOSTAPD_LOGGER
-static const char * mlme_auth_alg_str(int alg)
-{
- switch (alg) {
- case WLAN_AUTH_OPEN:
- return "OPEN_SYSTEM";
- case WLAN_AUTH_SHARED_KEY:
- return "SHARED_KEY";
- case WLAN_AUTH_FT:
- return "FT";
- }
-
- return "unknown";
-}
-#endif /* CONFIG_NO_HOSTAPD_LOGGER */
-
-
-/**
- * mlme_authenticate_indication - Report the establishment of an authentication
- * relationship with a specific peer MAC entity
- * @hapd: BSS data
- * @sta: peer STA data
- *
- * MLME calls this function as a result of the establishment of an
- * authentication relationship with a specific peer MAC entity that
- * resulted from an authentication procedure that was initiated by
- * that specific peer MAC entity.
- *
- * PeerSTAAddress = sta->addr
- * AuthenticationType = sta->auth_alg (WLAN_AUTH_OPEN / WLAN_AUTH_SHARED_KEY)
- */
-void mlme_authenticate_indication(struct hostapd_data *hapd,
- struct sta_info *sta)
-{
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
- HOSTAPD_LEVEL_DEBUG,
- "MLME-AUTHENTICATE.indication(" MACSTR ", %s)",
- MAC2STR(sta->addr), mlme_auth_alg_str(sta->auth_alg));
- if (sta->auth_alg != WLAN_AUTH_FT && !(sta->flags & WLAN_STA_MFP))
- mlme_deletekeys_request(hapd, sta);
-}
-
-
-/**
- * mlme_deauthenticate_indication - Report the invalidation of an
- * authentication relationship with a specific peer MAC entity
- * @hapd: BSS data
- * @sta: Peer STA data
- * @reason_code: ReasonCode from Deauthentication frame
- *
- * MLME calls this function as a result of the invalidation of an
- * authentication relationship with a specific peer MAC entity.
- *
- * PeerSTAAddress = sta->addr
- */
-void mlme_deauthenticate_indication(struct hostapd_data *hapd,
- struct sta_info *sta, u16 reason_code)
-{
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
- HOSTAPD_LEVEL_DEBUG,
- "MLME-DEAUTHENTICATE.indication(" MACSTR ", %d)",
- MAC2STR(sta->addr), reason_code);
- mlme_deletekeys_request(hapd, sta);
-}
-
-
-/**
- * mlme_associate_indication - Report the establishment of an association with
- * a specific peer MAC entity
- * @hapd: BSS data
- * @sta: peer STA data
- *
- * MLME calls this function as a result of the establishment of an
- * association with a specific peer MAC entity that resulted from an
- * association procedure that was initiated by that specific peer MAC entity.
- *
- * PeerSTAAddress = sta->addr
- */
-void mlme_associate_indication(struct hostapd_data *hapd, struct sta_info *sta)
-{
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
- HOSTAPD_LEVEL_DEBUG,
- "MLME-ASSOCIATE.indication(" MACSTR ")",
- MAC2STR(sta->addr));
- if (sta->auth_alg != WLAN_AUTH_FT)
- mlme_deletekeys_request(hapd, sta);
-}
-
-
-/**
- * mlme_reassociate_indication - Report the establishment of an reassociation
- * with a specific peer MAC entity
- * @hapd: BSS data
- * @sta: peer STA data
- *
- * MLME calls this function as a result of the establishment of an
- * reassociation with a specific peer MAC entity that resulted from a
- * reassociation procedure that was initiated by that specific peer MAC entity.
- *
- * PeerSTAAddress = sta->addr
- *
- * sta->previous_ap contains the "Current AP" information from ReassocReq.
- */
-void mlme_reassociate_indication(struct hostapd_data *hapd,
- struct sta_info *sta)
-{
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
- HOSTAPD_LEVEL_DEBUG,
- "MLME-REASSOCIATE.indication(" MACSTR ")",
- MAC2STR(sta->addr));
- if (sta->auth_alg != WLAN_AUTH_FT)
- mlme_deletekeys_request(hapd, sta);
-}
-
-
-/**
- * mlme_disassociate_indication - Report disassociation with a specific peer
- * MAC entity
- * @hapd: BSS data
- * @sta: Peer STA data
- * @reason_code: ReasonCode from Disassociation frame
- *
- * MLME calls this function as a result of the invalidation of an association
- * relationship with a specific peer MAC entity.
- *
- * PeerSTAAddress = sta->addr
- */
-void mlme_disassociate_indication(struct hostapd_data *hapd,
- struct sta_info *sta, u16 reason_code)
-{
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
- HOSTAPD_LEVEL_DEBUG,
- "MLME-DISASSOCIATE.indication(" MACSTR ", %d)",
- MAC2STR(sta->addr), reason_code);
- mlme_deletekeys_request(hapd, sta);
-}
-
-
-void mlme_michaelmicfailure_indication(struct hostapd_data *hapd,
- const u8 *addr)
-{
- hostapd_logger(hapd, addr, HOSTAPD_MODULE_MLME,
- HOSTAPD_LEVEL_DEBUG,
- "MLME-MichaelMICFailure.indication(" MACSTR ")",
- MAC2STR(addr));
-}
-
-
-void mlme_deletekeys_request(struct hostapd_data *hapd, struct sta_info *sta)
-{
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
- HOSTAPD_LEVEL_DEBUG,
- "MLME-DELETEKEYS.request(" MACSTR ")",
- MAC2STR(sta->addr));
-
- if (sta->wpa_sm)
- wpa_remove_ptk(sta->wpa_sm);
-}
diff --git a/hostapd-0.8/src/ap/ap_mlme.h b/hostapd-0.8/src/ap/ap_mlme.h
deleted file mode 100644
index c77a939..0000000
--- a/hostapd-0.8/src/ap/ap_mlme.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * hostapd / IEEE 802.11 MLME
- * Copyright 2003, Jouni Malinen
- * Copyright 2003-2004, Instant802 Networks, Inc.
- * Copyright 2005-2006, Devicescape Software, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef MLME_H
-#define MLME_H
-
-void mlme_authenticate_indication(struct hostapd_data *hapd,
- struct sta_info *sta);
-
-void mlme_deauthenticate_indication(struct hostapd_data *hapd,
- struct sta_info *sta, u16 reason_code);
-
-void mlme_associate_indication(struct hostapd_data *hapd,
- struct sta_info *sta);
-
-void mlme_reassociate_indication(struct hostapd_data *hapd,
- struct sta_info *sta);
-
-void mlme_disassociate_indication(struct hostapd_data *hapd,
- struct sta_info *sta, u16 reason_code);
-
-void mlme_michaelmicfailure_indication(struct hostapd_data *hapd,
- const u8 *addr);
-
-void mlme_deletekeys_request(struct hostapd_data *hapd, struct sta_info *sta);
-
-#endif /* MLME_H */
diff --git a/hostapd-0.8/src/ap/authsrv.c b/hostapd-0.8/src/ap/authsrv.c
deleted file mode 100644
index 7c87fde..0000000
--- a/hostapd-0.8/src/ap/authsrv.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Authentication server setup
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "crypto/tls.h"
-#include "eap_server/eap.h"
-#include "eap_server/eap_sim_db.h"
-#include "eapol_auth/eapol_auth_sm.h"
-#include "radius/radius_server.h"
-#include "hostapd.h"
-#include "ap_config.h"
-#include "sta_info.h"
-#include "authsrv.h"
-
-
-#if defined(EAP_SERVER_SIM) || defined(EAP_SERVER_AKA)
-#define EAP_SIM_DB
-#endif /* EAP_SERVER_SIM || EAP_SERVER_AKA */
-
-
-#ifdef EAP_SIM_DB
-static int hostapd_sim_db_cb_sta(struct hostapd_data *hapd,
- struct sta_info *sta, void *ctx)
-{
- if (eapol_auth_eap_pending_cb(sta->eapol_sm, ctx) == 0)
- return 1;
- return 0;
-}
-
-
-static void hostapd_sim_db_cb(void *ctx, void *session_ctx)
-{
- struct hostapd_data *hapd = ctx;
- if (ap_for_each_sta(hapd, hostapd_sim_db_cb_sta, session_ctx) == 0) {
-#ifdef RADIUS_SERVER
- radius_server_eap_pending_cb(hapd->radius_srv, session_ctx);
-#endif /* RADIUS_SERVER */
- }
-}
-#endif /* EAP_SIM_DB */
-
-
-#ifdef RADIUS_SERVER
-
-static int hostapd_radius_get_eap_user(void *ctx, const u8 *identity,
- size_t identity_len, int phase2,
- struct eap_user *user)
-{
- const struct hostapd_eap_user *eap_user;
- int i, count;
-
- eap_user = hostapd_get_eap_user(ctx, identity, identity_len, phase2);
- if (eap_user == NULL)
- return -1;
-
- if (user == NULL)
- return 0;
-
- os_memset(user, 0, sizeof(*user));
- count = EAP_USER_MAX_METHODS;
- if (count > EAP_MAX_METHODS)
- count = EAP_MAX_METHODS;
- for (i = 0; i < count; i++) {
- user->methods[i].vendor = eap_user->methods[i].vendor;
- user->methods[i].method = eap_user->methods[i].method;
- }
-
- if (eap_user->password) {
- user->password = os_malloc(eap_user->password_len);
- if (user->password == NULL)
- return -1;
- os_memcpy(user->password, eap_user->password,
- eap_user->password_len);
- user->password_len = eap_user->password_len;
- user->password_hash = eap_user->password_hash;
- }
- user->force_version = eap_user->force_version;
- user->ttls_auth = eap_user->ttls_auth;
-
- return 0;
-}
-
-
-static int hostapd_setup_radius_srv(struct hostapd_data *hapd)
-{
- struct radius_server_conf srv;
- struct hostapd_bss_config *conf = hapd->conf;
- os_memset(&srv, 0, sizeof(srv));
- srv.client_file = conf->radius_server_clients;
- srv.auth_port = conf->radius_server_auth_port;
- srv.conf_ctx = conf;
- srv.eap_sim_db_priv = hapd->eap_sim_db_priv;
- srv.ssl_ctx = hapd->ssl_ctx;
- srv.msg_ctx = hapd->msg_ctx;
- srv.pac_opaque_encr_key = conf->pac_opaque_encr_key;
- srv.eap_fast_a_id = conf->eap_fast_a_id;
- srv.eap_fast_a_id_len = conf->eap_fast_a_id_len;
- srv.eap_fast_a_id_info = conf->eap_fast_a_id_info;
- srv.eap_fast_prov = conf->eap_fast_prov;
- srv.pac_key_lifetime = conf->pac_key_lifetime;
- srv.pac_key_refresh_time = conf->pac_key_refresh_time;
- srv.eap_sim_aka_result_ind = conf->eap_sim_aka_result_ind;
- srv.tnc = conf->tnc;
- srv.wps = hapd->wps;
- srv.ipv6 = conf->radius_server_ipv6;
- srv.get_eap_user = hostapd_radius_get_eap_user;
- srv.eap_req_id_text = conf->eap_req_id_text;
- srv.eap_req_id_text_len = conf->eap_req_id_text_len;
- srv.pwd_group = conf->pwd_group;
-
- hapd->radius_srv = radius_server_init(&srv);
- if (hapd->radius_srv == NULL) {
- wpa_printf(MSG_ERROR, "RADIUS server initialization failed.");
- return -1;
- }
-
- return 0;
-}
-
-#endif /* RADIUS_SERVER */
-
-
-int authsrv_init(struct hostapd_data *hapd)
-{
-#ifdef EAP_TLS_FUNCS
- if (hapd->conf->eap_server &&
- (hapd->conf->ca_cert || hapd->conf->server_cert ||
- hapd->conf->dh_file)) {
- struct tls_connection_params params;
-
- hapd->ssl_ctx = tls_init(NULL);
- if (hapd->ssl_ctx == NULL) {
- wpa_printf(MSG_ERROR, "Failed to initialize TLS");
- authsrv_deinit(hapd);
- return -1;
- }
-
- os_memset(¶ms, 0, sizeof(params));
- params.ca_cert = hapd->conf->ca_cert;
- params.client_cert = hapd->conf->server_cert;
- params.private_key = hapd->conf->private_key;
- params.private_key_passwd = hapd->conf->private_key_passwd;
- params.dh_file = hapd->conf->dh_file;
-
- if (tls_global_set_params(hapd->ssl_ctx, ¶ms)) {
- wpa_printf(MSG_ERROR, "Failed to set TLS parameters");
- authsrv_deinit(hapd);
- return -1;
- }
-
- if (tls_global_set_verify(hapd->ssl_ctx,
- hapd->conf->check_crl)) {
- wpa_printf(MSG_ERROR, "Failed to enable check_crl");
- authsrv_deinit(hapd);
- return -1;
- }
- }
-#endif /* EAP_TLS_FUNCS */
-
-#ifdef EAP_SIM_DB
- if (hapd->conf->eap_sim_db) {
- hapd->eap_sim_db_priv =
- eap_sim_db_init(hapd->conf->eap_sim_db,
- hostapd_sim_db_cb, hapd);
- if (hapd->eap_sim_db_priv == NULL) {
- wpa_printf(MSG_ERROR, "Failed to initialize EAP-SIM "
- "database interface");
- authsrv_deinit(hapd);
- return -1;
- }
- }
-#endif /* EAP_SIM_DB */
-
-#ifdef RADIUS_SERVER
- if (hapd->conf->radius_server_clients &&
- hostapd_setup_radius_srv(hapd))
- return -1;
-#endif /* RADIUS_SERVER */
-
- return 0;
-}
-
-
-void authsrv_deinit(struct hostapd_data *hapd)
-{
-#ifdef RADIUS_SERVER
- radius_server_deinit(hapd->radius_srv);
- hapd->radius_srv = NULL;
-#endif /* RADIUS_SERVER */
-
-#ifdef EAP_TLS_FUNCS
- if (hapd->ssl_ctx) {
- tls_deinit(hapd->ssl_ctx);
- hapd->ssl_ctx = NULL;
- }
-#endif /* EAP_TLS_FUNCS */
-
-#ifdef EAP_SIM_DB
- if (hapd->eap_sim_db_priv) {
- eap_sim_db_deinit(hapd->eap_sim_db_priv);
- hapd->eap_sim_db_priv = NULL;
- }
-#endif /* EAP_SIM_DB */
-}
diff --git a/hostapd-0.8/src/ap/authsrv.h b/hostapd-0.8/src/ap/authsrv.h
deleted file mode 100644
index be3051e..0000000
--- a/hostapd-0.8/src/ap/authsrv.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Authentication server setup
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef AUTHSRV_H
-#define AUTHSRV_H
-
-int authsrv_init(struct hostapd_data *hapd);
-void authsrv_deinit(struct hostapd_data *hapd);
-
-#endif /* AUTHSRV_H */
diff --git a/hostapd-0.8/src/ap/beacon.c b/hostapd-0.8/src/ap/beacon.c
deleted file mode 100644
index 784f134..0000000
--- a/hostapd-0.8/src/ap/beacon.c
+++ /dev/null
@@ -1,540 +0,0 @@
-/*
- * hostapd / IEEE 802.11 Management: Beacon and Probe Request/Response
- * Copyright (c) 2002-2004, Instant802 Networks, Inc.
- * Copyright (c) 2005-2006, Devicescape Software, Inc.
- * Copyright (c) 2008-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#ifndef CONFIG_NATIVE_WINDOWS
-
-#include "utils/common.h"
-#include "common/ieee802_11_defs.h"
-#include "common/ieee802_11_common.h"
-#include "drivers/driver.h"
-#include "wps/wps_defs.h"
-#include "p2p/p2p.h"
-#include "hostapd.h"
-#include "ieee802_11.h"
-#include "wpa_auth.h"
-#include "wmm.h"
-#include "ap_config.h"
-#include "sta_info.h"
-#include "p2p_hostapd.h"
-#include "ap_drv_ops.h"
-#include "beacon.h"
-
-
-static u8 ieee802_11_erp_info(struct hostapd_data *hapd)
-{
- u8 erp = 0;
-
- if (hapd->iface->current_mode == NULL ||
- hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211G)
- return 0;
-
- switch (hapd->iconf->cts_protection_type) {
- case CTS_PROTECTION_FORCE_ENABLED:
- erp |= ERP_INFO_NON_ERP_PRESENT | ERP_INFO_USE_PROTECTION;
- break;
- case CTS_PROTECTION_FORCE_DISABLED:
- erp = 0;
- break;
- case CTS_PROTECTION_AUTOMATIC:
- if (hapd->iface->olbc)
- erp |= ERP_INFO_USE_PROTECTION;
- /* continue */
- case CTS_PROTECTION_AUTOMATIC_NO_OLBC:
- if (hapd->iface->num_sta_non_erp > 0) {
- erp |= ERP_INFO_NON_ERP_PRESENT |
- ERP_INFO_USE_PROTECTION;
- }
- break;
- }
- if (hapd->iface->num_sta_no_short_preamble > 0 ||
- hapd->iconf->preamble == LONG_PREAMBLE)
- erp |= ERP_INFO_BARKER_PREAMBLE_MODE;
-
- return erp;
-}
-
-
-static u8 * hostapd_eid_ds_params(struct hostapd_data *hapd, u8 *eid)
-{
- *eid++ = WLAN_EID_DS_PARAMS;
- *eid++ = 1;
- *eid++ = hapd->iconf->channel;
- return eid;
-}
-
-
-static u8 * hostapd_eid_erp_info(struct hostapd_data *hapd, u8 *eid)
-{
- if (hapd->iface->current_mode == NULL ||
- hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211G)
- return eid;
-
- /* Set NonERP_present and use_protection bits if there
- * are any associated NonERP stations. */
- /* TODO: use_protection bit can be set to zero even if
- * there are NonERP stations present. This optimization
- * might be useful if NonERP stations are "quiet".
- * See 802.11g/D6 E-1 for recommended practice.
- * In addition, Non ERP present might be set, if AP detects Non ERP
- * operation on other APs. */
-
- /* Add ERP Information element */
- *eid++ = WLAN_EID_ERP_INFO;
- *eid++ = 1;
- *eid++ = ieee802_11_erp_info(hapd);
-
- return eid;
-}
-
-
-static u8 * hostapd_eid_country_add(u8 *pos, u8 *end, int chan_spacing,
- struct hostapd_channel_data *start,
- struct hostapd_channel_data *prev)
-{
- if (end - pos < 3)
- return pos;
-
- /* first channel number */
- *pos++ = start->chan;
- /* number of channels */
- *pos++ = (prev->chan - start->chan) / chan_spacing + 1;
- /* maximum transmit power level */
- *pos++ = start->max_tx_power;
-
- return pos;
-}
-
-
-static u8 * hostapd_eid_country(struct hostapd_data *hapd, u8 *eid,
- int max_len)
-{
- u8 *pos = eid;
- u8 *end = eid + max_len;
- int i;
- struct hostapd_hw_modes *mode;
- struct hostapd_channel_data *start, *prev;
- int chan_spacing = 1;
-
- if (!hapd->iconf->ieee80211d || max_len < 6 ||
- hapd->iface->current_mode == NULL)
- return eid;
-
- *pos++ = WLAN_EID_COUNTRY;
- pos++; /* length will be set later */
- os_memcpy(pos, hapd->iconf->country, 3); /* e.g., 'US ' */
- pos += 3;
-
- mode = hapd->iface->current_mode;
- if (mode->mode == HOSTAPD_MODE_IEEE80211A)
- chan_spacing = 4;
-
- start = prev = NULL;
- for (i = 0; i < mode->num_channels; i++) {
- struct hostapd_channel_data *chan = &mode->channels[i];
- if (chan->flag & HOSTAPD_CHAN_DISABLED)
- continue;
- if (start && prev &&
- prev->chan + chan_spacing == chan->chan &&
- start->max_tx_power == chan->max_tx_power) {
- prev = chan;
- continue; /* can use same entry */
- }
-
- if (start) {
- pos = hostapd_eid_country_add(pos, end, chan_spacing,
- start, prev);
- start = NULL;
- }
-
- /* Start new group */
- start = prev = chan;
- }
-
- if (start) {
- pos = hostapd_eid_country_add(pos, end, chan_spacing,
- start, prev);
- }
-
- if ((pos - eid) & 1) {
- if (end - pos < 1)
- return eid;
- *pos++ = 0; /* pad for 16-bit alignment */
- }
-
- eid[1] = (pos - eid) - 2;
-
- return pos;
-}
-
-
-static u8 * hostapd_eid_wpa(struct hostapd_data *hapd, u8 *eid, size_t len,
- struct sta_info *sta)
-{
- const u8 *ie;
- size_t ielen;
-
- ie = wpa_auth_get_wpa_ie(hapd->wpa_auth, &ielen);
- if (ie == NULL || ielen > len)
- return eid;
-
- os_memcpy(eid, ie, ielen);
- return eid + ielen;
-}
-
-
-void handle_probe_req(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt, size_t len)
-{
- struct ieee80211_mgmt *resp;
- struct ieee802_11_elems elems;
- char *ssid;
- u8 *pos, *epos;
- const u8 *ie;
- size_t ssid_len, ie_len;
- struct sta_info *sta = NULL;
- size_t buflen;
- size_t i;
-
- ie = mgmt->u.probe_req.variable;
- if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req))
- return;
- ie_len = len - (IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req));
-
- for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++)
- if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx,
- mgmt->sa, ie, ie_len) > 0)
- return;
-
- if (!hapd->iconf->send_probe_response)
- return;
-
- if (ieee802_11_parse_elems(ie, ie_len, &elems, 0) == ParseFailed) {
- wpa_printf(MSG_DEBUG, "Could not parse ProbeReq from " MACSTR,
- MAC2STR(mgmt->sa));
- return;
- }
-
- ssid = NULL;
- ssid_len = 0;
-
- if ((!elems.ssid || !elems.supp_rates)) {
- wpa_printf(MSG_DEBUG, "STA " MACSTR " sent probe request "
- "without SSID or supported rates element",
- MAC2STR(mgmt->sa));
- return;
- }
-
-#ifdef CONFIG_P2P
- if (hapd->p2p && elems.wps_ie) {
- struct wpabuf *wps;
- wps = ieee802_11_vendor_ie_concat(ie, ie_len, WPS_DEV_OUI_WFA);
- if (wps && !p2p_group_match_dev_type(hapd->p2p_group, wps)) {
- wpa_printf(MSG_MSGDUMP, "P2P: Ignore Probe Request "
- "due to mismatch with Requested Device "
- "Type");
- wpabuf_free(wps);
- return;
- }
- wpabuf_free(wps);
- }
-#endif /* CONFIG_P2P */
-
- if (hapd->conf->ignore_broadcast_ssid && elems.ssid_len == 0) {
- wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR " for "
- "broadcast SSID ignored", MAC2STR(mgmt->sa));
- return;
- }
-
- sta = ap_get_sta(hapd, mgmt->sa);
-
-#ifdef CONFIG_P2P
- if ((hapd->conf->p2p & P2P_GROUP_OWNER) &&
- elems.ssid_len == P2P_WILDCARD_SSID_LEN &&
- os_memcmp(elems.ssid, P2P_WILDCARD_SSID,
- P2P_WILDCARD_SSID_LEN) == 0) {
- /* Process P2P Wildcard SSID like Wildcard SSID */
- elems.ssid_len = 0;
- }
-#endif /* CONFIG_P2P */
-
- if (elems.ssid_len == 0 ||
- (elems.ssid_len == hapd->conf->ssid.ssid_len &&
- os_memcmp(elems.ssid, hapd->conf->ssid.ssid, elems.ssid_len) ==
- 0)) {
- ssid = hapd->conf->ssid.ssid;
- ssid_len = hapd->conf->ssid.ssid_len;
- if (sta)
- sta->ssid_probe = &hapd->conf->ssid;
- }
-
- if (!ssid) {
- if (!(mgmt->da[0] & 0x01)) {
- char ssid_txt[33];
- ieee802_11_print_ssid(ssid_txt, elems.ssid,
- elems.ssid_len);
- wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR
- " for foreign SSID '%s' (DA " MACSTR ")",
- MAC2STR(mgmt->sa), ssid_txt,
- MAC2STR(mgmt->da));
- }
- return;
- }
-
- /* TODO: verify that supp_rates contains at least one matching rate
- * with AP configuration */
-#define MAX_PROBERESP_LEN 768
- buflen = MAX_PROBERESP_LEN;
-#ifdef CONFIG_WPS
- if (hapd->wps_probe_resp_ie)
- buflen += wpabuf_len(hapd->wps_probe_resp_ie);
-#endif /* CONFIG_WPS */
-#ifdef CONFIG_P2P
- if (hapd->p2p_probe_resp_ie)
- buflen += wpabuf_len(hapd->p2p_probe_resp_ie);
-#endif /* CONFIG_P2P */
- resp = os_zalloc(buflen);
- if (resp == NULL)
- return;
- epos = ((u8 *) resp) + MAX_PROBERESP_LEN;
-
- resp->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
- WLAN_FC_STYPE_PROBE_RESP);
- os_memcpy(resp->da, mgmt->sa, ETH_ALEN);
- os_memcpy(resp->sa, hapd->own_addr, ETH_ALEN);
-
- os_memcpy(resp->bssid, hapd->own_addr, ETH_ALEN);
- resp->u.probe_resp.beacon_int =
- host_to_le16(hapd->iconf->beacon_int);
-
- /* hardware or low-level driver will setup seq_ctrl and timestamp */
- resp->u.probe_resp.capab_info =
- host_to_le16(hostapd_own_capab_info(hapd, sta, 1));
-
- pos = resp->u.probe_resp.variable;
- *pos++ = WLAN_EID_SSID;
- *pos++ = ssid_len;
- os_memcpy(pos, ssid, ssid_len);
- pos += ssid_len;
-
- /* Supported rates */
- pos = hostapd_eid_supp_rates(hapd, pos);
-
- /* DS Params */
- pos = hostapd_eid_ds_params(hapd, pos);
-
- pos = hostapd_eid_country(hapd, pos, epos - pos);
-
- /* ERP Information element */
- pos = hostapd_eid_erp_info(hapd, pos);
-
- /* Extended supported rates */
- pos = hostapd_eid_ext_supp_rates(hapd, pos);
-
- /* RSN, MDIE, WPA */
- pos = hostapd_eid_wpa(hapd, pos, epos - pos, sta);
-
-#ifdef CONFIG_IEEE80211N
- pos = hostapd_eid_ht_capabilities(hapd, pos);
- pos = hostapd_eid_ht_operation(hapd, pos);
-#endif /* CONFIG_IEEE80211N */
-
- pos = hostapd_eid_ext_capab(hapd, pos);
-
- /* Wi-Fi Alliance WMM */
- pos = hostapd_eid_wmm(hapd, pos);
-
-#ifdef CONFIG_WPS
- if (hapd->conf->wps_state && hapd->wps_probe_resp_ie) {
- os_memcpy(pos, wpabuf_head(hapd->wps_probe_resp_ie),
- wpabuf_len(hapd->wps_probe_resp_ie));
- pos += wpabuf_len(hapd->wps_probe_resp_ie);
- }
-#endif /* CONFIG_WPS */
-
-#ifdef CONFIG_P2P
- if ((hapd->conf->p2p & P2P_ENABLED) && elems.p2p &&
- hapd->p2p_probe_resp_ie) {
- os_memcpy(pos, wpabuf_head(hapd->p2p_probe_resp_ie),
- wpabuf_len(hapd->p2p_probe_resp_ie));
- pos += wpabuf_len(hapd->p2p_probe_resp_ie);
- }
-#endif /* CONFIG_P2P */
-#ifdef CONFIG_P2P_MANAGER
- if ((hapd->conf->p2p & (P2P_MANAGE | P2P_ENABLED | P2P_GROUP_OWNER)) ==
- P2P_MANAGE)
- pos = hostapd_eid_p2p_manage(hapd, pos);
-#endif /* CONFIG_P2P_MANAGER */
-
- if (hostapd_drv_send_mlme(hapd, resp, pos - (u8 *) resp) < 0)
- perror("handle_probe_req: send");
-
- os_free(resp);
-
- wpa_printf(MSG_EXCESSIVE, "STA " MACSTR " sent probe request for %s "
- "SSID", MAC2STR(mgmt->sa),
- elems.ssid_len == 0 ? "broadcast" : "our");
-}
-
-
-void ieee802_11_set_beacon(struct hostapd_data *hapd)
-{
- struct ieee80211_mgmt *head;
- u8 *pos, *tail, *tailpos;
- u16 capab_info;
- size_t head_len, tail_len;
-
-#ifdef CONFIG_P2P
- if ((hapd->conf->p2p & (P2P_ENABLED | P2P_GROUP_OWNER)) == P2P_ENABLED)
- goto no_beacon;
-#endif /* CONFIG_P2P */
-
-#define BEACON_HEAD_BUF_SIZE 256
-#define BEACON_TAIL_BUF_SIZE 512
- head = os_zalloc(BEACON_HEAD_BUF_SIZE);
- tail_len = BEACON_TAIL_BUF_SIZE;
-#ifdef CONFIG_WPS
- if (hapd->conf->wps_state && hapd->wps_beacon_ie)
- tail_len += wpabuf_len(hapd->wps_beacon_ie);
-#endif /* CONFIG_WPS */
-#ifdef CONFIG_P2P
- if (hapd->p2p_beacon_ie)
- tail_len += wpabuf_len(hapd->p2p_beacon_ie);
-#endif /* CONFIG_P2P */
- tailpos = tail = os_malloc(tail_len);
- if (head == NULL || tail == NULL) {
- wpa_printf(MSG_ERROR, "Failed to set beacon data");
- os_free(head);
- os_free(tail);
- return;
- }
-
- head->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
- WLAN_FC_STYPE_BEACON);
- head->duration = host_to_le16(0);
- os_memset(head->da, 0xff, ETH_ALEN);
-
- os_memcpy(head->sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(head->bssid, hapd->own_addr, ETH_ALEN);
- head->u.beacon.beacon_int =
- host_to_le16(hapd->iconf->beacon_int);
-
- /* hardware or low-level driver will setup seq_ctrl and timestamp */
- capab_info = hostapd_own_capab_info(hapd, NULL, 0);
- head->u.beacon.capab_info = host_to_le16(capab_info);
- pos = &head->u.beacon.variable[0];
-
- /* SSID */
- *pos++ = WLAN_EID_SSID;
- if (hapd->conf->ignore_broadcast_ssid == 2) {
- /* clear the data, but keep the correct length of the SSID */
- *pos++ = hapd->conf->ssid.ssid_len;
- os_memset(pos, 0, hapd->conf->ssid.ssid_len);
- pos += hapd->conf->ssid.ssid_len;
- } else if (hapd->conf->ignore_broadcast_ssid) {
- *pos++ = 0; /* empty SSID */
- } else {
- *pos++ = hapd->conf->ssid.ssid_len;
- os_memcpy(pos, hapd->conf->ssid.ssid,
- hapd->conf->ssid.ssid_len);
- pos += hapd->conf->ssid.ssid_len;
- }
-
- /* Supported rates */
- pos = hostapd_eid_supp_rates(hapd, pos);
-
- /* DS Params */
- pos = hostapd_eid_ds_params(hapd, pos);
-
- head_len = pos - (u8 *) head;
-
- tailpos = hostapd_eid_country(hapd, tailpos,
- tail + BEACON_TAIL_BUF_SIZE - tailpos);
-
- /* ERP Information element */
- tailpos = hostapd_eid_erp_info(hapd, tailpos);
-
- /* Extended supported rates */
- tailpos = hostapd_eid_ext_supp_rates(hapd, tailpos);
-
- /* RSN, MDIE, WPA */
- tailpos = hostapd_eid_wpa(hapd, tailpos, tail + BEACON_TAIL_BUF_SIZE -
- tailpos, NULL);
-
-#ifdef CONFIG_IEEE80211N
- tailpos = hostapd_eid_ht_capabilities(hapd, tailpos);
- tailpos = hostapd_eid_ht_operation(hapd, tailpos);
-
- //DRIVER_RTW ADD
- if(hapd->iconf->ieee80211n)
- hapd->conf->wmm_enabled = 1;
-
-#endif /* CONFIG_IEEE80211N */
-
- tailpos = hostapd_eid_ext_capab(hapd, tailpos);
-
- /* Wi-Fi Alliance WMM */
- tailpos = hostapd_eid_wmm(hapd, tailpos);
-
-#ifdef CONFIG_WPS
- if (hapd->conf->wps_state && hapd->wps_beacon_ie) {
- os_memcpy(tailpos, wpabuf_head(hapd->wps_beacon_ie),
- wpabuf_len(hapd->wps_beacon_ie));
- tailpos += wpabuf_len(hapd->wps_beacon_ie);
- }
-#endif /* CONFIG_WPS */
-
-#ifdef CONFIG_P2P
- if ((hapd->conf->p2p & P2P_ENABLED) && hapd->p2p_beacon_ie) {
- os_memcpy(tailpos, wpabuf_head(hapd->p2p_beacon_ie),
- wpabuf_len(hapd->p2p_beacon_ie));
- tailpos += wpabuf_len(hapd->p2p_beacon_ie);
- }
-#endif /* CONFIG_P2P */
-#ifdef CONFIG_P2P_MANAGER
- if ((hapd->conf->p2p & (P2P_MANAGE | P2P_ENABLED | P2P_GROUP_OWNER)) ==
- P2P_MANAGE)
- tailpos = hostapd_eid_p2p_manage(hapd, tailpos);
-#endif /* CONFIG_P2P_MANAGER */
-
- tail_len = tailpos > tail ? tailpos - tail : 0;
-
- if (hostapd_drv_set_beacon(hapd, (u8 *) head, head_len,
- tail, tail_len, hapd->conf->dtim_period,
- hapd->iconf->beacon_int))
- wpa_printf(MSG_ERROR, "Failed to set beacon head/tail or DTIM "
- "period");
-
- os_free(tail);
- os_free(head);
-
-#ifdef CONFIG_P2P
-no_beacon:
-#endif /* CONFIG_P2P */
- hostapd_set_bss_params(hapd, !!(ieee802_11_erp_info(hapd) &
- ERP_INFO_USE_PROTECTION));
-}
-
-
-void ieee802_11_set_beacons(struct hostapd_iface *iface)
-{
- size_t i;
- for (i = 0; i < iface->num_bss; i++)
- ieee802_11_set_beacon(iface->bss[i]);
-}
-
-#endif /* CONFIG_NATIVE_WINDOWS */
diff --git a/hostapd-0.8/src/ap/beacon.h b/hostapd-0.8/src/ap/beacon.h
deleted file mode 100644
index c1510e1..0000000
--- a/hostapd-0.8/src/ap/beacon.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * hostapd / IEEE 802.11 Management: Beacon and Probe Request/Response
- * Copyright (c) 2002-2004, Instant802 Networks, Inc.
- * Copyright (c) 2005-2006, Devicescape Software, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef BEACON_H
-#define BEACON_H
-
-struct ieee80211_mgmt;
-
-void handle_probe_req(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt, size_t len);
-#ifdef NEED_AP_MLME
-void ieee802_11_set_beacon(struct hostapd_data *hapd);
-void ieee802_11_set_beacons(struct hostapd_iface *iface);
-#else /* NEED_AP_MLME */
-static inline void ieee802_11_set_beacon(struct hostapd_data *hapd)
-{
-}
-
-static inline void ieee802_11_set_beacons(struct hostapd_iface *iface)
-{
-}
-#endif /* NEED_AP_MLME */
-
-#endif /* BEACON_H */
diff --git a/hostapd-0.8/src/ap/ctrl_iface_ap.c b/hostapd-0.8/src/ap/ctrl_iface_ap.c
deleted file mode 100644
index d348dc1..0000000
--- a/hostapd-0.8/src/ap/ctrl_iface_ap.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Control interface for shared AP commands
- * Copyright (c) 2004-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "hostapd.h"
-#include "ieee802_1x.h"
-#include "wpa_auth.h"
-#include "ieee802_11.h"
-#include "sta_info.h"
-#include "wps_hostapd.h"
-#include "p2p_hostapd.h"
-#include "ctrl_iface_ap.h"
-
-
-static int hostapd_ctrl_iface_sta_mib(struct hostapd_data *hapd,
- struct sta_info *sta,
- char *buf, size_t buflen)
-{
- int len, res, ret;
-
- if (sta == NULL) {
- ret = os_snprintf(buf, buflen, "FAIL\n");
- if (ret < 0 || (size_t) ret >= buflen)
- return 0;
- return ret;
- }
-
- len = 0;
- ret = os_snprintf(buf + len, buflen - len, MACSTR "\n",
- MAC2STR(sta->addr));
- if (ret < 0 || (size_t) ret >= buflen - len)
- return len;
- len += ret;
-
- res = ieee802_11_get_mib_sta(hapd, sta, buf + len, buflen - len);
- if (res >= 0)
- len += res;
- res = wpa_get_mib_sta(sta->wpa_sm, buf + len, buflen - len);
- if (res >= 0)
- len += res;
- res = ieee802_1x_get_mib_sta(hapd, sta, buf + len, buflen - len);
- if (res >= 0)
- len += res;
- res = hostapd_wps_get_mib_sta(hapd, sta->addr, buf + len,
- buflen - len);
- if (res >= 0)
- len += res;
- res = hostapd_p2p_get_mib_sta(hapd, sta, buf + len, buflen - len);
- if (res >= 0)
- len += res;
-
- return len;
-}
-
-
-int hostapd_ctrl_iface_sta_first(struct hostapd_data *hapd,
- char *buf, size_t buflen)
-{
- return hostapd_ctrl_iface_sta_mib(hapd, hapd->sta_list, buf, buflen);
-}
-
-
-int hostapd_ctrl_iface_sta(struct hostapd_data *hapd, const char *txtaddr,
- char *buf, size_t buflen)
-{
- u8 addr[ETH_ALEN];
- int ret;
-
- if (hwaddr_aton(txtaddr, addr)) {
- ret = os_snprintf(buf, buflen, "FAIL\n");
- if (ret < 0 || (size_t) ret >= buflen)
- return 0;
- return ret;
- }
- return hostapd_ctrl_iface_sta_mib(hapd, ap_get_sta(hapd, addr),
- buf, buflen);
-}
-
-
-int hostapd_ctrl_iface_sta_next(struct hostapd_data *hapd, const char *txtaddr,
- char *buf, size_t buflen)
-{
- u8 addr[ETH_ALEN];
- struct sta_info *sta;
- int ret;
-
- if (hwaddr_aton(txtaddr, addr) ||
- (sta = ap_get_sta(hapd, addr)) == NULL) {
- ret = os_snprintf(buf, buflen, "FAIL\n");
- if (ret < 0 || (size_t) ret >= buflen)
- return 0;
- return ret;
- }
- return hostapd_ctrl_iface_sta_mib(hapd, sta->next, buf, buflen);
-}
diff --git a/hostapd-0.8/src/ap/ctrl_iface_ap.h b/hostapd-0.8/src/ap/ctrl_iface_ap.h
deleted file mode 100644
index 8690bea..0000000
--- a/hostapd-0.8/src/ap/ctrl_iface_ap.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Control interface for shared AP commands
- * Copyright (c) 2004-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef CTRL_IFACE_AP_H
-#define CTRL_IFACE_AP_H
-
-int hostapd_ctrl_iface_sta_first(struct hostapd_data *hapd,
- char *buf, size_t buflen);
-int hostapd_ctrl_iface_sta(struct hostapd_data *hapd, const char *txtaddr,
- char *buf, size_t buflen);
-int hostapd_ctrl_iface_sta_next(struct hostapd_data *hapd, const char *txtaddr,
- char *buf, size_t buflen);
-
-#endif /* CTRL_IFACE_AP_H */
diff --git a/hostapd-0.8/src/ap/drv_callbacks.c b/hostapd-0.8/src/ap/drv_callbacks.c
deleted file mode 100644
index 02b7ecf..0000000
--- a/hostapd-0.8/src/ap/drv_callbacks.c
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- * hostapd / Callback functions for driver wrappers
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "radius/radius.h"
-#include "drivers/driver.h"
-#include "common/ieee802_11_defs.h"
-#include "common/ieee802_11_common.h"
-#include "common/wpa_ctrl.h"
-#include "crypto/random.h"
-#include "p2p/p2p.h"
-#include "wps/wps.h"
-#include "hostapd.h"
-#include "ieee802_11.h"
-#include "sta_info.h"
-#include "accounting.h"
-#include "tkip_countermeasures.h"
-#include "iapp.h"
-#include "ieee802_1x.h"
-#include "wpa_auth.h"
-#include "wmm.h"
-#include "wps_hostapd.h"
-#include "ap_drv_ops.h"
-#include "ap_config.h"
-
-
-int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
- const u8 *ie, size_t ielen, int reassoc)
-{
- struct sta_info *sta;
- int new_assoc, res;
- struct ieee802_11_elems elems;
-#ifdef CONFIG_P2P
- const u8 *all_ies = ie;
- size_t all_ies_len = ielen;
-#endif /* CONFIG_P2P */
-
- if (addr == NULL) {
- /*
- * This could potentially happen with unexpected event from the
- * driver wrapper. This was seen at least in one case where the
- * driver ended up being set to station mode while hostapd was
- * running, so better make sure we stop processing such an
- * event here.
- */
- wpa_printf(MSG_DEBUG, "hostapd_notif_assoc: Skip event with "
- "no address");
- return -1;
- }
- random_add_randomness(addr, ETH_ALEN);
-
- hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "associated");
-
- ieee802_11_parse_elems(ie, ielen, &elems, 0);
- if (elems.wps_ie) {
- ie = elems.wps_ie - 2;
- ielen = elems.wps_ie_len + 2;
- wpa_printf(MSG_DEBUG, "STA included WPS IE in (Re)AssocReq");
- } else if (elems.rsn_ie) {
- ie = elems.rsn_ie - 2;
- ielen = elems.rsn_ie_len + 2;
- wpa_printf(MSG_DEBUG, "STA included RSN IE in (Re)AssocReq");
- } else if (elems.wpa_ie) {
- ie = elems.wpa_ie - 2;
- ielen = elems.wpa_ie_len + 2;
- wpa_printf(MSG_DEBUG, "STA included WPA IE in (Re)AssocReq");
- } else {
- ie = NULL;
- ielen = 0;
- wpa_printf(MSG_DEBUG, "STA did not include WPS/RSN/WPA IE in "
- "(Re)AssocReq");
- }
-
- sta = ap_get_sta(hapd, addr);
- if (sta) {
- accounting_sta_stop(hapd, sta);
- } else {
- sta = ap_sta_add(hapd, addr);
- if (sta == NULL)
- return -1;
- }
- sta->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS);
-
-#ifdef CONFIG_P2P
- if (elems.p2p) {
- wpabuf_free(sta->p2p_ie);
- sta->p2p_ie = ieee802_11_vendor_ie_concat(all_ies, all_ies_len,
- P2P_IE_VENDOR_TYPE);
- }
-#endif /* CONFIG_P2P */
-
- if (hapd->conf->wpa) {
- if (ie == NULL || ielen == 0) {
- if (hapd->conf->wps_state) {
- wpa_printf(MSG_DEBUG, "STA did not include "
- "WPA/RSN IE in (Re)Association "
- "Request - possible WPS use");
- sta->flags |= WLAN_STA_MAYBE_WPS;
- goto skip_wpa_check;
- }
-
- wpa_printf(MSG_DEBUG, "No WPA/RSN IE from STA");
- return -1;
- }
- if (hapd->conf->wps_state && ie[0] == 0xdd && ie[1] >= 4 &&
- os_memcmp(ie + 2, "\x00\x50\xf2\x04", 4) == 0) {
- sta->flags |= WLAN_STA_WPS;
- goto skip_wpa_check;
- }
-
- if (sta->wpa_sm == NULL)
- sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth,
- sta->addr);
- if (sta->wpa_sm == NULL) {
- wpa_printf(MSG_ERROR, "Failed to initialize WPA state "
- "machine");
- return -1;
- }
- res = wpa_validate_wpa_ie(hapd->wpa_auth, sta->wpa_sm,
- ie, ielen, NULL, 0);
- if (res != WPA_IE_OK) {
- int resp;
- wpa_printf(MSG_DEBUG, "WPA/RSN information element "
- "rejected? (res %u)", res);
- wpa_hexdump(MSG_DEBUG, "IE", ie, ielen);
- if (res == WPA_INVALID_GROUP)
- resp = WLAN_REASON_GROUP_CIPHER_NOT_VALID;
- else if (res == WPA_INVALID_PAIRWISE)
- resp = WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID;
- else if (res == WPA_INVALID_AKMP)
- resp = WLAN_REASON_AKMP_NOT_VALID;
-#ifdef CONFIG_IEEE80211W
- else if (res == WPA_MGMT_FRAME_PROTECTION_VIOLATION)
- resp = WLAN_REASON_INVALID_IE;
- else if (res == WPA_INVALID_MGMT_GROUP_CIPHER)
- resp = WLAN_REASON_GROUP_CIPHER_NOT_VALID;
-#endif /* CONFIG_IEEE80211W */
- else
- resp = WLAN_REASON_INVALID_IE;
- hostapd_drv_sta_disassoc(hapd, sta->addr, resp);
- ap_free_sta(hapd, sta);
- return -1;
- }
- } else if (hapd->conf->wps_state) {
-#ifdef CONFIG_WPS_STRICT
- if (ie) {
- struct wpabuf *wps;
- wps = ieee802_11_vendor_ie_concat(ie, ielen,
- WPS_IE_VENDOR_TYPE);
- if (wps && wps_validate_assoc_req(wps) < 0) {
- hostapd_drv_sta_disassoc(
- hapd, sta->addr,
- WLAN_REASON_INVALID_IE);
- ap_free_sta(hapd, sta);
- wpabuf_free(wps);
- return -1;
- }
- wpabuf_free(wps);
- }
-#endif /* CONFIG_WPS_STRICT */
- if (ie && ielen > 4 && ie[0] == 0xdd && ie[1] >= 4 &&
- os_memcmp(ie + 2, "\x00\x50\xf2\x04", 4) == 0) {
- sta->flags |= WLAN_STA_WPS;
- } else
- sta->flags |= WLAN_STA_MAYBE_WPS;
- }
-skip_wpa_check:
-
- new_assoc = (sta->flags & WLAN_STA_ASSOC) == 0;
- sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC;
- wpa_auth_sm_event(sta->wpa_sm, WPA_ASSOC);
-
- hostapd_new_assoc_sta(hapd, sta, !new_assoc);
-
- ieee802_1x_notify_port_enabled(sta->eapol_sm, 1);
-
-#ifdef CONFIG_P2P
- p2p_group_notif_assoc(hapd->p2p_group, sta->addr,
- all_ies, all_ies_len);
-#endif /* CONFIG_P2P */
-
- return 0;
-}
-
-
-void hostapd_notif_disassoc(struct hostapd_data *hapd, const u8 *addr)
-{
- struct sta_info *sta;
-
- if (addr == NULL) {
- /*
- * This could potentially happen with unexpected event from the
- * driver wrapper. This was seen at least in one case where the
- * driver ended up reporting a station mode event while hostapd
- * was running, so better make sure we stop processing such an
- * event here.
- */
- wpa_printf(MSG_DEBUG, "hostapd_notif_disassoc: Skip event "
- "with no address");
- return;
- }
-
- hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "disassociated");
-
- sta = ap_get_sta(hapd, addr);
- if (sta == NULL) {
- wpa_printf(MSG_DEBUG, "Disassociation notification for "
- "unknown STA " MACSTR, MAC2STR(addr));
- return;
- }
-
- sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC);
- wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_DISCONNECTED MACSTR,
- MAC2STR(sta->addr));
- wpa_auth_sm_event(sta->wpa_sm, WPA_DISASSOC);
- sta->acct_terminate_cause = RADIUS_ACCT_TERMINATE_CAUSE_USER_REQUEST;
- ieee802_1x_notify_port_enabled(sta->eapol_sm, 0);
- ap_free_sta(hapd, sta);
-}
-
-
-void hostapd_event_sta_low_ack(struct hostapd_data *hapd, const u8 *addr)
-{
- struct sta_info *sta = ap_get_sta(hapd, addr);
-
- if (!sta || !hapd->conf->disassoc_low_ack)
- return;
-
- hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "disconnected due to excessive "
- "missing ACKs");
- hostapd_drv_sta_disassoc(hapd, addr, WLAN_REASON_DISASSOC_LOW_ACK);
- if (sta)
- ap_sta_disassociate(hapd, sta, WLAN_REASON_DISASSOC_LOW_ACK);
-}
-
-
-int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa,
- const u8 *ie, size_t ie_len)
-{
- size_t i;
- int ret = 0;
-
- if (sa == NULL || ie == NULL)
- return -1;
-
- random_add_randomness(sa, ETH_ALEN);
- for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++) {
- if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx,
- sa, ie, ie_len) > 0) {
- ret = 1;
- break;
- }
- }
- return ret;
-}
-
-
-#ifdef HOSTAPD
-
-#ifdef NEED_AP_MLME
-
-static const u8 * get_hdr_bssid(const struct ieee80211_hdr *hdr, size_t len)
-{
- u16 fc, type, stype;
-
- /*
- * PS-Poll frames are 16 bytes. All other frames are
- * 24 bytes or longer.
- */
- if (len < 16)
- return NULL;
-
- fc = le_to_host16(hdr->frame_control);
- type = WLAN_FC_GET_TYPE(fc);
- stype = WLAN_FC_GET_STYPE(fc);
-
- switch (type) {
- case WLAN_FC_TYPE_DATA:
- if (len < 24)
- return NULL;
- switch (fc & (WLAN_FC_FROMDS | WLAN_FC_TODS)) {
- case WLAN_FC_FROMDS | WLAN_FC_TODS:
- case WLAN_FC_TODS:
- return hdr->addr1;
- case WLAN_FC_FROMDS:
- return hdr->addr2;
- default:
- return NULL;
- }
- case WLAN_FC_TYPE_CTRL:
- if (stype != WLAN_FC_STYPE_PSPOLL)
- return NULL;
- return hdr->addr1;
- case WLAN_FC_TYPE_MGMT:
- return hdr->addr3;
- default:
- return NULL;
- }
-}
-
-
-#define HAPD_BROADCAST ((struct hostapd_data *) -1)
-
-static struct hostapd_data * get_hapd_bssid(struct hostapd_iface *iface,
- const u8 *bssid)
-{
- size_t i;
-
- if (bssid == NULL)
- return NULL;
- if (bssid[0] == 0xff && bssid[1] == 0xff && bssid[2] == 0xff &&
- bssid[3] == 0xff && bssid[4] == 0xff && bssid[5] == 0xff)
- return HAPD_BROADCAST;
-
- for (i = 0; i < iface->num_bss; i++) {
- if (os_memcmp(bssid, iface->bss[i]->own_addr, ETH_ALEN) == 0)
- return iface->bss[i];
- }
-
- return NULL;
-}
-
-
-static void hostapd_rx_from_unknown_sta(struct hostapd_data *hapd,
- const u8 *frame, size_t len)
-{
- const struct ieee80211_hdr *hdr = (const struct ieee80211_hdr *) frame;
- u16 fc = le_to_host16(hdr->frame_control);
- hapd = get_hapd_bssid(hapd->iface, get_hdr_bssid(hdr, len));
- if (hapd == NULL || hapd == HAPD_BROADCAST)
- return;
-
- ieee802_11_rx_from_unknown(hapd, hdr->addr2,
- (fc & (WLAN_FC_TODS | WLAN_FC_FROMDS)) ==
- (WLAN_FC_TODS | WLAN_FC_FROMDS));
-}
-
-
-static void hostapd_mgmt_rx(struct hostapd_data *hapd, struct rx_mgmt *rx_mgmt)
-{
- struct hostapd_iface *iface = hapd->iface;
- const struct ieee80211_hdr *hdr;
- const u8 *bssid;
- struct hostapd_frame_info fi;
-
- hdr = (const struct ieee80211_hdr *) rx_mgmt->frame;
- bssid = get_hdr_bssid(hdr, rx_mgmt->frame_len);
- if (bssid == NULL)
- return;
-
- hapd = get_hapd_bssid(iface, bssid);
- if (hapd == NULL) {
- u16 fc;
- fc = le_to_host16(hdr->frame_control);
-
- /*
- * Drop frames to unknown BSSIDs except for Beacon frames which
- * could be used to update neighbor information.
- */
- if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
- WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_BEACON)
- hapd = iface->bss[0];
- else
- return;
- }
-
- os_memset(&fi, 0, sizeof(fi));
- fi.datarate = rx_mgmt->datarate;
- fi.ssi_signal = rx_mgmt->ssi_signal;
-
- if (hapd == HAPD_BROADCAST) {
- size_t i;
- for (i = 0; i < iface->num_bss; i++)
- ieee802_11_mgmt(iface->bss[i], rx_mgmt->frame,
- rx_mgmt->frame_len, &fi);
- } else
- ieee802_11_mgmt(hapd, rx_mgmt->frame, rx_mgmt->frame_len, &fi);
-
- random_add_randomness(&fi, sizeof(fi));
-}
-
-
-static void hostapd_mgmt_tx_cb(struct hostapd_data *hapd, const u8 *buf,
- size_t len, u16 stype, int ok)
-{
- struct ieee80211_hdr *hdr;
- hdr = (struct ieee80211_hdr *) buf;
- hapd = get_hapd_bssid(hapd->iface, get_hdr_bssid(hdr, len));
- if (hapd == NULL || hapd == HAPD_BROADCAST)
- return;
- ieee802_11_mgmt_cb(hapd, buf, len, stype, ok);
-}
-
-#endif /* NEED_AP_MLME */
-
-
-static int hostapd_event_new_sta(struct hostapd_data *hapd, const u8 *addr)
-{
- struct sta_info *sta = ap_get_sta(hapd, addr);
- if (sta)
- return 0;
-
- wpa_printf(MSG_DEBUG, "Data frame from unknown STA " MACSTR
- " - adding a new STA", MAC2STR(addr));
- sta = ap_sta_add(hapd, addr);
- if (sta) {
- hostapd_new_assoc_sta(hapd, sta, 0);
- } else {
- wpa_printf(MSG_DEBUG, "Failed to add STA entry for " MACSTR,
- MAC2STR(addr));
- return -1;
- }
-
- return 0;
-}
-
-
-static void hostapd_event_eapol_rx(struct hostapd_data *hapd, const u8 *src,
- const u8 *data, size_t data_len)
-{
- struct hostapd_iface *iface = hapd->iface;
- size_t j;
-
- for (j = 0; j < iface->num_bss; j++) {
- if (ap_get_sta(iface->bss[j], src)) {
- hapd = iface->bss[j];
- break;
- }
- }
-
- ieee802_1x_receive(hapd, src, data, data_len);
-}
-
-
-void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
- union wpa_event_data *data)
-{
- struct hostapd_data *hapd = ctx;
-
- switch (event) {
- case EVENT_MICHAEL_MIC_FAILURE:
- michael_mic_failure(hapd, data->michael_mic_failure.src, 1);
- break;
- case EVENT_SCAN_RESULTS:
- if (hapd->iface->scan_cb)
- hapd->iface->scan_cb(hapd->iface);
- break;
-#ifdef CONFIG_IEEE80211R
- case EVENT_FT_RRB_RX:
- wpa_ft_rrb_rx(hapd->wpa_auth, data->ft_rrb_rx.src,
- data->ft_rrb_rx.data, data->ft_rrb_rx.data_len);
- break;
-#endif /* CONFIG_IEEE80211R */
- case EVENT_WPS_BUTTON_PUSHED:
- hostapd_wps_button_pushed(hapd, NULL);
- break;
-#ifdef NEED_AP_MLME
- case EVENT_TX_STATUS:
- switch (data->tx_status.type) {
- case WLAN_FC_TYPE_MGMT:
- hostapd_mgmt_tx_cb(hapd, data->tx_status.data,
- data->tx_status.data_len,
- data->tx_status.stype,
- data->tx_status.ack);
- break;
- case WLAN_FC_TYPE_DATA:
- hostapd_tx_status(hapd, data->tx_status.dst,
- data->tx_status.data,
- data->tx_status.data_len,
- data->tx_status.ack);
- break;
- }
- break;
- case EVENT_RX_FROM_UNKNOWN:
- hostapd_rx_from_unknown_sta(hapd, data->rx_from_unknown.frame,
- data->rx_from_unknown.len);
- break;
- case EVENT_RX_MGMT:
- hostapd_mgmt_rx(hapd, &data->rx_mgmt);
- break;
-#endif /* NEED_AP_MLME */
- case EVENT_RX_PROBE_REQ:
- if (data->rx_probe_req.sa == NULL ||
- data->rx_probe_req.ie == NULL)
- break;
- hostapd_probe_req_rx(hapd, data->rx_probe_req.sa,
- data->rx_probe_req.ie,
- data->rx_probe_req.ie_len);
- break;
- case EVENT_NEW_STA:
- hostapd_event_new_sta(hapd, data->new_sta.addr);
- break;
- case EVENT_EAPOL_RX:
- hostapd_event_eapol_rx(hapd, data->eapol_rx.src,
- data->eapol_rx.data,
- data->eapol_rx.data_len);
- break;
- case EVENT_ASSOC:
- hostapd_notif_assoc(hapd, data->assoc_info.addr,
- data->assoc_info.req_ies,
- data->assoc_info.req_ies_len,
- data->assoc_info.reassoc);
- break;
- case EVENT_DISASSOC:
- if (data)
- hostapd_notif_disassoc(hapd, data->disassoc_info.addr);
- break;
- case EVENT_DEAUTH:
- if (data)
- hostapd_notif_disassoc(hapd, data->deauth_info.addr);
- break;
- case EVENT_STATION_LOW_ACK:
- if (!data)
- break;
- hostapd_event_sta_low_ack(hapd, data->low_ack.addr);
- break;
- default:
- wpa_printf(MSG_DEBUG, "Unknown event %d", event);
- break;
- }
-}
-
-#endif /* HOSTAPD */
diff --git a/hostapd-0.8/src/ap/hostapd.c b/hostapd-0.8/src/ap/hostapd.c
deleted file mode 100644
index 4e5eb01..0000000
--- a/hostapd-0.8/src/ap/hostapd.c
+++ /dev/null
@@ -1,929 +0,0 @@
-/*
- * hostapd / Initialization and configuration
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "common/ieee802_11_defs.h"
-#include "radius/radius_client.h"
-#include "drivers/driver.h"
-#include "hostapd.h"
-#include "authsrv.h"
-#include "sta_info.h"
-#include "accounting.h"
-#include "ap_list.h"
-#include "beacon.h"
-#include "iapp.h"
-#include "ieee802_1x.h"
-#include "ieee802_11_auth.h"
-#include "vlan_init.h"
-#include "wpa_auth.h"
-#include "wps_hostapd.h"
-#include "hw_features.h"
-#include "wpa_auth_glue.h"
-#include "ap_drv_ops.h"
-#include "ap_config.h"
-#include "p2p_hostapd.h"
-
-
-static int hostapd_flush_old_stations(struct hostapd_data *hapd);
-static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd);
-
-extern int wpa_debug_level;
-
-
-static void hostapd_reload_bss(struct hostapd_data *hapd)
-{
-#ifndef CONFIG_NO_RADIUS
- radius_client_reconfig(hapd->radius, hapd->conf->radius);
-#endif /* CONFIG_NO_RADIUS */
-
- if (hostapd_setup_wpa_psk(hapd->conf)) {
- wpa_printf(MSG_ERROR, "Failed to re-configure WPA PSK "
- "after reloading configuration");
- }
-
- if (hapd->conf->ieee802_1x || hapd->conf->wpa)
- hostapd_set_drv_ieee8021x(hapd, hapd->conf->iface, 1);
- else
- hostapd_set_drv_ieee8021x(hapd, hapd->conf->iface, 0);
-
- if (hapd->conf->wpa && hapd->wpa_auth == NULL)
- hostapd_setup_wpa(hapd);
- else if (hapd->conf->wpa) {
- const u8 *wpa_ie;
- size_t wpa_ie_len;
- hostapd_reconfig_wpa(hapd);
- wpa_ie = wpa_auth_get_wpa_ie(hapd->wpa_auth, &wpa_ie_len);
- if (hostapd_set_generic_elem(hapd, wpa_ie, wpa_ie_len))
- wpa_printf(MSG_ERROR, "Failed to configure WPA IE for "
- "the kernel driver.");
- } else if (hapd->wpa_auth) {
- wpa_deinit(hapd->wpa_auth);
- hapd->wpa_auth = NULL;
- hostapd_set_privacy(hapd, 0);
- hostapd_setup_encryption(hapd->conf->iface, hapd);
- hostapd_set_generic_elem(hapd, (u8 *) "", 0);
- }
-
- ieee802_11_set_beacon(hapd);
- hostapd_update_wps(hapd);
-
- if (hapd->conf->ssid.ssid_set &&
- hostapd_set_ssid(hapd, (u8 *) hapd->conf->ssid.ssid,
- hapd->conf->ssid.ssid_len)) {
- wpa_printf(MSG_ERROR, "Could not set SSID for kernel driver");
- /* try to continue */
- }
- wpa_printf(MSG_DEBUG, "Reconfigured interface %s", hapd->conf->iface);
-}
-
-
-int hostapd_reload_config(struct hostapd_iface *iface)
-{
- struct hostapd_data *hapd = iface->bss[0];
- struct hostapd_config *newconf, *oldconf;
- size_t j;
-
- if (iface->config_read_cb == NULL)
- return -1;
- newconf = iface->config_read_cb(iface->config_fname);
- if (newconf == NULL)
- return -1;
-
- /*
- * Deauthenticate all stations since the new configuration may not
- * allow them to use the BSS anymore.
- */
- for (j = 0; j < iface->num_bss; j++) {
- hostapd_flush_old_stations(iface->bss[j]);
-
-#ifndef CONFIG_NO_RADIUS
- /* TODO: update dynamic data based on changed configuration
- * items (e.g., open/close sockets, etc.) */
- radius_client_flush(iface->bss[j]->radius, 0);
-#endif /* CONFIG_NO_RADIUS */
- }
-
- oldconf = hapd->iconf;
- iface->conf = newconf;
-
- for (j = 0; j < iface->num_bss; j++) {
- hapd = iface->bss[j];
- hapd->iconf = newconf;
- hapd->conf = &newconf->bss[j];
- hostapd_reload_bss(hapd);
- }
-
- hostapd_config_free(oldconf);
-
-
- return 0;
-}
-
-
-static void hostapd_broadcast_key_clear_iface(struct hostapd_data *hapd,
- char *ifname)
-{
- int i;
-
- for (i = 0; i < NUM_WEP_KEYS; i++) {
- if (hostapd_drv_set_key(ifname, hapd, WPA_ALG_NONE, NULL, i,
- 0, NULL, 0, NULL, 0)) {
- wpa_printf(MSG_DEBUG, "Failed to clear default "
- "encryption keys (ifname=%s keyidx=%d)",
- ifname, i);
- }
- }
-#ifdef CONFIG_IEEE80211W
- if (hapd->conf->ieee80211w) {
- for (i = NUM_WEP_KEYS; i < NUM_WEP_KEYS + 2; i++) {
- if (hostapd_drv_set_key(ifname, hapd, WPA_ALG_NONE,
- NULL, i, 0, NULL,
- 0, NULL, 0)) {
- wpa_printf(MSG_DEBUG, "Failed to clear "
- "default mgmt encryption keys "
- "(ifname=%s keyidx=%d)", ifname, i);
- }
- }
- }
-#endif /* CONFIG_IEEE80211W */
-}
-
-
-static int hostapd_broadcast_wep_clear(struct hostapd_data *hapd)
-{
- hostapd_broadcast_key_clear_iface(hapd, hapd->conf->iface);
- return 0;
-}
-
-
-static int hostapd_broadcast_wep_set(struct hostapd_data *hapd)
-{
- int errors = 0, idx;
- struct hostapd_ssid *ssid = &hapd->conf->ssid;
-
- idx = ssid->wep.idx;
- if (ssid->wep.default_len &&
- hostapd_drv_set_key(hapd->conf->iface,
- hapd, WPA_ALG_WEP, broadcast_ether_addr, idx,
- 1, NULL, 0, ssid->wep.key[idx],
- ssid->wep.len[idx])) {
- wpa_printf(MSG_WARNING, "Could not set WEP encryption.");
- errors++;
- }
-
- if (ssid->dyn_vlan_keys) {
- size_t i;
- for (i = 0; i <= ssid->max_dyn_vlan_keys; i++) {
- const char *ifname;
- struct hostapd_wep_keys *key = ssid->dyn_vlan_keys[i];
- if (key == NULL)
- continue;
- ifname = hostapd_get_vlan_id_ifname(hapd->conf->vlan,
- i);
- if (ifname == NULL)
- continue;
-
- idx = key->idx;
- if (hostapd_drv_set_key(ifname, hapd, WPA_ALG_WEP,
- broadcast_ether_addr, idx, 1,
- NULL, 0, key->key[idx],
- key->len[idx])) {
- wpa_printf(MSG_WARNING, "Could not set "
- "dynamic VLAN WEP encryption.");
- errors++;
- }
- }
- }
-
- return errors;
-}
-
-/**
- * hostapd_cleanup - Per-BSS cleanup (deinitialization)
- * @hapd: Pointer to BSS data
- *
- * This function is used to free all per-BSS data structures and resources.
- * This gets called in a loop for each BSS between calls to
- * hostapd_cleanup_iface_pre() and hostapd_cleanup_iface() when an interface
- * is deinitialized. Most of the modules that are initialized in
- * hostapd_setup_bss() are deinitialized here.
- */
-static void hostapd_cleanup(struct hostapd_data *hapd)
-{
- if (hapd->iface->ctrl_iface_deinit)
- hapd->iface->ctrl_iface_deinit(hapd);
-
- iapp_deinit(hapd->iapp);
- hapd->iapp = NULL;
- accounting_deinit(hapd);
- hostapd_deinit_wpa(hapd);
- vlan_deinit(hapd);
- hostapd_acl_deinit(hapd);
-#ifndef CONFIG_NO_RADIUS
- radius_client_deinit(hapd->radius);
- hapd->radius = NULL;
-#endif /* CONFIG_NO_RADIUS */
-
- hostapd_deinit_wps(hapd);
-
- authsrv_deinit(hapd);
-
- if (hapd->interface_added &&
- hostapd_if_remove(hapd, WPA_IF_AP_BSS, hapd->conf->iface)) {
- wpa_printf(MSG_WARNING, "Failed to remove BSS interface %s",
- hapd->conf->iface);
- }
-
- os_free(hapd->probereq_cb);
- hapd->probereq_cb = NULL;
-
-#ifdef CONFIG_P2P
- wpabuf_free(hapd->p2p_beacon_ie);
- hapd->p2p_beacon_ie = NULL;
- wpabuf_free(hapd->p2p_probe_resp_ie);
- hapd->p2p_probe_resp_ie = NULL;
-#endif /* CONFIG_P2P */
-}
-
-
-/**
- * hostapd_cleanup_iface_pre - Preliminary per-interface cleanup
- * @iface: Pointer to interface data
- *
- * This function is called before per-BSS data structures are deinitialized
- * with hostapd_cleanup().
- */
-static void hostapd_cleanup_iface_pre(struct hostapd_iface *iface)
-{
-}
-
-
-/**
- * hostapd_cleanup_iface - Complete per-interface cleanup
- * @iface: Pointer to interface data
- *
- * This function is called after per-BSS data structures are deinitialized
- * with hostapd_cleanup().
- */
-static void hostapd_cleanup_iface(struct hostapd_iface *iface)
-{
- hostapd_free_hw_features(iface->hw_features, iface->num_hw_features);
- iface->hw_features = NULL;
- os_free(iface->current_rates);
- iface->current_rates = NULL;
- ap_list_deinit(iface);
- hostapd_config_free(iface->conf);
- iface->conf = NULL;
-
- os_free(iface->config_fname);
- os_free(iface->bss);
- os_free(iface);
-}
-
-
-static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd)
-{
- int i;
-
- hostapd_broadcast_wep_set(hapd);
-
- if (hapd->conf->ssid.wep.default_len) {
- hostapd_set_privacy(hapd, 1);
- return 0;
- }
-
- for (i = 0; i < 4; i++) {
- if (hapd->conf->ssid.wep.key[i] &&
- hostapd_drv_set_key(iface, hapd, WPA_ALG_WEP, NULL, i,
- i == hapd->conf->ssid.wep.idx, NULL, 0,
- hapd->conf->ssid.wep.key[i],
- hapd->conf->ssid.wep.len[i])) {
- wpa_printf(MSG_WARNING, "Could not set WEP "
- "encryption.");
- return -1;
- }
- if (hapd->conf->ssid.wep.key[i] &&
- i == hapd->conf->ssid.wep.idx)
- hostapd_set_privacy(hapd, 1);
- }
-
- return 0;
-}
-
-
-static int hostapd_flush_old_stations(struct hostapd_data *hapd)
-{
- int ret = 0;
- u8 addr[ETH_ALEN];
-
- if (hostapd_drv_none(hapd) || hapd->drv_priv == NULL)
- return 0;
-
- wpa_printf(MSG_DEBUG, "Flushing old station entries");
- if (hostapd_flush(hapd)) {
- wpa_printf(MSG_WARNING, "Could not connect to kernel driver.");
- ret = -1;
- }
- wpa_printf(MSG_DEBUG, "Deauthenticate all stations");
- os_memset(addr, 0xff, ETH_ALEN);
- hostapd_drv_sta_deauth(hapd, addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
- hostapd_free_stas(hapd);
-
- return ret;
-}
-
-
-/**
- * hostapd_validate_bssid_configuration - Validate BSSID configuration
- * @iface: Pointer to interface data
- * Returns: 0 on success, -1 on failure
- *
- * This function is used to validate that the configured BSSIDs are valid.
- */
-static int hostapd_validate_bssid_configuration(struct hostapd_iface *iface)
-{
- u8 mask[ETH_ALEN] = { 0 };
- struct hostapd_data *hapd = iface->bss[0];
- unsigned int i = iface->conf->num_bss, bits = 0, j;
- int res;
- int auto_addr = 0;
-
- if (hostapd_drv_none(hapd))
- return 0;
-
- /* Generate BSSID mask that is large enough to cover the BSSIDs. */
-
- /* Determine the bits necessary to cover the number of BSSIDs. */
- for (i--; i; i >>= 1)
- bits++;
-
- /* Determine the bits necessary to any configured BSSIDs,
- if they are higher than the number of BSSIDs. */
- for (j = 0; j < iface->conf->num_bss; j++) {
- if (hostapd_mac_comp_empty(iface->conf->bss[j].bssid) == 0) {
- if (j)
- auto_addr++;
- continue;
- }
-
- for (i = 0; i < ETH_ALEN; i++) {
- mask[i] |=
- iface->conf->bss[j].bssid[i] ^
- hapd->own_addr[i];
- }
- }
-
- if (!auto_addr)
- goto skip_mask_ext;
-
- for (i = 0; i < ETH_ALEN && mask[i] == 0; i++)
- ;
- j = 0;
- if (i < ETH_ALEN) {
- j = (5 - i) * 8;
-
- while (mask[i] != 0) {
- mask[i] >>= 1;
- j++;
- }
- }
-
- if (bits < j)
- bits = j;
-
- if (bits > 40) {
- wpa_printf(MSG_ERROR, "Too many bits in the BSSID mask (%u)",
- bits);
- return -1;
- }
-
- os_memset(mask, 0xff, ETH_ALEN);
- j = bits / 8;
- for (i = 5; i > 5 - j; i--)
- mask[i] = 0;
- j = bits % 8;
- while (j--)
- mask[i] <<= 1;
-
-skip_mask_ext:
- wpa_printf(MSG_DEBUG, "BSS count %lu, BSSID mask " MACSTR " (%d bits)",
- (unsigned long) iface->conf->num_bss, MAC2STR(mask), bits);
-
- res = hostapd_valid_bss_mask(hapd, hapd->own_addr, mask);
- if (res == 0)
- return 0;
-
- if (res < 0) {
- wpa_printf(MSG_ERROR, "Driver did not accept BSSID mask "
- MACSTR " for start address " MACSTR ".",
- MAC2STR(mask), MAC2STR(hapd->own_addr));
- return -1;
- }
-
- if (!auto_addr)
- return 0;
-
- for (i = 0; i < ETH_ALEN; i++) {
- if ((hapd->own_addr[i] & mask[i]) != hapd->own_addr[i]) {
- wpa_printf(MSG_ERROR, "Invalid BSSID mask " MACSTR
- " for start address " MACSTR ".",
- MAC2STR(mask), MAC2STR(hapd->own_addr));
- wpa_printf(MSG_ERROR, "Start address must be the "
- "first address in the block (i.e., addr "
- "AND mask == addr).");
- return -1;
- }
- }
-
- return 0;
-}
-
-
-static int mac_in_conf(struct hostapd_config *conf, const void *a)
-{
- size_t i;
-
- for (i = 0; i < conf->num_bss; i++) {
- if (hostapd_mac_comp(conf->bss[i].bssid, a) == 0) {
- return 1;
- }
- }
-
- return 0;
-}
-
-
-
-
-/**
- * hostapd_setup_bss - Per-BSS setup (initialization)
- * @hapd: Pointer to BSS data
- * @first: Whether this BSS is the first BSS of an interface
- *
- * This function is used to initialize all per-BSS data structures and
- * resources. This gets called in a loop for each BSS when an interface is
- * initialized. Most of the modules that are initialized here will be
- * deinitialized in hostapd_cleanup().
- */
-static int hostapd_setup_bss(struct hostapd_data *hapd, int first)
-{
- struct hostapd_bss_config *conf = hapd->conf;
- u8 ssid[HOSTAPD_MAX_SSID_LEN + 1];
- int ssid_len, set_ssid;
- char force_ifname[IFNAMSIZ];
- u8 if_addr[ETH_ALEN];
-
- if (!first) {
- if (hostapd_mac_comp_empty(hapd->conf->bssid) == 0) {
- /* Allocate the next available BSSID. */
- do {
- inc_byte_array(hapd->own_addr, ETH_ALEN);
- } while (mac_in_conf(hapd->iconf, hapd->own_addr));
- } else {
- /* Allocate the configured BSSID. */
- os_memcpy(hapd->own_addr, hapd->conf->bssid, ETH_ALEN);
-
- if (hostapd_mac_comp(hapd->own_addr,
- hapd->iface->bss[0]->own_addr) ==
- 0) {
- wpa_printf(MSG_ERROR, "BSS '%s' may not have "
- "BSSID set to the MAC address of "
- "the radio", hapd->conf->iface);
- return -1;
- }
- }
-
- hapd->interface_added = 1;
- if (hostapd_if_add(hapd->iface->bss[0], WPA_IF_AP_BSS,
- hapd->conf->iface, hapd->own_addr, hapd,
- &hapd->drv_priv, force_ifname, if_addr,
- hapd->conf->bridge[0] ? hapd->conf->bridge :
- NULL)) {
- wpa_printf(MSG_ERROR, "Failed to add BSS (BSSID="
- MACSTR ")", MAC2STR(hapd->own_addr));
- return -1;
- }
- }
-
- if (conf->wmm_enabled < 0)
- conf->wmm_enabled = hapd->iconf->ieee80211n;
-
- hostapd_flush_old_stations(hapd);
- hostapd_set_privacy(hapd, 0);
-
- hostapd_broadcast_wep_clear(hapd);
- if (hostapd_setup_encryption(hapd->conf->iface, hapd))
- return -1;
-
- /*
- * Fetch the SSID from the system and use it or,
- * if one was specified in the config file, verify they
- * match.
- */
- ssid_len = hostapd_get_ssid(hapd, ssid, sizeof(ssid));
- if (ssid_len < 0) {
- wpa_printf(MSG_ERROR, "Could not read SSID from system");
- return -1;
- }
- if (conf->ssid.ssid_set) {
- /*
- * If SSID is specified in the config file and it differs
- * from what is being used then force installation of the
- * new SSID.
- */
- set_ssid = (conf->ssid.ssid_len != (size_t) ssid_len ||
- os_memcmp(conf->ssid.ssid, ssid, ssid_len) != 0);
- } else {
- /*
- * No SSID in the config file; just use the one we got
- * from the system.
- */
- set_ssid = 0;
- conf->ssid.ssid_len = ssid_len;
- os_memcpy(conf->ssid.ssid, ssid, conf->ssid.ssid_len);
- conf->ssid.ssid[conf->ssid.ssid_len] = '\0';
- }
-
- if (!hostapd_drv_none(hapd)) {
- wpa_printf(MSG_ERROR, "Using interface %s with hwaddr " MACSTR
- " and ssid '%s'",
- hapd->conf->iface, MAC2STR(hapd->own_addr),
- hapd->conf->ssid.ssid);
- }
-
- if (hostapd_setup_wpa_psk(conf)) {
- wpa_printf(MSG_ERROR, "WPA-PSK setup failed.");
- return -1;
- }
-
- /* Set SSID for the kernel driver (to be used in beacon and probe
- * response frames) */
- if (set_ssid && hostapd_set_ssid(hapd, (u8 *) conf->ssid.ssid,
- conf->ssid.ssid_len)) {
- wpa_printf(MSG_ERROR, "Could not set SSID for kernel driver");
- return -1;
- }
-
- if (wpa_debug_level == MSG_MSGDUMP)
- conf->radius->msg_dumps = 1;
-#ifndef CONFIG_NO_RADIUS
- hapd->radius = radius_client_init(hapd, conf->radius);
- if (hapd->radius == NULL) {
- wpa_printf(MSG_ERROR, "RADIUS client initialization failed.");
- return -1;
- }
-#endif /* CONFIG_NO_RADIUS */
-
- if (hostapd_acl_init(hapd)) {
- wpa_printf(MSG_ERROR, "ACL initialization failed.");
- return -1;
- }
- if (hostapd_init_wps(hapd, conf))
- return -1;
-
- if (authsrv_init(hapd) < 0)
- return -1;
-
- if (ieee802_1x_init(hapd)) {
- wpa_printf(MSG_ERROR, "IEEE 802.1X initialization failed.");
- return -1;
- }
-
- if (hapd->conf->wpa && hostapd_setup_wpa(hapd))
- return -1;
-
- if (accounting_init(hapd)) {
- wpa_printf(MSG_ERROR, "Accounting initialization failed.");
- return -1;
- }
-
- if (hapd->conf->ieee802_11f &&
- (hapd->iapp = iapp_init(hapd, hapd->conf->iapp_iface)) == NULL) {
- wpa_printf(MSG_ERROR, "IEEE 802.11F (IAPP) initialization "
- "failed.");
- return -1;
- }
-
- if (hapd->iface->ctrl_iface_init &&
- hapd->iface->ctrl_iface_init(hapd)) {
- wpa_printf(MSG_ERROR, "Failed to setup control interface");
- return -1;
- }
-
- if (!hostapd_drv_none(hapd) && vlan_init(hapd)) {
- wpa_printf(MSG_ERROR, "VLAN initialization failed.");
- return -1;
- }
-
- ieee802_11_set_beacon(hapd);
-
- if (hapd->driver && hapd->driver->set_operstate)
- hapd->driver->set_operstate(hapd->drv_priv, 1);
-
- return 0;
-}
-
-
-static void hostapd_tx_queue_params(struct hostapd_iface *iface)
-{
- struct hostapd_data *hapd = iface->bss[0];
- int i;
- struct hostapd_tx_queue_params *p;
-
- for (i = 0; i < NUM_TX_QUEUES; i++) {
- p = &iface->conf->tx_queue[i];
-
- if (hostapd_set_tx_queue_params(hapd, i, p->aifs, p->cwmin,
- p->cwmax, p->burst)) {
- wpa_printf(MSG_DEBUG, "Failed to set TX queue "
- "parameters for queue %d.", i);
- /* Continue anyway */
- }
- }
-}
-
-
-static int setup_interface(struct hostapd_iface *iface)
-{
- struct hostapd_data *hapd = iface->bss[0];
- size_t i;
- char country[4];
-
- /*
- * Make sure that all BSSes get configured with a pointer to the same
- * driver interface.
- */
- for (i = 1; i < iface->num_bss; i++) {
- iface->bss[i]->driver = hapd->driver;
- iface->bss[i]->drv_priv = hapd->drv_priv;
- }
-
- if (hostapd_validate_bssid_configuration(iface))
- return -1;
-
- if (hapd->iconf->country[0] && hapd->iconf->country[1]) {
- os_memcpy(country, hapd->iconf->country, 3);
- country[3] = '\0';
- if (hostapd_set_country(hapd, country) < 0) {
- wpa_printf(MSG_ERROR, "Failed to set country code");
- return -1;
- }
- }
-
- if (hostapd_get_hw_features(iface)) {
- /* Not all drivers support this yet, so continue without hw
- * feature data. */
- } else {
- int ret = hostapd_select_hw_mode(iface);
- if (ret < 0) {
- wpa_printf(MSG_ERROR, "Could not select hw_mode and "
- "channel. (%d)", ret);
- return -1;
- }
- ret = hostapd_check_ht_capab(iface);
- if (ret < 0)
- return -1;
- if (ret == 1) {
- wpa_printf(MSG_DEBUG, "Interface initialization will "
- "be completed in a callback");
- return 0;
- }
- }
- return hostapd_setup_interface_complete(iface, 0);
-}
-
-
-int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err)
-{
- struct hostapd_data *hapd = iface->bss[0];
- size_t j;
- u8 *prev_addr;
-
- if (err) {
- wpa_printf(MSG_ERROR, "Interface initialization failed");
- eloop_terminate();
- return -1;
- }
-
- wpa_printf(MSG_DEBUG, "Completing interface initialization");
- if (hapd->iconf->channel) {
- iface->freq = hostapd_hw_get_freq(hapd, hapd->iconf->channel);
- wpa_printf(MSG_DEBUG, "Mode: %s Channel: %d "
- "Frequency: %d MHz",
- hostapd_hw_mode_txt(hapd->iconf->hw_mode),
- hapd->iconf->channel, iface->freq);
-
- if (hostapd_set_freq(hapd, hapd->iconf->hw_mode, iface->freq,
- hapd->iconf->channel,
- hapd->iconf->ieee80211n,
- hapd->iconf->secondary_channel)) {
- wpa_printf(MSG_ERROR, "Could not set channel for "
- "kernel driver");
- return -1;
- }
- }
-
- if (iface->current_mode) {
- if (hostapd_prepare_rates(hapd, iface->current_mode)) {
- wpa_printf(MSG_ERROR, "Failed to prepare rates "
- "table.");
- hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_WARNING,
- "Failed to prepare rates table.");
- return -1;
- }
- }
-
- if (hapd->iconf->rts_threshold > -1 &&
- hostapd_set_rts(hapd, hapd->iconf->rts_threshold)) {
- wpa_printf(MSG_ERROR, "Could not set RTS threshold for "
- "kernel driver");
- return -1;
- }
-
- if (hapd->iconf->fragm_threshold > -1 &&
- hostapd_set_frag(hapd, hapd->iconf->fragm_threshold)) {
- wpa_printf(MSG_ERROR, "Could not set fragmentation threshold "
- "for kernel driver");
- return -1;
- }
-
- prev_addr = hapd->own_addr;
-
- for (j = 0; j < iface->num_bss; j++) {
- hapd = iface->bss[j];
- if (j)
- os_memcpy(hapd->own_addr, prev_addr, ETH_ALEN);
- if (hostapd_setup_bss(hapd, j == 0))
- return -1;
- if (hostapd_mac_comp_empty(hapd->conf->bssid) == 0)
- prev_addr = hapd->own_addr;
- }
-
- hostapd_tx_queue_params(iface);
-
- ap_list_init(iface);
-
- if (hostapd_driver_commit(hapd) < 0) {
- wpa_printf(MSG_ERROR, "%s: Failed to commit driver "
- "configuration", __func__);
- return -1;
- }
-
- if (hapd->setup_complete_cb)
- hapd->setup_complete_cb(hapd->setup_complete_cb_ctx);
-
- wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
- iface->bss[0]->conf->iface);
-
- return 0;
-}
-
-
-/**
- * hostapd_setup_interface - Setup of an interface
- * @iface: Pointer to interface data.
- * Returns: 0 on success, -1 on failure
- *
- * Initializes the driver interface, validates the configuration,
- * and sets driver parameters based on the configuration.
- * Flushes old stations, sets the channel, encryption,
- * beacons, and WDS links based on the configuration.
- */
-int hostapd_setup_interface(struct hostapd_iface *iface)
-{
- int ret;
-
- ret = setup_interface(iface);
- if (ret) {
- wpa_printf(MSG_ERROR, "%s: Unable to setup interface.",
- iface->bss[0]->conf->iface);
- return -1;
- }
-
- return 0;
-}
-
-
-/**
- * hostapd_alloc_bss_data - Allocate and initialize per-BSS data
- * @hapd_iface: Pointer to interface data
- * @conf: Pointer to per-interface configuration
- * @bss: Pointer to per-BSS configuration for this BSS
- * Returns: Pointer to allocated BSS data
- *
- * This function is used to allocate per-BSS data structure. This data will be
- * freed after hostapd_cleanup() is called for it during interface
- * deinitialization.
- */
-struct hostapd_data *
-hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface,
- struct hostapd_config *conf,
- struct hostapd_bss_config *bss)
-{
- struct hostapd_data *hapd;
-
- hapd = os_zalloc(sizeof(*hapd));
- if (hapd == NULL)
- return NULL;
-
- hapd->new_assoc_sta_cb = hostapd_new_assoc_sta;
- hapd->iconf = conf;
- hapd->conf = bss;
- hapd->iface = hapd_iface;
- hapd->driver = hapd->iconf->driver;
-
- return hapd;
-}
-
-
-void hostapd_interface_deinit(struct hostapd_iface *iface)
-{
- size_t j;
-
- if (iface == NULL)
- return;
-
- hostapd_cleanup_iface_pre(iface);
- for (j = 0; j < iface->num_bss; j++) {
- struct hostapd_data *hapd = iface->bss[j];
- hostapd_free_stas(hapd);
- hostapd_flush_old_stations(hapd);
- hostapd_cleanup(hapd);
- }
-}
-
-
-void hostapd_interface_free(struct hostapd_iface *iface)
-{
- size_t j;
- for (j = 0; j < iface->num_bss; j++)
- os_free(iface->bss[j]);
- hostapd_cleanup_iface(iface);
-}
-
-
-/**
- * hostapd_new_assoc_sta - Notify that a new station associated with the AP
- * @hapd: Pointer to BSS data
- * @sta: Pointer to the associated STA data
- * @reassoc: 1 to indicate this was a re-association; 0 = first association
- *
- * This function will be called whenever a station associates with the AP. It
- * can be called from ieee802_11.c for drivers that export MLME to hostapd and
- * from drv_callbacks.c based on driver events for drivers that take care of
- * management frames (IEEE 802.11 authentication and association) internally.
- */
-void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
- int reassoc)
-{
- if (hapd->tkip_countermeasures) {
- hostapd_drv_sta_deauth(hapd, sta->addr,
- WLAN_REASON_MICHAEL_MIC_FAILURE);
- return;
- }
-
- hostapd_prune_associations(hapd, sta->addr);
-
- /* IEEE 802.11F (IAPP) */
- if (hapd->conf->ieee802_11f)
- iapp_new_station(hapd->iapp, sta);
-
-#ifdef CONFIG_P2P
- if (sta->p2p_ie == NULL && !sta->no_p2p_set) {
- sta->no_p2p_set = 1;
- hapd->num_sta_no_p2p++;
- if (hapd->num_sta_no_p2p == 1)
- hostapd_p2p_non_p2p_sta_connected(hapd);
- }
-#endif /* CONFIG_P2P */
-
- /* Start accounting here, if IEEE 802.1X and WPA are not used.
- * IEEE 802.1X/WPA code will start accounting after the station has
- * been authorized. */
- if (!hapd->conf->ieee802_1x && !hapd->conf->wpa)
- accounting_sta_start(hapd, sta);
-
- /* Start IEEE 802.1X authentication process for new stations */
- ieee802_1x_new_station(hapd, sta);
- if (reassoc) {
- if (sta->auth_alg != WLAN_AUTH_FT &&
- !(sta->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS)))
- wpa_auth_sm_event(sta->wpa_sm, WPA_REAUTH);
- } else
- wpa_auth_sta_associated(hapd->wpa_auth, sta->wpa_sm);
-}
diff --git a/hostapd-0.8/src/ap/hostapd.h b/hostapd-0.8/src/ap/hostapd.h
deleted file mode 100644
index d4501a1..0000000
--- a/hostapd-0.8/src/ap/hostapd.h
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * hostapd / Initialization and configuration
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef HOSTAPD_H
-#define HOSTAPD_H
-
-#include "common/defs.h"
-
-struct wpa_driver_ops;
-struct wpa_ctrl_dst;
-struct radius_server_data;
-struct upnp_wps_device_sm;
-struct hapd_interfaces;
-struct hostapd_data;
-struct sta_info;
-struct hostap_sta_driver_data;
-struct ieee80211_ht_capabilities;
-struct full_dynamic_vlan;
-enum wps_event;
-union wps_event_data;
-
-struct hostapd_probereq_cb {
- int (*cb)(void *ctx, const u8 *sa, const u8 *ie, size_t ie_len);
- void *ctx;
-};
-
-#define HOSTAPD_RATE_BASIC 0x00000001
-
-struct hostapd_rate_data {
- int rate; /* rate in 100 kbps */
- int flags; /* HOSTAPD_RATE_ flags */
-};
-
-struct hostapd_frame_info {
- u32 channel;
- u32 datarate;
- u32 ssi_signal;
-};
-
-
-/**
- * struct hostapd_data - hostapd per-BSS data structure
- */
-struct hostapd_data {
- struct hostapd_iface *iface;
- struct hostapd_config *iconf;
- struct hostapd_bss_config *conf;
- int interface_added; /* virtual interface added for this BSS */
-
- u8 own_addr[ETH_ALEN];
-
- int num_sta; /* number of entries in sta_list */
- struct sta_info *sta_list; /* STA info list head */
-#define STA_HASH_SIZE 256
-#define STA_HASH(sta) (sta[5])
- struct sta_info *sta_hash[STA_HASH_SIZE];
-
- /*
- * Bitfield for indicating which AIDs are allocated. Only AID values
- * 1-2007 are used and as such, the bit at index 0 corresponds to AID
- * 1.
- */
-#define AID_WORDS ((2008 + 31) / 32)
- u32 sta_aid[AID_WORDS];
-
- const struct wpa_driver_ops *driver;
- void *drv_priv;
-
- void (*new_assoc_sta_cb)(struct hostapd_data *hapd,
- struct sta_info *sta, int reassoc);
-
- void *msg_ctx; /* ctx for wpa_msg() calls */
-
- struct radius_client_data *radius;
- u32 acct_session_id_hi, acct_session_id_lo;
-
- struct iapp_data *iapp;
-
- struct hostapd_cached_radius_acl *acl_cache;
- struct hostapd_acl_query_data *acl_queries;
-
- struct wpa_authenticator *wpa_auth;
- struct eapol_authenticator *eapol_auth;
-
- struct rsn_preauth_interface *preauth_iface;
- time_t michael_mic_failure;
- int michael_mic_failures;
- int tkip_countermeasures;
-
- int ctrl_sock;
- struct wpa_ctrl_dst *ctrl_dst;
-
- void *ssl_ctx;
- void *eap_sim_db_priv;
- struct radius_server_data *radius_srv;
-
- int parameter_set_count;
-
-#ifdef CONFIG_FULL_DYNAMIC_VLAN
- struct full_dynamic_vlan *full_dynamic_vlan;
-#endif /* CONFIG_FULL_DYNAMIC_VLAN */
-
- struct l2_packet_data *l2;
- struct wps_context *wps;
-
- struct wpabuf *wps_beacon_ie;
- struct wpabuf *wps_probe_resp_ie;
-#ifdef CONFIG_WPS
- unsigned int ap_pin_failures;
- struct upnp_wps_device_sm *wps_upnp;
- unsigned int ap_pin_lockout_time;
-#endif /* CONFIG_WPS */
-
- struct hostapd_probereq_cb *probereq_cb;
- size_t num_probereq_cb;
-
- void (*public_action_cb)(void *ctx, const u8 *buf, size_t len,
- int freq);
- void *public_action_cb_ctx;
-
- int (*vendor_action_cb)(void *ctx, const u8 *buf, size_t len,
- int freq);
- void *vendor_action_cb_ctx;
-
- void (*wps_reg_success_cb)(void *ctx, const u8 *mac_addr,
- const u8 *uuid_e);
- void *wps_reg_success_cb_ctx;
-
- void (*wps_event_cb)(void *ctx, enum wps_event event,
- union wps_event_data *data);
- void *wps_event_cb_ctx;
-
- void (*sta_authorized_cb)(void *ctx, const u8 *mac_addr,
- int authorized);
- void *sta_authorized_cb_ctx;
-
- void (*setup_complete_cb)(void *ctx);
- void *setup_complete_cb_ctx;
-
-#ifdef CONFIG_P2P
- struct p2p_data *p2p;
- struct p2p_group *p2p_group;
- struct wpabuf *p2p_beacon_ie;
- struct wpabuf *p2p_probe_resp_ie;
-
- /* Number of non-P2P association stations */
- int num_sta_no_p2p;
-
- /* Periodic NoA (used only when no non-P2P clients in the group) */
- int noa_enabled;
- int noa_start;
- int noa_duration;
-#endif /* CONFIG_P2P */
-};
-
-
-/**
- * struct hostapd_iface - hostapd per-interface data structure
- */
-struct hostapd_iface {
- struct hapd_interfaces *interfaces;
- void *owner;
- int (*reload_config)(struct hostapd_iface *iface);
- struct hostapd_config * (*config_read_cb)(const char *config_fname);
- char *config_fname;
- struct hostapd_config *conf;
-
- size_t num_bss;
- struct hostapd_data **bss;
-
- int num_ap; /* number of entries in ap_list */
- struct ap_info *ap_list; /* AP info list head */
- struct ap_info *ap_hash[STA_HASH_SIZE];
- struct ap_info *ap_iter_list;
-
- unsigned int drv_flags;
- struct hostapd_hw_modes *hw_features;
- int num_hw_features;
- struct hostapd_hw_modes *current_mode;
- /* Rates that are currently used (i.e., filtered copy of
- * current_mode->channels */
- int num_rates;
- struct hostapd_rate_data *current_rates;
- int freq;
-
- u16 hw_flags;
-
- /* Number of associated Non-ERP stations (i.e., stations using 802.11b
- * in 802.11g BSS) */
- int num_sta_non_erp;
-
- /* Number of associated stations that do not support Short Slot Time */
- int num_sta_no_short_slot_time;
-
- /* Number of associated stations that do not support Short Preamble */
- int num_sta_no_short_preamble;
-
- int olbc; /* Overlapping Legacy BSS Condition */
-
- /* Number of HT associated stations that do not support greenfield */
- int num_sta_ht_no_gf;
-
- /* Number of associated non-HT stations */
- int num_sta_no_ht;
-
- /* Number of HT associated stations 20 MHz */
- int num_sta_ht_20mhz;
-
- /* Overlapping BSS information */
- int olbc_ht;
-
- u16 ht_op_mode;
- void (*scan_cb)(struct hostapd_iface *iface);
-
- int (*ctrl_iface_init)(struct hostapd_data *hapd);
- void (*ctrl_iface_deinit)(struct hostapd_data *hapd);
-
- int (*for_each_interface)(struct hapd_interfaces *interfaces,
- int (*cb)(struct hostapd_iface *iface,
- void *ctx), void *ctx);
-};
-
-/* hostapd.c */
-int hostapd_reload_config(struct hostapd_iface *iface);
-struct hostapd_data *
-hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface,
- struct hostapd_config *conf,
- struct hostapd_bss_config *bss);
-int hostapd_setup_interface(struct hostapd_iface *iface);
-int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err);
-void hostapd_interface_deinit(struct hostapd_iface *iface);
-void hostapd_interface_free(struct hostapd_iface *iface);
-void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
- int reassoc);
-
-/* utils.c */
-int hostapd_register_probereq_cb(struct hostapd_data *hapd,
- int (*cb)(void *ctx, const u8 *sa,
- const u8 *ie, size_t ie_len),
- void *ctx);
-void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr);
-
-/* drv_callbacks.c (TODO: move to somewhere else?) */
-int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
- const u8 *ie, size_t ielen, int reassoc);
-void hostapd_notif_disassoc(struct hostapd_data *hapd, const u8 *addr);
-void hostapd_event_sta_low_ack(struct hostapd_data *hapd, const u8 *addr);
-int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa,
- const u8 *ie, size_t ie_len);
-
-#endif /* HOSTAPD_H */
diff --git a/hostapd-0.8/src/ap/hw_features.c b/hostapd-0.8/src/ap/hw_features.c
deleted file mode 100644
index 30af9d2..0000000
--- a/hostapd-0.8/src/ap/hw_features.c
+++ /dev/null
@@ -1,754 +0,0 @@
-/*
- * hostapd / Hardware feature query and different modes
- * Copyright 2002-2003, Instant802 Networks, Inc.
- * Copyright 2005-2006, Devicescape Software, Inc.
- * Copyright (c) 2008-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "common/ieee802_11_defs.h"
-#include "common/ieee802_11_common.h"
-#include "drivers/driver.h"
-#include "hostapd.h"
-#include "ap_config.h"
-#include "ap_drv_ops.h"
-#include "hw_features.h"
-
-
-void hostapd_free_hw_features(struct hostapd_hw_modes *hw_features,
- size_t num_hw_features)
-{
- size_t i;
-
- if (hw_features == NULL)
- return;
-
- for (i = 0; i < num_hw_features; i++) {
- os_free(hw_features[i].channels);
- os_free(hw_features[i].rates);
- }
-
- os_free(hw_features);
-}
-
-
-int hostapd_get_hw_features(struct hostapd_iface *iface)
-{
- struct hostapd_data *hapd = iface->bss[0];
- int ret = 0, i, j;
- u16 num_modes, flags;
- struct hostapd_hw_modes *modes;
-
- if (hostapd_drv_none(hapd))
- return -1;
- modes = hostapd_get_hw_feature_data(hapd, &num_modes, &flags);
- if (modes == NULL) {
- hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "Fetching hardware channel/rate support not "
- "supported.");
- return -1;
- }
-
- iface->hw_flags = flags;
-
- hostapd_free_hw_features(iface->hw_features, iface->num_hw_features);
- iface->hw_features = modes;
- iface->num_hw_features = num_modes;
-
- for (i = 0; i < num_modes; i++) {
- struct hostapd_hw_modes *feature = &modes[i];
- /* set flag for channels we can use in current regulatory
- * domain */
- for (j = 0; j < feature->num_channels; j++) {
- /*
- * Disable all channels that are marked not to allow
- * IBSS operation or active scanning. In addition,
- * disable all channels that require radar detection,
- * since that (in addition to full DFS) is not yet
- * supported.
- */
- if (feature->channels[j].flag &
- (HOSTAPD_CHAN_NO_IBSS |
- HOSTAPD_CHAN_PASSIVE_SCAN |
- HOSTAPD_CHAN_RADAR))
- feature->channels[j].flag |=
- HOSTAPD_CHAN_DISABLED;
- if (feature->channels[j].flag & HOSTAPD_CHAN_DISABLED)
- continue;
- wpa_printf(MSG_MSGDUMP, "Allowed channel: mode=%d "
- "chan=%d freq=%d MHz max_tx_power=%d dBm",
- feature->mode,
- feature->channels[j].chan,
- feature->channels[j].freq,
- feature->channels[j].max_tx_power);
- }
- }
-
- return ret;
-}
-
-
-int hostapd_prepare_rates(struct hostapd_data *hapd,
- struct hostapd_hw_modes *mode)
-{
- int i, num_basic_rates = 0;
- int basic_rates_a[] = { 60, 120, 240, -1 };
- int basic_rates_b[] = { 10, 20, -1 };
- int basic_rates_g[] = { 10, 20, 55, 110, -1 };
- int *basic_rates;
-
- if (hapd->iconf->basic_rates)
- basic_rates = hapd->iconf->basic_rates;
- else switch (mode->mode) {
- case HOSTAPD_MODE_IEEE80211A:
- basic_rates = basic_rates_a;
- break;
- case HOSTAPD_MODE_IEEE80211B:
- basic_rates = basic_rates_b;
- break;
- case HOSTAPD_MODE_IEEE80211G:
- basic_rates = basic_rates_g;
- break;
- default:
- return -1;
- }
-
- if (hostapd_set_rate_sets(hapd, hapd->iconf->supported_rates,
- basic_rates, mode->mode)) {
- wpa_printf(MSG_ERROR, "Failed to update rate sets in kernel "
- "module");
- }
-
- os_free(hapd->iface->current_rates);
- hapd->iface->num_rates = 0;
-
- hapd->iface->current_rates =
- os_zalloc(mode->num_rates * sizeof(struct hostapd_rate_data));
- if (!hapd->iface->current_rates) {
- wpa_printf(MSG_ERROR, "Failed to allocate memory for rate "
- "table.");
- return -1;
- }
-
- for (i = 0; i < mode->num_rates; i++) {
- struct hostapd_rate_data *rate;
-
- if (hapd->iconf->supported_rates &&
- !hostapd_rate_found(hapd->iconf->supported_rates,
- mode->rates[i]))
- continue;
-
- rate = &hapd->iface->current_rates[hapd->iface->num_rates];
- rate->rate = mode->rates[i];
- if (hostapd_rate_found(basic_rates, rate->rate)) {
- rate->flags |= HOSTAPD_RATE_BASIC;
- num_basic_rates++;
- }
- wpa_printf(MSG_DEBUG, "RATE[%d] rate=%d flags=0x%x",
- hapd->iface->num_rates, rate->rate, rate->flags);
- hapd->iface->num_rates++;
- }
-
- if ((hapd->iface->num_rates == 0 || num_basic_rates == 0) &&
- (!hapd->iconf->ieee80211n || !hapd->iconf->require_ht)) {
- wpa_printf(MSG_ERROR, "No rates remaining in supported/basic "
- "rate sets (%d,%d).",
- hapd->iface->num_rates, num_basic_rates);
- return -1;
- }
-
- return 0;
-}
-
-
-#ifdef CONFIG_IEEE80211N
-static int ieee80211n_allowed_ht40_channel_pair(struct hostapd_iface *iface)
-{
- int sec_chan, ok, j, first;
- int allowed[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
- 184, 192 };
- size_t k;
-
- if (!iface->conf->secondary_channel)
- return 1; /* HT40 not used */
-
- sec_chan = iface->conf->channel + iface->conf->secondary_channel * 4;
- wpa_printf(MSG_DEBUG, "HT40: control channel: %d "
- "secondary channel: %d",
- iface->conf->channel, sec_chan);
-
- /* Verify that HT40 secondary channel is an allowed 20 MHz
- * channel */
- ok = 0;
- for (j = 0; j < iface->current_mode->num_channels; j++) {
- struct hostapd_channel_data *chan =
- &iface->current_mode->channels[j];
- if (!(chan->flag & HOSTAPD_CHAN_DISABLED) &&
- chan->chan == sec_chan) {
- ok = 1;
- break;
- }
- }
- if (!ok) {
- wpa_printf(MSG_ERROR, "HT40 secondary channel %d not allowed",
- sec_chan);
- return 0;
- }
-
- /*
- * Verify that HT40 primary,secondary channel pair is allowed per
- * IEEE 802.11n Annex J. This is only needed for 5 GHz band since
- * 2.4 GHz rules allow all cases where the secondary channel fits into
- * the list of allowed channels (already checked above).
- */
- if (iface->current_mode->mode != HOSTAPD_MODE_IEEE80211A)
- return 1;
-
- if (iface->conf->secondary_channel > 0)
- first = iface->conf->channel;
- else
- first = sec_chan;
-
- ok = 0;
- for (k = 0; k < sizeof(allowed) / sizeof(allowed[0]); k++) {
- if (first == allowed[k]) {
- ok = 1;
- break;
- }
- }
- if (!ok) {
- wpa_printf(MSG_ERROR, "HT40 channel pair (%d, %d) not allowed",
- iface->conf->channel,
- iface->conf->secondary_channel);
- return 0;
- }
-
- return 1;
-}
-
-
-static void ieee80211n_switch_pri_sec(struct hostapd_iface *iface)
-{
- if (iface->conf->secondary_channel > 0) {
- iface->conf->channel += 4;
- iface->conf->secondary_channel = -1;
- } else {
- iface->conf->channel -= 4;
- iface->conf->secondary_channel = 1;
- }
-}
-
-
-static void ieee80211n_get_pri_sec_chan(struct wpa_scan_res *bss,
- int *pri_chan, int *sec_chan)
-{
- struct ieee80211_ht_operation *oper;
- struct ieee802_11_elems elems;
-
- *pri_chan = *sec_chan = 0;
-
- ieee802_11_parse_elems((u8 *) (bss + 1), bss->ie_len, &elems, 0);
- if (elems.ht_operation &&
- elems.ht_operation_len >= sizeof(*oper)) {
- oper = (struct ieee80211_ht_operation *) elems.ht_operation;
- *pri_chan = oper->control_chan;
- if (oper->ht_param & HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH) {
- int sec = oper->ht_param &
- HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK;
- if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE)
- *sec_chan = *pri_chan + 4;
- else if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW)
- *sec_chan = *pri_chan - 4;
- }
- }
-}
-
-
-static int ieee80211n_check_40mhz_5g(struct hostapd_iface *iface,
- struct wpa_scan_results *scan_res)
-{
- int pri_chan, sec_chan, pri_freq, sec_freq, pri_bss, sec_bss;
- int bss_pri_chan, bss_sec_chan;
- size_t i;
- int match;
-
- pri_chan = iface->conf->channel;
- sec_chan = iface->conf->secondary_channel * 4;
- pri_freq = hostapd_hw_get_freq(iface->bss[0], pri_chan);
- if (iface->conf->secondary_channel > 0)
- sec_freq = pri_freq + 20;
- else
- sec_freq = pri_freq - 20;
-
- /*
- * Switch PRI/SEC channels if Beacons were detected on selected SEC
- * channel, but not on selected PRI channel.
- */
- pri_bss = sec_bss = 0;
- for (i = 0; i < scan_res->num; i++) {
- struct wpa_scan_res *bss = scan_res->res[i];
- if (bss->freq == pri_freq)
- pri_bss++;
- else if (bss->freq == sec_freq)
- sec_bss++;
- }
- if (sec_bss && !pri_bss) {
- wpa_printf(MSG_INFO, "Switch own primary and secondary "
- "channel to get secondary channel with no Beacons "
- "from other BSSes");
- ieee80211n_switch_pri_sec(iface);
- }
-
- /*
- * Match PRI/SEC channel with any existing HT40 BSS on the same
- * channels that we are about to use (if already mixed order in
- * existing BSSes, use own preference).
- */
- match = 0;
- for (i = 0; i < scan_res->num; i++) {
- struct wpa_scan_res *bss = scan_res->res[i];
- ieee80211n_get_pri_sec_chan(bss, &bss_pri_chan, &bss_sec_chan);
- if (pri_chan == bss_pri_chan &&
- sec_chan == bss_sec_chan) {
- match = 1;
- break;
- }
- }
- if (!match) {
- for (i = 0; i < scan_res->num; i++) {
- struct wpa_scan_res *bss = scan_res->res[i];
- ieee80211n_get_pri_sec_chan(bss, &bss_pri_chan,
- &bss_sec_chan);
- if (pri_chan == bss_sec_chan &&
- sec_chan == bss_pri_chan) {
- wpa_printf(MSG_INFO, "Switch own primary and "
- "secondary channel due to BSS "
- "overlap with " MACSTR,
- MAC2STR(bss->bssid));
- ieee80211n_switch_pri_sec(iface);
- break;
- }
- }
- }
-
- return 1;
-}
-
-
-static int ieee80211n_check_40mhz_2g4(struct hostapd_iface *iface,
- struct wpa_scan_results *scan_res)
-{
- int pri_freq, sec_freq;
- int affected_start, affected_end;
- size_t i;
-
- pri_freq = hostapd_hw_get_freq(iface->bss[0], iface->conf->channel);
- if (iface->conf->secondary_channel > 0)
- sec_freq = pri_freq + 20;
- else
- sec_freq = pri_freq - 20;
- affected_start = (pri_freq + sec_freq) / 2 - 25;
- affected_end = (pri_freq + sec_freq) / 2 + 25;
- wpa_printf(MSG_DEBUG, "40 MHz affected channel range: [%d,%d] MHz",
- affected_start, affected_end);
- for (i = 0; i < scan_res->num; i++) {
- struct wpa_scan_res *bss = scan_res->res[i];
- int pri = bss->freq;
- int sec = pri;
- int sec_chan, pri_chan;
-
- ieee80211n_get_pri_sec_chan(bss, &pri_chan, &sec_chan);
-
- if (sec_chan) {
- if (sec_chan < pri_chan)
- sec = pri - 20;
- else
- sec = pri + 20;
- }
-
- if ((pri < affected_start || pri > affected_end) &&
- (sec < affected_start || sec > affected_end))
- continue; /* not within affected channel range */
-
- wpa_printf(MSG_DEBUG, "Neighboring BSS: " MACSTR
- " freq=%d pri=%d sec=%d",
- MAC2STR(bss->bssid), bss->freq, pri_chan, sec_chan);
-
- if (sec_chan) {
- if (pri_freq != pri || sec_freq != sec) {
- wpa_printf(MSG_DEBUG, "40 MHz pri/sec "
- "mismatch with BSS " MACSTR
- " <%d,%d> (chan=%d%c) vs. <%d,%d>",
- MAC2STR(bss->bssid),
- pri, sec, pri_chan,
- sec > pri ? '+' : '-',
- pri_freq, sec_freq);
- return 0;
- }
- }
-
- /* TODO: 40 MHz intolerant */
- }
-
- return 1;
-}
-
-
-static void wpa_scan_results_free(struct wpa_scan_results *res)
-{
- size_t i;
-
- if (res == NULL)
- return;
-
- for (i = 0; i < res->num; i++)
- os_free(res->res[i]);
- os_free(res->res);
- os_free(res);
-}
-
-
-static void ieee80211n_check_scan(struct hostapd_iface *iface)
-{
- struct wpa_scan_results *scan_res;
- int oper40;
- int res;
-
- /* Check list of neighboring BSSes (from scan) to see whether 40 MHz is
- * allowed per IEEE 802.11n/D7.0, 11.14.3.2 */
-
- iface->scan_cb = NULL;
-
- scan_res = hostapd_driver_get_scan_results(iface->bss[0]);
- if (scan_res == NULL) {
- hostapd_setup_interface_complete(iface, 1);
- return;
- }
-
- if (iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A)
- oper40 = ieee80211n_check_40mhz_5g(iface, scan_res);
- else
- oper40 = ieee80211n_check_40mhz_2g4(iface, scan_res);
- wpa_scan_results_free(scan_res);
-
- if (!oper40) {
- wpa_printf(MSG_INFO, "20/40 MHz operation not permitted on "
- "channel pri=%d sec=%d based on overlapping BSSes",
- iface->conf->channel,
- iface->conf->channel +
- iface->conf->secondary_channel * 4);
- iface->conf->secondary_channel = 0;
- iface->conf->ht_capab &= ~HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
- }
-
- res = ieee80211n_allowed_ht40_channel_pair(iface);
- hostapd_setup_interface_complete(iface, !res);
-}
-
-
-static int ieee80211n_check_40mhz(struct hostapd_iface *iface)
-{
- struct wpa_driver_scan_params params;
-
- if (!iface->conf->secondary_channel)
- return 0; /* HT40 not used */
-
- wpa_printf(MSG_DEBUG, "Scan for neighboring BSSes prior to enabling "
- "40 MHz channel");
- os_memset(¶ms, 0, sizeof(params));
- /* TODO: scan only the needed frequency */
- if (hostapd_driver_scan(iface->bss[0], ¶ms) < 0) {
- wpa_printf(MSG_ERROR, "Failed to request a scan of "
- "neighboring BSSes");
-
- //DRIVER_RTW Modify
- //return -1;
- return 0;//ignore this error
- }
-
- iface->scan_cb = ieee80211n_check_scan;
- return 1;
-}
-
-
-static int ieee80211n_supported_ht_capab(struct hostapd_iface *iface)
-{
- u16 hw = iface->current_mode->ht_capab;
- u16 conf = iface->conf->ht_capab;
-
- if ((conf & HT_CAP_INFO_LDPC_CODING_CAP) &&
- !(hw & HT_CAP_INFO_LDPC_CODING_CAP)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [LDPC]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET) &&
- !(hw & HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [HT40*]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_SMPS_MASK) != (hw & HT_CAP_INFO_SMPS_MASK) &&
- (conf & HT_CAP_INFO_SMPS_MASK) != HT_CAP_INFO_SMPS_DISABLED) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [SMPS-*]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_GREEN_FIELD) &&
- !(hw & HT_CAP_INFO_GREEN_FIELD)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [GF]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_SHORT_GI20MHZ) &&
- !(hw & HT_CAP_INFO_SHORT_GI20MHZ)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [SHORT-GI-20]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_SHORT_GI40MHZ) &&
- !(hw & HT_CAP_INFO_SHORT_GI40MHZ)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [SHORT-GI-40]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_TX_STBC) && !(hw & HT_CAP_INFO_TX_STBC)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [TX-STBC]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_RX_STBC_MASK) >
- (hw & HT_CAP_INFO_RX_STBC_MASK)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [RX-STBC*]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_DELAYED_BA) &&
- !(hw & HT_CAP_INFO_DELAYED_BA)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [DELAYED-BA]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_MAX_AMSDU_SIZE) &&
- !(hw & HT_CAP_INFO_MAX_AMSDU_SIZE)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [MAX-AMSDU-7935]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_DSSS_CCK40MHZ) &&
- !(hw & HT_CAP_INFO_DSSS_CCK40MHZ)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [DSSS_CCK-40]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_PSMP_SUPP) && !(hw & HT_CAP_INFO_PSMP_SUPP)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [PSMP]");
- return 0;
- }
-
- if ((conf & HT_CAP_INFO_LSIG_TXOP_PROTECT_SUPPORT) &&
- !(hw & HT_CAP_INFO_LSIG_TXOP_PROTECT_SUPPORT)) {
- wpa_printf(MSG_ERROR, "Driver does not support configured "
- "HT capability [LSIG-TXOP-PROT]");
- return 0;
- }
-
- return 1;
-}
-
-#endif /* CONFIG_IEEE80211N */
-
-
-int hostapd_check_ht_capab(struct hostapd_iface *iface)
-{
-#ifdef CONFIG_IEEE80211N
- int ret;
- if (!iface->conf->ieee80211n)
- return 0;
- if (!ieee80211n_supported_ht_capab(iface))
- return -1;
- ret = ieee80211n_check_40mhz(iface);
- if (ret)
- return ret;
- if (!ieee80211n_allowed_ht40_channel_pair(iface))
- return -1;
-#endif /* CONFIG_IEEE80211N */
-
- return 0;
-}
-
-
-/**
- * hostapd_select_hw_mode - Select the hardware mode
- * @iface: Pointer to interface data.
- * Returns: 0 on success, -1 on failure
- *
- * Sets up the hardware mode, channel, rates, and passive scanning
- * based on the configuration.
- */
-int hostapd_select_hw_mode(struct hostapd_iface *iface)
-{
- int i, j, ok;
-
- if (iface->num_hw_features < 1)
- return -1;
-
- iface->current_mode = NULL;
- for (i = 0; i < iface->num_hw_features; i++) {
- struct hostapd_hw_modes *mode = &iface->hw_features[i];
- if (mode->mode == iface->conf->hw_mode) {
- iface->current_mode = mode;
- break;
- }
- }
-
- if (iface->current_mode == NULL) {
- wpa_printf(MSG_ERROR, "Hardware does not support configured "
- "mode");
- hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_WARNING,
- "Hardware does not support configured mode "
- "(%d)", (int) iface->conf->hw_mode);
- return -1;
- }
-
- ok = 0;
- for (j = 0; j < iface->current_mode->num_channels; j++) {
- struct hostapd_channel_data *chan =
- &iface->current_mode->channels[j];
- if (!(chan->flag & HOSTAPD_CHAN_DISABLED) &&
- (chan->chan == iface->conf->channel)) {
- ok = 1;
- break;
- }
- }
- if (ok && iface->conf->secondary_channel) {
- int sec_ok = 0;
- int sec_chan = iface->conf->channel +
- iface->conf->secondary_channel * 4;
- for (j = 0; j < iface->current_mode->num_channels; j++) {
- struct hostapd_channel_data *chan =
- &iface->current_mode->channels[j];
- if (!(chan->flag & HOSTAPD_CHAN_DISABLED) &&
- (chan->chan == sec_chan)) {
- sec_ok = 1;
- break;
- }
- }
- if (!sec_ok) {
- hostapd_logger(iface->bss[0], NULL,
- HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_WARNING,
- "Configured HT40 secondary channel "
- "(%d) not found from the channel list "
- "of current mode (%d) %s",
- sec_chan, iface->current_mode->mode,
- hostapd_hw_mode_txt(
- iface->current_mode->mode));
- ok = 0;
- }
- }
- if (iface->conf->channel == 0) {
- /* TODO: could request a scan of neighboring BSSes and select
- * the channel automatically */
- wpa_printf(MSG_ERROR, "Channel not configured "
- "(hw_mode/channel in hostapd.conf)");
- return -1;
- }
- if (ok == 0 && iface->conf->channel != 0) {
- hostapd_logger(iface->bss[0], NULL,
- HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_WARNING,
- "Configured channel (%d) not found from the "
- "channel list of current mode (%d) %s",
- iface->conf->channel,
- iface->current_mode->mode,
- hostapd_hw_mode_txt(iface->current_mode->mode));
- iface->current_mode = NULL;
- }
-
- if (iface->current_mode == NULL) {
- hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_WARNING,
- "Hardware does not support configured channel");
- return -1;
- }
-
- return 0;
-}
-
-
-const char * hostapd_hw_mode_txt(int mode)
-{
- switch (mode) {
- case HOSTAPD_MODE_IEEE80211A:
- return "IEEE 802.11a";
- case HOSTAPD_MODE_IEEE80211B:
- return "IEEE 802.11b";
- case HOSTAPD_MODE_IEEE80211G:
- return "IEEE 802.11g";
- default:
- return "UNKNOWN";
- }
-}
-
-
-int hostapd_hw_get_freq(struct hostapd_data *hapd, int chan)
-{
- int i;
-
- if (!hapd->iface->current_mode)
- return 0;
-
- for (i = 0; i < hapd->iface->current_mode->num_channels; i++) {
- struct hostapd_channel_data *ch =
- &hapd->iface->current_mode->channels[i];
- if (ch->chan == chan)
- return ch->freq;
- }
-
- return 0;
-}
-
-
-int hostapd_hw_get_channel(struct hostapd_data *hapd, int freq)
-{
- int i;
-
- if (!hapd->iface->current_mode)
- return 0;
-
- for (i = 0; i < hapd->iface->current_mode->num_channels; i++) {
- struct hostapd_channel_data *ch =
- &hapd->iface->current_mode->channels[i];
- if (ch->freq == freq)
- return ch->chan;
- }
-
- return 0;
-}
diff --git a/hostapd-0.8/src/ap/hw_features.h b/hostapd-0.8/src/ap/hw_features.h
deleted file mode 100644
index 88c2322..0000000
--- a/hostapd-0.8/src/ap/hw_features.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * hostapd / Hardware feature query and different modes
- * Copyright 2002-2003, Instant802 Networks, Inc.
- * Copyright 2005-2006, Devicescape Software, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef HW_FEATURES_H
-#define HW_FEATURES_H
-
-#ifdef NEED_AP_MLME
-void hostapd_free_hw_features(struct hostapd_hw_modes *hw_features,
- size_t num_hw_features);
-int hostapd_get_hw_features(struct hostapd_iface *iface);
-int hostapd_select_hw_mode(struct hostapd_iface *iface);
-const char * hostapd_hw_mode_txt(int mode);
-int hostapd_hw_get_freq(struct hostapd_data *hapd, int chan);
-int hostapd_hw_get_channel(struct hostapd_data *hapd, int freq);
-int hostapd_check_ht_capab(struct hostapd_iface *iface);
-int hostapd_prepare_rates(struct hostapd_data *hapd,
- struct hostapd_hw_modes *mode);
-#else /* NEED_AP_MLME */
-static inline void
-hostapd_free_hw_features(struct hostapd_hw_modes *hw_features,
- size_t num_hw_features)
-{
-}
-
-static inline int hostapd_get_hw_features(struct hostapd_iface *iface)
-{
- return -1;
-}
-
-static inline int hostapd_select_hw_mode(struct hostapd_iface *iface)
-{
- return -1;
-}
-
-static inline const char * hostapd_hw_mode_txt(int mode)
-{
- return NULL;
-}
-
-static inline int hostapd_hw_get_freq(struct hostapd_data *hapd, int chan)
-{
- return -1;
-}
-
-static inline int hostapd_check_ht_capab(struct hostapd_iface *iface)
-{
- return 0;
-}
-
-static inline int hostapd_prepare_rates(struct hostapd_data *hapd,
- struct hostapd_hw_modes *mode)
-{
- return 0;
-}
-
-#endif /* NEED_AP_MLME */
-
-#endif /* HW_FEATURES_H */
diff --git a/hostapd-0.8/src/ap/iapp.c b/hostapd-0.8/src/ap/iapp.c
deleted file mode 100644
index 115d91e..0000000
--- a/hostapd-0.8/src/ap/iapp.c
+++ /dev/null
@@ -1,535 +0,0 @@
-/*
- * hostapd / IEEE 802.11F-2003 Inter-Access Point Protocol (IAPP)
- * Copyright (c) 2002-2007, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- *
- * Note: IEEE 802.11F-2003 was a experimental use specification. It has expired
- * and IEEE has withdrawn it. In other words, it is likely better to look at
- * using some other mechanism for AP-to-AP communication than extending the
- * implementation here.
- */
-
-/* TODO:
- * Level 1: no administrative or security support
- * (e.g., static BSSID to IP address mapping in each AP)
- * Level 2: support for dynamic mapping of BSSID to IP address
- * Level 3: support for encryption and authentication of IAPP messages
- * - add support for MOVE-notify and MOVE-response (this requires support for
- * finding out IP address for previous AP using RADIUS)
- * - add support for Send- and ACK-Security-Block to speedup IEEE 802.1X during
- * reassociation to another AP
- * - implement counters etc. for IAPP MIB
- * - verify endianness of fields in IAPP messages; are they big-endian as
- * used here?
- * - RADIUS connection for AP registration and BSSID to IP address mapping
- * - TCP connection for IAPP MOVE, CACHE
- * - broadcast ESP for IAPP ADD-notify
- * - ESP for IAPP MOVE messages
- * - security block sending/processing
- * - IEEE 802.11 context transfer
- */
-
-#include "utils/includes.h"
-#include
-#include
-#ifdef USE_KERNEL_HEADERS
-#include
-#else /* USE_KERNEL_HEADERS */
-#include
-#endif /* USE_KERNEL_HEADERS */
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "common/ieee802_11_defs.h"
-#include "hostapd.h"
-#include "ap_config.h"
-#include "ieee802_11.h"
-#include "sta_info.h"
-#include "iapp.h"
-
-
-#define IAPP_MULTICAST "224.0.1.178"
-#define IAPP_UDP_PORT 3517
-#define IAPP_TCP_PORT 3517
-
-struct iapp_hdr {
- u8 version;
- u8 command;
- be16 identifier;
- be16 length;
- /* followed by length-6 octets of data */
-} __attribute__ ((packed));
-
-#define IAPP_VERSION 0
-
-enum IAPP_COMMAND {
- IAPP_CMD_ADD_notify = 0,
- IAPP_CMD_MOVE_notify = 1,
- IAPP_CMD_MOVE_response = 2,
- IAPP_CMD_Send_Security_Block = 3,
- IAPP_CMD_ACK_Security_Block = 4,
- IAPP_CMD_CACHE_notify = 5,
- IAPP_CMD_CACHE_response = 6,
-};
-
-
-/* ADD-notify - multicast UDP on the local LAN */
-struct iapp_add_notify {
- u8 addr_len; /* ETH_ALEN */
- u8 reserved;
- u8 mac_addr[ETH_ALEN];
- be16 seq_num;
-} __attribute__ ((packed));
-
-
-/* Layer 2 Update frame (802.2 Type 1 LLC XID Update response) */
-struct iapp_layer2_update {
- u8 da[ETH_ALEN]; /* broadcast */
- u8 sa[ETH_ALEN]; /* STA addr */
- be16 len; /* 6 */
- u8 dsap; /* null DSAP address */
- u8 ssap; /* null SSAP address, CR=Response */
- u8 control;
- u8 xid_info[3];
-} __attribute__ ((packed));
-
-
-/* MOVE-notify - unicast TCP */
-struct iapp_move_notify {
- u8 addr_len; /* ETH_ALEN */
- u8 reserved;
- u8 mac_addr[ETH_ALEN];
- u16 seq_num;
- u16 ctx_block_len;
- /* followed by ctx_block_len bytes */
-} __attribute__ ((packed));
-
-
-/* MOVE-response - unicast TCP */
-struct iapp_move_response {
- u8 addr_len; /* ETH_ALEN */
- u8 status;
- u8 mac_addr[ETH_ALEN];
- u16 seq_num;
- u16 ctx_block_len;
- /* followed by ctx_block_len bytes */
-} __attribute__ ((packed));
-
-enum {
- IAPP_MOVE_SUCCESSFUL = 0,
- IAPP_MOVE_DENIED = 1,
- IAPP_MOVE_STALE_MOVE = 2,
-};
-
-
-/* CACHE-notify */
-struct iapp_cache_notify {
- u8 addr_len; /* ETH_ALEN */
- u8 reserved;
- u8 mac_addr[ETH_ALEN];
- u16 seq_num;
- u8 current_ap[ETH_ALEN];
- u16 ctx_block_len;
- /* ctx_block_len bytes of context block followed by 16-bit context
- * timeout */
-} __attribute__ ((packed));
-
-
-/* CACHE-response - unicast TCP */
-struct iapp_cache_response {
- u8 addr_len; /* ETH_ALEN */
- u8 status;
- u8 mac_addr[ETH_ALEN];
- u16 seq_num;
-} __attribute__ ((packed));
-
-enum {
- IAPP_CACHE_SUCCESSFUL = 0,
- IAPP_CACHE_STALE_CACHE = 1,
-};
-
-
-/* Send-Security-Block - unicast TCP */
-struct iapp_send_security_block {
- u8 iv[8];
- u16 sec_block_len;
- /* followed by sec_block_len bytes of security block */
-} __attribute__ ((packed));
-
-
-/* ACK-Security-Block - unicast TCP */
-struct iapp_ack_security_block {
- u8 iv[8];
- u8 new_ap_ack_authenticator[48];
-} __attribute__ ((packed));
-
-
-struct iapp_data {
- struct hostapd_data *hapd;
- u16 identifier; /* next IAPP identifier */
- struct in_addr own, multicast;
- int udp_sock;
- int packet_sock;
-};
-
-
-static void iapp_send_add(struct iapp_data *iapp, u8 *mac_addr, u16 seq_num)
-{
- char buf[128];
- struct iapp_hdr *hdr;
- struct iapp_add_notify *add;
- struct sockaddr_in addr;
-
- /* Send IAPP ADD-notify to remove possible association from other APs
- */
-
- hdr = (struct iapp_hdr *) buf;
- hdr->version = IAPP_VERSION;
- hdr->command = IAPP_CMD_ADD_notify;
- hdr->identifier = host_to_be16(iapp->identifier++);
- hdr->length = host_to_be16(sizeof(*hdr) + sizeof(*add));
-
- add = (struct iapp_add_notify *) (hdr + 1);
- add->addr_len = ETH_ALEN;
- add->reserved = 0;
- os_memcpy(add->mac_addr, mac_addr, ETH_ALEN);
-
- add->seq_num = host_to_be16(seq_num);
-
- os_memset(&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = iapp->multicast.s_addr;
- addr.sin_port = htons(IAPP_UDP_PORT);
- if (sendto(iapp->udp_sock, buf, (char *) (add + 1) - buf, 0,
- (struct sockaddr *) &addr, sizeof(addr)) < 0)
- perror("sendto[IAPP-ADD]");
-}
-
-
-static void iapp_send_layer2_update(struct iapp_data *iapp, u8 *addr)
-{
- struct iapp_layer2_update msg;
-
- /* Send Level 2 Update Frame to update forwarding tables in layer 2
- * bridge devices */
-
- /* 802.2 Type 1 Logical Link Control (LLC) Exchange Identifier (XID)
- * Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */
-
- os_memset(msg.da, 0xff, ETH_ALEN);
- os_memcpy(msg.sa, addr, ETH_ALEN);
- msg.len = host_to_be16(6);
- msg.dsap = 0; /* NULL DSAP address */
- msg.ssap = 0x01; /* NULL SSAP address, CR Bit: Response */
- msg.control = 0xaf; /* XID response lsb.1111F101.
- * F=0 (no poll command; unsolicited frame) */
- msg.xid_info[0] = 0x81; /* XID format identifier */
- msg.xid_info[1] = 1; /* LLC types/classes: Type 1 LLC */
- msg.xid_info[2] = 1 << 1; /* XID sender's receive window size (RW)
- * FIX: what is correct RW with 802.11? */
-
- if (send(iapp->packet_sock, &msg, sizeof(msg), 0) < 0)
- perror("send[L2 Update]");
-}
-
-
-/**
- * iapp_new_station - IAPP processing for a new STA
- * @iapp: IAPP data
- * @sta: The associated station
- */
-void iapp_new_station(struct iapp_data *iapp, struct sta_info *sta)
-{
- struct ieee80211_mgmt *assoc;
- u16 seq;
-
- if (iapp == NULL)
- return;
-
- assoc = sta->last_assoc_req;
- seq = assoc ? WLAN_GET_SEQ_SEQ(le_to_host16(assoc->seq_ctrl)) : 0;
-
- /* IAPP-ADD.request(MAC Address, Sequence Number, Timeout) */
- hostapd_logger(iapp->hapd, sta->addr, HOSTAPD_MODULE_IAPP,
- HOSTAPD_LEVEL_DEBUG, "IAPP-ADD.request(seq=%d)", seq);
- iapp_send_layer2_update(iapp, sta->addr);
- iapp_send_add(iapp, sta->addr, seq);
-
- if (assoc && WLAN_FC_GET_STYPE(le_to_host16(assoc->frame_control)) ==
- WLAN_FC_STYPE_REASSOC_REQ) {
- /* IAPP-MOVE.request(MAC Address, Sequence Number, Old AP,
- * Context Block, Timeout)
- */
- /* TODO: Send IAPP-MOVE to the old AP; Map Old AP BSSID to
- * IP address */
- }
-}
-
-
-static void iapp_process_add_notify(struct iapp_data *iapp,
- struct sockaddr_in *from,
- struct iapp_hdr *hdr, int len)
-{
- struct iapp_add_notify *add = (struct iapp_add_notify *) (hdr + 1);
- struct sta_info *sta;
-
- if (len != sizeof(*add)) {
- printf("Invalid IAPP-ADD packet length %d (expected %lu)\n",
- len, (unsigned long) sizeof(*add));
- return;
- }
-
- sta = ap_get_sta(iapp->hapd, add->mac_addr);
-
- /* IAPP-ADD.indication(MAC Address, Sequence Number) */
- hostapd_logger(iapp->hapd, add->mac_addr, HOSTAPD_MODULE_IAPP,
- HOSTAPD_LEVEL_INFO,
- "Received IAPP ADD-notify (seq# %d) from %s:%d%s",
- be_to_host16(add->seq_num),
- inet_ntoa(from->sin_addr), ntohs(from->sin_port),
- sta ? "" : " (STA not found)");
-
- if (!sta)
- return;
-
- /* TODO: could use seq_num to try to determine whether last association
- * to this AP is newer than the one advertised in IAPP-ADD. Although,
- * this is not really a reliable verification. */
-
- hostapd_logger(iapp->hapd, add->mac_addr, HOSTAPD_MODULE_IAPP,
- HOSTAPD_LEVEL_DEBUG,
- "Removing STA due to IAPP ADD-notify");
- ap_sta_disconnect(iapp->hapd, sta, NULL, 0);
-}
-
-
-/**
- * iapp_receive_udp - Process IAPP UDP frames
- * @sock: File descriptor for the socket
- * @eloop_ctx: IAPP data (struct iapp_data *)
- * @sock_ctx: Not used
- */
-static void iapp_receive_udp(int sock, void *eloop_ctx, void *sock_ctx)
-{
- struct iapp_data *iapp = eloop_ctx;
- int len, hlen;
- unsigned char buf[128];
- struct sockaddr_in from;
- socklen_t fromlen;
- struct iapp_hdr *hdr;
-
- /* Handle incoming IAPP frames (over UDP/IP) */
-
- fromlen = sizeof(from);
- len = recvfrom(iapp->udp_sock, buf, sizeof(buf), 0,
- (struct sockaddr *) &from, &fromlen);
- if (len < 0) {
- perror("recvfrom");
- return;
- }
-
- if (from.sin_addr.s_addr == iapp->own.s_addr)
- return; /* ignore own IAPP messages */
-
- hostapd_logger(iapp->hapd, NULL, HOSTAPD_MODULE_IAPP,
- HOSTAPD_LEVEL_DEBUG,
- "Received %d byte IAPP frame from %s%s\n",
- len, inet_ntoa(from.sin_addr),
- len < (int) sizeof(*hdr) ? " (too short)" : "");
-
- if (len < (int) sizeof(*hdr))
- return;
-
- hdr = (struct iapp_hdr *) buf;
- hlen = be_to_host16(hdr->length);
- hostapd_logger(iapp->hapd, NULL, HOSTAPD_MODULE_IAPP,
- HOSTAPD_LEVEL_DEBUG,
- "RX: version=%d command=%d id=%d len=%d\n",
- hdr->version, hdr->command,
- be_to_host16(hdr->identifier), hlen);
- if (hdr->version != IAPP_VERSION) {
- printf("Dropping IAPP frame with unknown version %d\n",
- hdr->version);
- return;
- }
- if (hlen > len) {
- printf("Underflow IAPP frame (hlen=%d len=%d)\n", hlen, len);
- return;
- }
- if (hlen < len) {
- printf("Ignoring %d extra bytes from IAPP frame\n",
- len - hlen);
- len = hlen;
- }
-
- switch (hdr->command) {
- case IAPP_CMD_ADD_notify:
- iapp_process_add_notify(iapp, &from, hdr, hlen - sizeof(*hdr));
- break;
- case IAPP_CMD_MOVE_notify:
- /* TODO: MOVE is using TCP; so move this to TCP handler once it
- * is implemented.. */
- /* IAPP-MOVE.indication(MAC Address, New BSSID,
- * Sequence Number, AP Address, Context Block) */
- /* TODO: process */
- break;
- default:
- printf("Unknown IAPP command %d\n", hdr->command);
- break;
- }
-}
-
-
-struct iapp_data * iapp_init(struct hostapd_data *hapd, const char *iface)
-{
- struct ifreq ifr;
- struct sockaddr_ll addr;
- int ifindex;
- struct sockaddr_in *paddr, uaddr;
- struct iapp_data *iapp;
- struct ip_mreqn mreq;
-
- iapp = os_zalloc(sizeof(*iapp));
- if (iapp == NULL)
- return NULL;
- iapp->hapd = hapd;
- iapp->udp_sock = iapp->packet_sock = -1;
-
- /* TODO:
- * open socket for sending and receiving IAPP frames over TCP
- */
-
- iapp->udp_sock = socket(PF_INET, SOCK_DGRAM, 0);
- if (iapp->udp_sock < 0) {
- perror("socket[PF_INET,SOCK_DGRAM]");
- iapp_deinit(iapp);
- return NULL;
- }
-
- os_memset(&ifr, 0, sizeof(ifr));
- os_strlcpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name));
- if (ioctl(iapp->udp_sock, SIOCGIFINDEX, &ifr) != 0) {
- perror("ioctl(SIOCGIFINDEX)");
- iapp_deinit(iapp);
- return NULL;
- }
- ifindex = ifr.ifr_ifindex;
-
- if (ioctl(iapp->udp_sock, SIOCGIFADDR, &ifr) != 0) {
- perror("ioctl(SIOCGIFADDR)");
- iapp_deinit(iapp);
- return NULL;
- }
- paddr = (struct sockaddr_in *) &ifr.ifr_addr;
- if (paddr->sin_family != AF_INET) {
- printf("Invalid address family %i (SIOCGIFADDR)\n",
- paddr->sin_family);
- iapp_deinit(iapp);
- return NULL;
- }
- iapp->own.s_addr = paddr->sin_addr.s_addr;
-
- if (ioctl(iapp->udp_sock, SIOCGIFBRDADDR, &ifr) != 0) {
- perror("ioctl(SIOCGIFBRDADDR)");
- iapp_deinit(iapp);
- return NULL;
- }
- paddr = (struct sockaddr_in *) &ifr.ifr_addr;
- if (paddr->sin_family != AF_INET) {
- printf("Invalid address family %i (SIOCGIFBRDADDR)\n",
- paddr->sin_family);
- iapp_deinit(iapp);
- return NULL;
- }
- inet_aton(IAPP_MULTICAST, &iapp->multicast);
-
- os_memset(&uaddr, 0, sizeof(uaddr));
- uaddr.sin_family = AF_INET;
- uaddr.sin_port = htons(IAPP_UDP_PORT);
- if (bind(iapp->udp_sock, (struct sockaddr *) &uaddr,
- sizeof(uaddr)) < 0) {
- perror("bind[UDP]");
- iapp_deinit(iapp);
- return NULL;
- }
-
- os_memset(&mreq, 0, sizeof(mreq));
- mreq.imr_multiaddr = iapp->multicast;
- mreq.imr_address.s_addr = INADDR_ANY;
- mreq.imr_ifindex = 0;
- if (setsockopt(iapp->udp_sock, SOL_IP, IP_ADD_MEMBERSHIP, &mreq,
- sizeof(mreq)) < 0) {
- perror("setsockopt[UDP,IP_ADD_MEMBERSHIP]");
- iapp_deinit(iapp);
- return NULL;
- }
-
- iapp->packet_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
- if (iapp->packet_sock < 0) {
- perror("socket[PF_PACKET,SOCK_RAW]");
- iapp_deinit(iapp);
- return NULL;
- }
-
- os_memset(&addr, 0, sizeof(addr));
- addr.sll_family = AF_PACKET;
- addr.sll_ifindex = ifindex;
- if (bind(iapp->packet_sock, (struct sockaddr *) &addr,
- sizeof(addr)) < 0) {
- perror("bind[PACKET]");
- iapp_deinit(iapp);
- return NULL;
- }
-
- if (eloop_register_read_sock(iapp->udp_sock, iapp_receive_udp,
- iapp, NULL)) {
- printf("Could not register read socket for IAPP.\n");
- iapp_deinit(iapp);
- return NULL;
- }
-
- printf("IEEE 802.11F (IAPP) using interface %s\n", iface);
-
- /* TODO: For levels 2 and 3: send RADIUS Initiate-Request, receive
- * RADIUS Initiate-Accept or Initiate-Reject. IAPP port should actually
- * be openned only after receiving Initiate-Accept. If Initiate-Reject
- * is received, IAPP is not started. */
-
- return iapp;
-}
-
-
-void iapp_deinit(struct iapp_data *iapp)
-{
- struct ip_mreqn mreq;
-
- if (iapp == NULL)
- return;
-
- if (iapp->udp_sock >= 0) {
- os_memset(&mreq, 0, sizeof(mreq));
- mreq.imr_multiaddr = iapp->multicast;
- mreq.imr_address.s_addr = INADDR_ANY;
- mreq.imr_ifindex = 0;
- if (setsockopt(iapp->udp_sock, SOL_IP, IP_DROP_MEMBERSHIP,
- &mreq, sizeof(mreq)) < 0) {
- perror("setsockopt[UDP,IP_DEL_MEMBERSHIP]");
- }
-
- eloop_unregister_read_sock(iapp->udp_sock);
- close(iapp->udp_sock);
- }
- if (iapp->packet_sock >= 0) {
- eloop_unregister_read_sock(iapp->packet_sock);
- close(iapp->packet_sock);
- }
- os_free(iapp);
-}
diff --git a/hostapd-0.8/src/ap/iapp.h b/hostapd-0.8/src/ap/iapp.h
deleted file mode 100644
index 5fc01cb..0000000
--- a/hostapd-0.8/src/ap/iapp.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * hostapd / IEEE 802.11F-2003 Inter-Access Point Protocol (IAPP)
- * Copyright (c) 2002-2005, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef IAPP_H
-#define IAPP_H
-
-struct iapp_data;
-
-#ifdef CONFIG_IAPP
-
-void iapp_new_station(struct iapp_data *iapp, struct sta_info *sta);
-struct iapp_data * iapp_init(struct hostapd_data *hapd, const char *iface);
-void iapp_deinit(struct iapp_data *iapp);
-
-#else /* CONFIG_IAPP */
-
-static inline void iapp_new_station(struct iapp_data *iapp,
- struct sta_info *sta)
-{
-}
-
-static inline struct iapp_data * iapp_init(struct hostapd_data *hapd,
- const char *iface)
-{
- return NULL;
-}
-
-static inline void iapp_deinit(struct iapp_data *iapp)
-{
-}
-
-#endif /* CONFIG_IAPP */
-
-#endif /* IAPP_H */
diff --git a/hostapd-0.8/src/ap/ieee802_11.c b/hostapd-0.8/src/ap/ieee802_11.c
deleted file mode 100644
index 1fd4dab..0000000
--- a/hostapd-0.8/src/ap/ieee802_11.c
+++ /dev/null
@@ -1,1884 +0,0 @@
-/*
- * hostapd / IEEE 802.11 Management
- * Copyright (c) 2002-2010, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#ifndef CONFIG_NATIVE_WINDOWS
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "crypto/crypto.h"
-#include "drivers/driver.h"
-#include "common/ieee802_11_defs.h"
-#include "common/ieee802_11_common.h"
-#include "common/wpa_ctrl.h"
-#include "radius/radius.h"
-#include "radius/radius_client.h"
-#include "p2p/p2p.h"
-#include "wps/wps.h"
-#include "hostapd.h"
-#include "beacon.h"
-#include "ieee802_11_auth.h"
-#include "sta_info.h"
-#include "ieee802_1x.h"
-#include "wpa_auth.h"
-#include "wmm.h"
-#include "ap_list.h"
-#include "accounting.h"
-#include "ap_config.h"
-#include "ap_mlme.h"
-#include "p2p_hostapd.h"
-#include "ap_drv_ops.h"
-#include "ieee802_11.h"
-
-
-u8 * hostapd_eid_supp_rates(struct hostapd_data *hapd, u8 *eid)
-{
- u8 *pos = eid;
- int i, num, count;
-
- if (hapd->iface->current_rates == NULL)
- return eid;
-
- *pos++ = WLAN_EID_SUPP_RATES;
- num = hapd->iface->num_rates;
- if (hapd->iconf->ieee80211n && hapd->iconf->require_ht)
- num++;
- if (num > 8) {
- /* rest of the rates are encoded in Extended supported
- * rates element */
- num = 8;
- }
-
- *pos++ = num;
- count = 0;
- for (i = 0, count = 0; i < hapd->iface->num_rates && count < num;
- i++) {
- count++;
- *pos = hapd->iface->current_rates[i].rate / 5;
- if (hapd->iface->current_rates[i].flags & HOSTAPD_RATE_BASIC)
- *pos |= 0x80;
- pos++;
- }
-
- if (hapd->iconf->ieee80211n && hapd->iconf->require_ht &&
- hapd->iface->num_rates < 8)
- *pos++ = 0x80 | BSS_MEMBERSHIP_SELECTOR_HT_PHY;
-
- return pos;
-}
-
-
-u8 * hostapd_eid_ext_supp_rates(struct hostapd_data *hapd, u8 *eid)
-{
- u8 *pos = eid;
- int i, num, count;
-
- if (hapd->iface->current_rates == NULL)
- return eid;
-
- num = hapd->iface->num_rates;
- if (hapd->iconf->ieee80211n && hapd->iconf->require_ht)
- num++;
- if (num <= 8)
- return eid;
- num -= 8;
-
- *pos++ = WLAN_EID_EXT_SUPP_RATES;
- *pos++ = num;
- count = 0;
- for (i = 0, count = 0; i < hapd->iface->num_rates && count < num + 8;
- i++) {
- count++;
- if (count <= 8)
- continue; /* already in SuppRates IE */
- *pos = hapd->iface->current_rates[i].rate / 5;
- if (hapd->iface->current_rates[i].flags & HOSTAPD_RATE_BASIC)
- *pos |= 0x80;
- pos++;
- }
-
- if (hapd->iconf->ieee80211n && hapd->iconf->require_ht &&
- hapd->iface->num_rates >= 8)
- *pos++ = 0x80 | BSS_MEMBERSHIP_SELECTOR_HT_PHY;
-
- return pos;
-}
-
-
-u16 hostapd_own_capab_info(struct hostapd_data *hapd, struct sta_info *sta,
- int probe)
-{
- int capab = WLAN_CAPABILITY_ESS;
- int privacy;
-
- if (hapd->iface->num_sta_no_short_preamble == 0 &&
- hapd->iconf->preamble == SHORT_PREAMBLE)
- capab |= WLAN_CAPABILITY_SHORT_PREAMBLE;
-
- privacy = hapd->conf->ssid.wep.keys_set;
-
- if (hapd->conf->ieee802_1x &&
- (hapd->conf->default_wep_key_len ||
- hapd->conf->individual_wep_key_len))
- privacy = 1;
-
- if (hapd->conf->wpa)
- privacy = 1;
-
- if (sta) {
- int policy, def_klen;
- if (probe && sta->ssid_probe) {
- policy = sta->ssid_probe->security_policy;
- def_klen = sta->ssid_probe->wep.default_len;
- } else {
- policy = sta->ssid->security_policy;
- def_klen = sta->ssid->wep.default_len;
- }
- privacy = policy != SECURITY_PLAINTEXT;
- if (policy == SECURITY_IEEE_802_1X && def_klen == 0)
- privacy = 0;
- }
-
- if (privacy)
- capab |= WLAN_CAPABILITY_PRIVACY;
-
- if (hapd->iface->current_mode &&
- hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G &&
- hapd->iface->num_sta_no_short_slot_time == 0)
- capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME;
-
- return capab;
-}
-
-
-u8 * hostapd_eid_ext_capab(struct hostapd_data *hapd, u8 *eid)
-{
- u8 *pos = eid;
-
- if ((hapd->conf->tdls & (TDLS_PROHIBIT | TDLS_PROHIBIT_CHAN_SWITCH)) ==
- 0)
- return eid;
-
- *pos++ = WLAN_EID_EXT_CAPAB;
- *pos++ = 5;
- *pos++ = 0x00;
- *pos++ = 0x00;
- *pos++ = 0x00;
- *pos++ = 0x00;
- *pos = 0x00;
- if (hapd->conf->tdls & TDLS_PROHIBIT)
- *pos |= 0x40; /* Bit 38 - TDLS Prohibited */
- if (hapd->conf->tdls & TDLS_PROHIBIT_CHAN_SWITCH)
- *pos |= 0x80; /* Bit 39 - TDLS Channel Switching Prohibited */
- pos++;
-
- return pos;
-}
-
-
-#ifdef CONFIG_IEEE80211W
-static u8 * hostapd_eid_assoc_comeback_time(struct hostapd_data *hapd,
- struct sta_info *sta, u8 *eid)
-{
- u8 *pos = eid;
- u32 timeout, tu;
- struct os_time now, passed;
-
- *pos++ = WLAN_EID_TIMEOUT_INTERVAL;
- *pos++ = 5;
- *pos++ = WLAN_TIMEOUT_ASSOC_COMEBACK;
- os_get_time(&now);
- os_time_sub(&now, &sta->sa_query_start, &passed);
- tu = (passed.sec * 1000000 + passed.usec) / 1024;
- if (hapd->conf->assoc_sa_query_max_timeout > tu)
- timeout = hapd->conf->assoc_sa_query_max_timeout - tu;
- else
- timeout = 0;
- if (timeout < hapd->conf->assoc_sa_query_max_timeout)
- timeout++; /* add some extra time for local timers */
- WPA_PUT_LE32(pos, timeout);
- pos += 4;
-
- return pos;
-}
-#endif /* CONFIG_IEEE80211W */
-
-
-void ieee802_11_print_ssid(char *buf, const u8 *ssid, u8 len)
-{
- int i;
- if (len > HOSTAPD_MAX_SSID_LEN)
- len = HOSTAPD_MAX_SSID_LEN;
- for (i = 0; i < len; i++) {
- if (ssid[i] >= 32 && ssid[i] < 127)
- buf[i] = ssid[i];
- else
- buf[i] = '.';
- }
- buf[len] = '\0';
-}
-
-
-static u16 auth_shared_key(struct hostapd_data *hapd, struct sta_info *sta,
- u16 auth_transaction, const u8 *challenge,
- int iswep)
-{
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "authentication (shared key, transaction %d)",
- auth_transaction);
-
- if (auth_transaction == 1) {
- if (!sta->challenge) {
- /* Generate a pseudo-random challenge */
- u8 key[8];
- struct os_time now;
- int r;
- sta->challenge = os_zalloc(WLAN_AUTH_CHALLENGE_LEN);
- if (sta->challenge == NULL)
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
-
- os_get_time(&now);
- r = os_random();
- os_memcpy(key, &now.sec, 4);
- os_memcpy(key + 4, &r, 4);
- rc4_skip(key, sizeof(key), 0,
- sta->challenge, WLAN_AUTH_CHALLENGE_LEN);
- }
- return 0;
- }
-
- if (auth_transaction != 3)
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
-
- /* Transaction 3 */
- if (!iswep || !sta->challenge || !challenge ||
- os_memcmp(sta->challenge, challenge, WLAN_AUTH_CHALLENGE_LEN)) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO,
- "shared key authentication - invalid "
- "challenge-response");
- return WLAN_STATUS_CHALLENGE_FAIL;
- }
-
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "authentication OK (shared key)");
-#ifdef IEEE80211_REQUIRE_AUTH_ACK
- /* Station will be marked authenticated if it ACKs the
- * authentication reply. */
-#else
- sta->flags |= WLAN_STA_AUTH;
- wpa_auth_sm_event(sta->wpa_sm, WPA_AUTH);
-#endif
- os_free(sta->challenge);
- sta->challenge = NULL;
-
- return 0;
-}
-
-
-static void send_auth_reply(struct hostapd_data *hapd,
- const u8 *dst, const u8 *bssid,
- u16 auth_alg, u16 auth_transaction, u16 resp,
- const u8 *ies, size_t ies_len)
-{
- struct ieee80211_mgmt *reply;
- u8 *buf;
- size_t rlen;
-
- rlen = IEEE80211_HDRLEN + sizeof(reply->u.auth) + ies_len;
- buf = os_zalloc(rlen);
- if (buf == NULL)
- return;
-
- reply = (struct ieee80211_mgmt *) buf;
- reply->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
- WLAN_FC_STYPE_AUTH);
- os_memcpy(reply->da, dst, ETH_ALEN);
- os_memcpy(reply->sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(reply->bssid, bssid, ETH_ALEN);
-
- reply->u.auth.auth_alg = host_to_le16(auth_alg);
- reply->u.auth.auth_transaction = host_to_le16(auth_transaction);
- reply->u.auth.status_code = host_to_le16(resp);
-
- if (ies && ies_len)
- os_memcpy(reply->u.auth.variable, ies, ies_len);
-
- wpa_printf(MSG_DEBUG, "authentication reply: STA=" MACSTR
- " auth_alg=%d auth_transaction=%d resp=%d (IE len=%lu)",
- MAC2STR(dst), auth_alg, auth_transaction,
- resp, (unsigned long) ies_len);
- if (hostapd_drv_send_mlme(hapd, reply, rlen) < 0)
- perror("send_auth_reply: send");
-
- os_free(buf);
-}
-
-
-#ifdef CONFIG_IEEE80211R
-static void handle_auth_ft_finish(void *ctx, const u8 *dst, const u8 *bssid,
- u16 auth_transaction, u16 status,
- const u8 *ies, size_t ies_len)
-{
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta;
-
- send_auth_reply(hapd, dst, bssid, WLAN_AUTH_FT, auth_transaction,
- status, ies, ies_len);
-
- if (status != WLAN_STATUS_SUCCESS)
- return;
-
- sta = ap_get_sta(hapd, dst);
- if (sta == NULL)
- return;
-
- hostapd_logger(hapd, dst, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG, "authentication OK (FT)");
- sta->flags |= WLAN_STA_AUTH;
- mlme_authenticate_indication(hapd, sta);
-}
-#endif /* CONFIG_IEEE80211R */
-
-
-static void handle_auth(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt, size_t len)
-{
- u16 auth_alg, auth_transaction, status_code;
- u16 resp = WLAN_STATUS_SUCCESS;
- struct sta_info *sta = NULL;
- int res;
- u16 fc;
- const u8 *challenge = NULL;
- u32 session_timeout, acct_interim_interval;
- int vlan_id = 0;
- u8 resp_ies[2 + WLAN_AUTH_CHALLENGE_LEN];
- size_t resp_ies_len = 0;
-
- if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.auth)) {
- printf("handle_auth - too short payload (len=%lu)\n",
- (unsigned long) len);
- return;
- }
-
- auth_alg = le_to_host16(mgmt->u.auth.auth_alg);
- auth_transaction = le_to_host16(mgmt->u.auth.auth_transaction);
- status_code = le_to_host16(mgmt->u.auth.status_code);
- fc = le_to_host16(mgmt->frame_control);
-
- if (len >= IEEE80211_HDRLEN + sizeof(mgmt->u.auth) +
- 2 + WLAN_AUTH_CHALLENGE_LEN &&
- mgmt->u.auth.variable[0] == WLAN_EID_CHALLENGE &&
- mgmt->u.auth.variable[1] == WLAN_AUTH_CHALLENGE_LEN)
- challenge = &mgmt->u.auth.variable[2];
-
- wpa_printf(MSG_DEBUG, "authentication: STA=" MACSTR " auth_alg=%d "
- "auth_transaction=%d status_code=%d wep=%d%s",
- MAC2STR(mgmt->sa), auth_alg, auth_transaction,
- status_code, !!(fc & WLAN_FC_ISWEP),
- challenge ? " challenge" : "");
-
- if (hapd->tkip_countermeasures) {
- resp = WLAN_REASON_MICHAEL_MIC_FAILURE;
- goto fail;
- }
-
- if (!(((hapd->conf->auth_algs & WPA_AUTH_ALG_OPEN) &&
- auth_alg == WLAN_AUTH_OPEN) ||
-#ifdef CONFIG_IEEE80211R
- (hapd->conf->wpa &&
- (hapd->conf->wpa_key_mgmt &
- (WPA_KEY_MGMT_FT_IEEE8021X | WPA_KEY_MGMT_FT_PSK)) &&
- auth_alg == WLAN_AUTH_FT) ||
-#endif /* CONFIG_IEEE80211R */
- ((hapd->conf->auth_algs & WPA_AUTH_ALG_SHARED) &&
- auth_alg == WLAN_AUTH_SHARED_KEY))) {
- printf("Unsupported authentication algorithm (%d)\n",
- auth_alg);
- resp = WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG;
- goto fail;
- }
-
- if (!(auth_transaction == 1 ||
- (auth_alg == WLAN_AUTH_SHARED_KEY && auth_transaction == 3))) {
- printf("Unknown authentication transaction number (%d)\n",
- auth_transaction);
- resp = WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION;
- goto fail;
- }
-
- if (os_memcmp(mgmt->sa, hapd->own_addr, ETH_ALEN) == 0) {
- printf("Station " MACSTR " not allowed to authenticate.\n",
- MAC2STR(mgmt->sa));
- resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
- goto fail;
- }
-
- res = hostapd_allowed_address(hapd, mgmt->sa, (u8 *) mgmt, len,
- &session_timeout,
- &acct_interim_interval, &vlan_id);
- if (res == HOSTAPD_ACL_REJECT) {
- printf("Station " MACSTR " not allowed to authenticate.\n",
- MAC2STR(mgmt->sa));
- resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
- goto fail;
- }
- if (res == HOSTAPD_ACL_PENDING) {
- wpa_printf(MSG_DEBUG, "Authentication frame from " MACSTR
- " waiting for an external authentication",
- MAC2STR(mgmt->sa));
- /* Authentication code will re-send the authentication frame
- * after it has received (and cached) information from the
- * external source. */
- return;
- }
-
- sta = ap_sta_add(hapd, mgmt->sa);
- if (!sta) {
- resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
- goto fail;
- }
-
- if (vlan_id > 0) {
- if (hostapd_get_vlan_id_ifname(hapd->conf->vlan,
- vlan_id) == NULL) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_RADIUS,
- HOSTAPD_LEVEL_INFO, "Invalid VLAN ID "
- "%d received from RADIUS server",
- vlan_id);
- resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
- goto fail;
- }
- sta->vlan_id = vlan_id;
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_RADIUS,
- HOSTAPD_LEVEL_INFO, "VLAN ID %d", sta->vlan_id);
- }
-
- sta->flags &= ~WLAN_STA_PREAUTH;
- ieee802_1x_notify_pre_auth(sta->eapol_sm, 0);
-
- if (hapd->conf->acct_interim_interval == 0 && acct_interim_interval)
- sta->acct_interim_interval = acct_interim_interval;
- if (res == HOSTAPD_ACL_ACCEPT_TIMEOUT)
- ap_sta_session_timeout(hapd, sta, session_timeout);
- else
- ap_sta_no_session_timeout(hapd, sta);
-
- switch (auth_alg) {
- case WLAN_AUTH_OPEN:
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "authentication OK (open system)");
-#ifdef IEEE80211_REQUIRE_AUTH_ACK
- /* Station will be marked authenticated if it ACKs the
- * authentication reply. */
-#else
- sta->flags |= WLAN_STA_AUTH;
- wpa_auth_sm_event(sta->wpa_sm, WPA_AUTH);
- sta->auth_alg = WLAN_AUTH_OPEN;
- mlme_authenticate_indication(hapd, sta);
-#endif
- break;
- case WLAN_AUTH_SHARED_KEY:
- resp = auth_shared_key(hapd, sta, auth_transaction, challenge,
- fc & WLAN_FC_ISWEP);
- sta->auth_alg = WLAN_AUTH_SHARED_KEY;
- mlme_authenticate_indication(hapd, sta);
- if (sta->challenge && auth_transaction == 1) {
- resp_ies[0] = WLAN_EID_CHALLENGE;
- resp_ies[1] = WLAN_AUTH_CHALLENGE_LEN;
- os_memcpy(resp_ies + 2, sta->challenge,
- WLAN_AUTH_CHALLENGE_LEN);
- resp_ies_len = 2 + WLAN_AUTH_CHALLENGE_LEN;
- }
- break;
-#ifdef CONFIG_IEEE80211R
- case WLAN_AUTH_FT:
- sta->auth_alg = WLAN_AUTH_FT;
- if (sta->wpa_sm == NULL)
- sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth,
- sta->addr);
- if (sta->wpa_sm == NULL) {
- wpa_printf(MSG_DEBUG, "FT: Failed to initialize WPA "
- "state machine");
- resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
- goto fail;
- }
- wpa_ft_process_auth(sta->wpa_sm, mgmt->bssid,
- auth_transaction, mgmt->u.auth.variable,
- len - IEEE80211_HDRLEN -
- sizeof(mgmt->u.auth),
- handle_auth_ft_finish, hapd);
- /* handle_auth_ft_finish() callback will complete auth. */
- return;
-#endif /* CONFIG_IEEE80211R */
- }
-
- fail:
- send_auth_reply(hapd, mgmt->sa, mgmt->bssid, auth_alg,
- auth_transaction + 1, resp, resp_ies, resp_ies_len);
-}
-
-
-static int hostapd_get_aid(struct hostapd_data *hapd, struct sta_info *sta)
-{
- int i, j = 32, aid;
-
- /* get a unique AID */
- if (sta->aid > 0) {
- wpa_printf(MSG_DEBUG, " old AID %d", sta->aid);
- return 0;
- }
-
- for (i = 0; i < AID_WORDS; i++) {
- if (hapd->sta_aid[i] == (u32) -1)
- continue;
- for (j = 0; j < 32; j++) {
- if (!(hapd->sta_aid[i] & BIT(j)))
- break;
- }
- if (j < 32)
- break;
- }
- if (j == 32)
- return -1;
- aid = i * 32 + j + 1;
- if (aid > 2007)
- return -1;
-
- sta->aid = aid;
- hapd->sta_aid[i] |= BIT(j);
- wpa_printf(MSG_DEBUG, " new AID %d", sta->aid);
- return 0;
-}
-
-
-static u16 check_ssid(struct hostapd_data *hapd, struct sta_info *sta,
- const u8 *ssid_ie, size_t ssid_ie_len)
-{
- if (ssid_ie == NULL)
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
-
- if (ssid_ie_len != hapd->conf->ssid.ssid_len ||
- os_memcmp(ssid_ie, hapd->conf->ssid.ssid, ssid_ie_len) != 0) {
- char ssid_txt[33];
- ieee802_11_print_ssid(ssid_txt, ssid_ie, ssid_ie_len);
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO,
- "Station tried to associate with unknown SSID "
- "'%s'", ssid_txt);
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- return WLAN_STATUS_SUCCESS;
-}
-
-
-static u16 check_wmm(struct hostapd_data *hapd, struct sta_info *sta,
- const u8 *wmm_ie, size_t wmm_ie_len)
-{
- sta->flags &= ~WLAN_STA_WMM;
- if (wmm_ie && hapd->conf->wmm_enabled) {
- if (hostapd_eid_wmm_valid(hapd, wmm_ie, wmm_ie_len))
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_WPA,
- HOSTAPD_LEVEL_DEBUG,
- "invalid WMM element in association "
- "request");
- else
- sta->flags |= WLAN_STA_WMM;
- }
- return WLAN_STATUS_SUCCESS;
-}
-
-
-static u16 copy_supp_rates(struct hostapd_data *hapd, struct sta_info *sta,
- struct ieee802_11_elems *elems)
-{
- if (!elems->supp_rates) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "No supported rates element in AssocReq");
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- if (elems->supp_rates_len > sizeof(sta->supported_rates)) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "Invalid supported rates element length %d",
- elems->supp_rates_len);
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- os_memset(sta->supported_rates, 0, sizeof(sta->supported_rates));
- os_memcpy(sta->supported_rates, elems->supp_rates,
- elems->supp_rates_len);
- sta->supported_rates_len = elems->supp_rates_len;
-
- if (elems->ext_supp_rates) {
- if (elems->supp_rates_len + elems->ext_supp_rates_len >
- sizeof(sta->supported_rates)) {
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "Invalid supported rates element length"
- " %d+%d", elems->supp_rates_len,
- elems->ext_supp_rates_len);
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- os_memcpy(sta->supported_rates + elems->supp_rates_len,
- elems->ext_supp_rates, elems->ext_supp_rates_len);
- sta->supported_rates_len += elems->ext_supp_rates_len;
- }
-
- return WLAN_STATUS_SUCCESS;
-}
-
-
-static u16 check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta,
- const u8 *ies, size_t ies_len, int reassoc)
-{
- struct ieee802_11_elems elems;
- u16 resp;
- const u8 *wpa_ie;
- size_t wpa_ie_len;
-
- if (ieee802_11_parse_elems(ies, ies_len, &elems, 1) == ParseFailed) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "Station sent an invalid "
- "association request");
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- resp = check_ssid(hapd, sta, elems.ssid, elems.ssid_len);
- if (resp != WLAN_STATUS_SUCCESS)
- return resp;
- resp = check_wmm(hapd, sta, elems.wmm, elems.wmm_len);
- if (resp != WLAN_STATUS_SUCCESS)
- return resp;
- resp = copy_supp_rates(hapd, sta, &elems);
- if (resp != WLAN_STATUS_SUCCESS)
- return resp;
-#ifdef CONFIG_IEEE80211N
- resp = copy_sta_ht_capab(hapd, sta, elems.ht_capabilities,
- elems.ht_capabilities_len);
- if (resp != WLAN_STATUS_SUCCESS)
- return resp;
- if (hapd->iconf->ieee80211n && hapd->iconf->require_ht &&
- !(sta->flags & WLAN_STA_HT)) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "Station does not support "
- "mandatory HT PHY - reject association");
- return WLAN_STATUS_ASSOC_DENIED_NO_HT;
- }
-#endif /* CONFIG_IEEE80211N */
-
- if ((hapd->conf->wpa & WPA_PROTO_RSN) && elems.rsn_ie) {
- wpa_ie = elems.rsn_ie;
- wpa_ie_len = elems.rsn_ie_len;
- } else if ((hapd->conf->wpa & WPA_PROTO_WPA) &&
- elems.wpa_ie) {
- wpa_ie = elems.wpa_ie;
- wpa_ie_len = elems.wpa_ie_len;
- } else {
- wpa_ie = NULL;
- wpa_ie_len = 0;
- }
-
-#ifdef CONFIG_WPS
- sta->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS);
- if (hapd->conf->wps_state && elems.wps_ie) {
- wpa_printf(MSG_DEBUG, "STA included WPS IE in (Re)Association "
- "Request - assume WPS is used");
- sta->flags |= WLAN_STA_WPS;
- wpabuf_free(sta->wps_ie);
- sta->wps_ie = ieee802_11_vendor_ie_concat(ies, ies_len,
- WPS_IE_VENDOR_TYPE);
- wpa_ie = NULL;
- wpa_ie_len = 0;
- if (sta->wps_ie && wps_validate_assoc_req(sta->wps_ie) < 0) {
- wpa_printf(MSG_DEBUG, "WPS: Invalid WPS IE in "
- "(Re)Association Request - reject");
- return WLAN_STATUS_INVALID_IE;
- }
- } else if (hapd->conf->wps_state && wpa_ie == NULL) {
- wpa_printf(MSG_DEBUG, "STA did not include WPA/RSN IE in "
- "(Re)Association Request - possible WPS use");
- sta->flags |= WLAN_STA_MAYBE_WPS;
- } else
-#endif /* CONFIG_WPS */
- if (hapd->conf->wpa && wpa_ie == NULL) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO,
- "No WPA/RSN IE in association request");
- return WLAN_STATUS_INVALID_IE;
- }
-
- if (hapd->conf->wpa && wpa_ie) {
- int res;
- wpa_ie -= 2;
- wpa_ie_len += 2;
- if (sta->wpa_sm == NULL)
- sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth,
- sta->addr);
- if (sta->wpa_sm == NULL) {
- wpa_printf(MSG_WARNING, "Failed to initialize WPA "
- "state machine");
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
- res = wpa_validate_wpa_ie(hapd->wpa_auth, sta->wpa_sm,
- wpa_ie, wpa_ie_len,
- elems.mdie, elems.mdie_len);
- if (res == WPA_INVALID_GROUP)
- resp = WLAN_STATUS_GROUP_CIPHER_NOT_VALID;
- else if (res == WPA_INVALID_PAIRWISE)
- resp = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID;
- else if (res == WPA_INVALID_AKMP)
- resp = WLAN_STATUS_AKMP_NOT_VALID;
- else if (res == WPA_ALLOC_FAIL)
- resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
-#ifdef CONFIG_IEEE80211W
- else if (res == WPA_MGMT_FRAME_PROTECTION_VIOLATION)
- resp = WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION;
- else if (res == WPA_INVALID_MGMT_GROUP_CIPHER)
- resp = WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION;
-#endif /* CONFIG_IEEE80211W */
- else if (res == WPA_INVALID_MDIE)
- resp = WLAN_STATUS_INVALID_MDIE;
- else if (res != WPA_IE_OK)
- resp = WLAN_STATUS_INVALID_IE;
- if (resp != WLAN_STATUS_SUCCESS)
- return resp;
-#ifdef CONFIG_IEEE80211W
- if ((sta->flags & WLAN_STA_MFP) && !sta->sa_query_timed_out &&
- sta->sa_query_count > 0)
- ap_check_sa_query_timeout(hapd, sta);
- if ((sta->flags & WLAN_STA_MFP) && !sta->sa_query_timed_out &&
- (!reassoc || sta->auth_alg != WLAN_AUTH_FT)) {
- /*
- * STA has already been associated with MFP and SA
- * Query timeout has not been reached. Reject the
- * association attempt temporarily and start SA Query,
- * if one is not pending.
- */
-
- if (sta->sa_query_count == 0)
- ap_sta_start_sa_query(hapd, sta);
-
- return WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY;
- }
-
- if (wpa_auth_uses_mfp(sta->wpa_sm))
- sta->flags |= WLAN_STA_MFP;
- else
- sta->flags &= ~WLAN_STA_MFP;
-#endif /* CONFIG_IEEE80211W */
-
-#ifdef CONFIG_IEEE80211R
- if (sta->auth_alg == WLAN_AUTH_FT) {
- if (!reassoc) {
- wpa_printf(MSG_DEBUG, "FT: " MACSTR " tried "
- "to use association (not "
- "re-association) with FT auth_alg",
- MAC2STR(sta->addr));
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- resp = wpa_ft_validate_reassoc(sta->wpa_sm, ies,
- ies_len);
- if (resp != WLAN_STATUS_SUCCESS)
- return resp;
- }
-#endif /* CONFIG_IEEE80211R */
-
-#ifdef CONFIG_IEEE80211N
- if ((sta->flags & WLAN_STA_HT) &&
- wpa_auth_get_pairwise(sta->wpa_sm) == WPA_CIPHER_TKIP) {
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO,
- "Station tried to use TKIP with HT "
- "association");
- return WLAN_STATUS_CIPHER_REJECTED_PER_POLICY;
- }
-#endif /* CONFIG_IEEE80211N */
- } else
- wpa_auth_sta_no_wpa(sta->wpa_sm);
-
-#ifdef CONFIG_P2P
- if (elems.p2p) {
- wpabuf_free(sta->p2p_ie);
- sta->p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len,
- P2P_IE_VENDOR_TYPE);
-
- } else {
- wpabuf_free(sta->p2p_ie);
- sta->p2p_ie = NULL;
- }
-
- p2p_group_notif_assoc(hapd->p2p_group, sta->addr, ies, ies_len);
-#endif /* CONFIG_P2P */
-
- return WLAN_STATUS_SUCCESS;
-}
-
-
-static void send_deauth(struct hostapd_data *hapd, const u8 *addr,
- u16 reason_code)
-{
- int send_len;
- struct ieee80211_mgmt reply;
-
- os_memset(&reply, 0, sizeof(reply));
- reply.frame_control =
- IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_DEAUTH);
- os_memcpy(reply.da, addr, ETH_ALEN);
- os_memcpy(reply.sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(reply.bssid, hapd->own_addr, ETH_ALEN);
-
- send_len = IEEE80211_HDRLEN + sizeof(reply.u.deauth);
- reply.u.deauth.reason_code = host_to_le16(reason_code);
-
- if (hostapd_drv_send_mlme(hapd, &reply, send_len) < 0)
- wpa_printf(MSG_INFO, "Failed to send deauth: %s",
- strerror(errno));
-}
-
-
-static void send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta,
- u16 status_code, int reassoc, const u8 *ies,
- size_t ies_len)
-{
- int send_len;
- u8 buf[sizeof(struct ieee80211_mgmt) + 1024];
- struct ieee80211_mgmt *reply;
- u8 *p;
-
- os_memset(buf, 0, sizeof(buf));
- reply = (struct ieee80211_mgmt *) buf;
- reply->frame_control =
- IEEE80211_FC(WLAN_FC_TYPE_MGMT,
- (reassoc ? WLAN_FC_STYPE_REASSOC_RESP :
- WLAN_FC_STYPE_ASSOC_RESP));
- os_memcpy(reply->da, sta->addr, ETH_ALEN);
- os_memcpy(reply->sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(reply->bssid, hapd->own_addr, ETH_ALEN);
-
- send_len = IEEE80211_HDRLEN;
- send_len += sizeof(reply->u.assoc_resp);
- reply->u.assoc_resp.capab_info =
- host_to_le16(hostapd_own_capab_info(hapd, sta, 0));
- reply->u.assoc_resp.status_code = host_to_le16(status_code);
- reply->u.assoc_resp.aid = host_to_le16((sta ? sta->aid : 0)
- | BIT(14) | BIT(15));
- /* Supported rates */
- p = hostapd_eid_supp_rates(hapd, reply->u.assoc_resp.variable);
- /* Extended supported rates */
- p = hostapd_eid_ext_supp_rates(hapd, p);
-
-#ifdef CONFIG_IEEE80211R
- if (status_code == WLAN_STATUS_SUCCESS) {
- /* IEEE 802.11r: Mobility Domain Information, Fast BSS
- * Transition Information, RSN, [RIC Response] */
- p = wpa_sm_write_assoc_resp_ies(sta->wpa_sm, p,
- buf + sizeof(buf) - p,
- sta->auth_alg, ies, ies_len);
- }
-#endif /* CONFIG_IEEE80211R */
-
-#ifdef CONFIG_IEEE80211W
- if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY)
- p = hostapd_eid_assoc_comeback_time(hapd, sta, p);
-#endif /* CONFIG_IEEE80211W */
-
-#ifdef CONFIG_IEEE80211N
- p = hostapd_eid_ht_capabilities(hapd, p);
- p = hostapd_eid_ht_operation(hapd, p);
-#endif /* CONFIG_IEEE80211N */
-
- p = hostapd_eid_ext_capab(hapd, p);
-
- if (sta->flags & WLAN_STA_WMM)
- p = hostapd_eid_wmm(hapd, p);
-
-#ifdef CONFIG_WPS
- if (sta->flags & WLAN_STA_WPS) {
- struct wpabuf *wps = wps_build_assoc_resp_ie();
- if (wps) {
- os_memcpy(p, wpabuf_head(wps), wpabuf_len(wps));
- p += wpabuf_len(wps);
- wpabuf_free(wps);
- }
- }
-#endif /* CONFIG_WPS */
-
-#ifdef CONFIG_P2P
- if (sta->p2p_ie) {
- struct wpabuf *p2p_resp_ie;
- enum p2p_status_code status;
- switch (status_code) {
- case WLAN_STATUS_SUCCESS:
- status = P2P_SC_SUCCESS;
- break;
- case WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA:
- status = P2P_SC_FAIL_LIMIT_REACHED;
- break;
- default:
- status = P2P_SC_FAIL_INVALID_PARAMS;
- break;
- }
- p2p_resp_ie = p2p_group_assoc_resp_ie(hapd->p2p_group, status);
- if (p2p_resp_ie) {
- os_memcpy(p, wpabuf_head(p2p_resp_ie),
- wpabuf_len(p2p_resp_ie));
- p += wpabuf_len(p2p_resp_ie);
- wpabuf_free(p2p_resp_ie);
- }
- }
-#endif /* CONFIG_P2P */
-
-#ifdef CONFIG_P2P_MANAGER
- if (hapd->conf->p2p & P2P_MANAGE)
- p = hostapd_eid_p2p_manage(hapd, p);
-#endif /* CONFIG_P2P_MANAGER */
-
- send_len += p - reply->u.assoc_resp.variable;
-
- if (hostapd_drv_send_mlme(hapd, reply, send_len) < 0)
- wpa_printf(MSG_INFO, "Failed to send assoc resp: %s",
- strerror(errno));
-}
-
-
-static void handle_assoc(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt, size_t len,
- int reassoc)
-{
- u16 capab_info, listen_interval;
- u16 resp = WLAN_STATUS_SUCCESS;
- const u8 *pos;
- int left, i;
- struct sta_info *sta;
-
- if (len < IEEE80211_HDRLEN + (reassoc ? sizeof(mgmt->u.reassoc_req) :
- sizeof(mgmt->u.assoc_req))) {
- printf("handle_assoc(reassoc=%d) - too short payload (len=%lu)"
- "\n", reassoc, (unsigned long) len);
- return;
- }
-
- if (reassoc) {
- capab_info = le_to_host16(mgmt->u.reassoc_req.capab_info);
- listen_interval = le_to_host16(
- mgmt->u.reassoc_req.listen_interval);
- wpa_printf(MSG_DEBUG, "reassociation request: STA=" MACSTR
- " capab_info=0x%02x listen_interval=%d current_ap="
- MACSTR,
- MAC2STR(mgmt->sa), capab_info, listen_interval,
- MAC2STR(mgmt->u.reassoc_req.current_ap));
- left = len - (IEEE80211_HDRLEN + sizeof(mgmt->u.reassoc_req));
- pos = mgmt->u.reassoc_req.variable;
- } else {
- capab_info = le_to_host16(mgmt->u.assoc_req.capab_info);
- listen_interval = le_to_host16(
- mgmt->u.assoc_req.listen_interval);
- wpa_printf(MSG_DEBUG, "association request: STA=" MACSTR
- " capab_info=0x%02x listen_interval=%d",
- MAC2STR(mgmt->sa), capab_info, listen_interval);
- left = len - (IEEE80211_HDRLEN + sizeof(mgmt->u.assoc_req));
- pos = mgmt->u.assoc_req.variable;
- }
-
- sta = ap_get_sta(hapd, mgmt->sa);
-#ifdef CONFIG_IEEE80211R
- if (sta && sta->auth_alg == WLAN_AUTH_FT &&
- (sta->flags & WLAN_STA_AUTH) == 0) {
- wpa_printf(MSG_DEBUG, "FT: Allow STA " MACSTR " to associate "
- "prior to authentication since it is using "
- "over-the-DS FT", MAC2STR(mgmt->sa));
- } else
-#endif /* CONFIG_IEEE80211R */
- if (sta == NULL || (sta->flags & WLAN_STA_AUTH) == 0) {
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "Station tried to "
- "associate before authentication "
- "(aid=%d flags=0x%x)",
- sta ? sta->aid : -1,
- sta ? sta->flags : 0);
- send_deauth(hapd, mgmt->sa,
- WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA);
- return;
- }
-
- if (hapd->tkip_countermeasures) {
- resp = WLAN_REASON_MICHAEL_MIC_FAILURE;
- goto fail;
- }
-
- if (listen_interval > hapd->conf->max_listen_interval) {
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "Too large Listen Interval (%d)",
- listen_interval);
- resp = WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE;
- goto fail;
- }
-
- /* followed by SSID and Supported rates; and HT capabilities if 802.11n
- * is used */
- resp = check_assoc_ies(hapd, sta, pos, left, reassoc);
- if (resp != WLAN_STATUS_SUCCESS)
- goto fail;
-
- if (hostapd_get_aid(hapd, sta) < 0) {
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "No room for more AIDs");
- resp = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA;
- goto fail;
- }
-
- sta->capability = capab_info;
- sta->listen_interval = listen_interval;
-
- if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G)
- sta->flags |= WLAN_STA_NONERP;
- for (i = 0; i < sta->supported_rates_len; i++) {
- if ((sta->supported_rates[i] & 0x7f) > 22) {
- sta->flags &= ~WLAN_STA_NONERP;
- break;
- }
- }
- if (sta->flags & WLAN_STA_NONERP && !sta->nonerp_set) {
- sta->nonerp_set = 1;
- hapd->iface->num_sta_non_erp++;
- if (hapd->iface->num_sta_non_erp == 1)
- ieee802_11_set_beacons(hapd->iface);
- }
-
- if (!(sta->capability & WLAN_CAPABILITY_SHORT_SLOT_TIME) &&
- !sta->no_short_slot_time_set) {
- sta->no_short_slot_time_set = 1;
- hapd->iface->num_sta_no_short_slot_time++;
- if (hapd->iface->current_mode->mode ==
- HOSTAPD_MODE_IEEE80211G &&
- hapd->iface->num_sta_no_short_slot_time == 1)
- ieee802_11_set_beacons(hapd->iface);
- }
-
- if (sta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
- sta->flags |= WLAN_STA_SHORT_PREAMBLE;
- else
- sta->flags &= ~WLAN_STA_SHORT_PREAMBLE;
-
- if (!(sta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) &&
- !sta->no_short_preamble_set) {
- sta->no_short_preamble_set = 1;
- hapd->iface->num_sta_no_short_preamble++;
- if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G
- && hapd->iface->num_sta_no_short_preamble == 1)
- ieee802_11_set_beacons(hapd->iface);
- }
-
-#ifdef CONFIG_IEEE80211N
- update_ht_state(hapd, sta);
-#endif /* CONFIG_IEEE80211N */
-
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "association OK (aid %d)", sta->aid);
- /* Station will be marked associated, after it acknowledges AssocResp
- */
- sta->flags |= WLAN_STA_ASSOC_REQ_OK;
-
-#ifdef CONFIG_IEEE80211W
- if ((sta->flags & WLAN_STA_MFP) && sta->sa_query_timed_out) {
- wpa_printf(MSG_DEBUG, "Allowing %sassociation after timed out "
- "SA Query procedure", reassoc ? "re" : "");
- /* TODO: Send a protected Disassociate frame to the STA using
- * the old key and Reason Code "Previous Authentication no
- * longer valid". Make sure this is only sent protected since
- * unprotected frame would be received by the STA that is now
- * trying to associate.
- */
- }
-#endif /* CONFIG_IEEE80211W */
-
- if (reassoc) {
- os_memcpy(sta->previous_ap, mgmt->u.reassoc_req.current_ap,
- ETH_ALEN);
- }
-
- if (sta->last_assoc_req)
- os_free(sta->last_assoc_req);
- sta->last_assoc_req = os_malloc(len);
- if (sta->last_assoc_req)
- os_memcpy(sta->last_assoc_req, mgmt, len);
-
- /* Make sure that the previously registered inactivity timer will not
- * remove the STA immediately. */
- sta->timeout_next = STA_NULLFUNC;
-
- fail:
- send_assoc_resp(hapd, sta, resp, reassoc, pos, left);
-}
-
-
-static void handle_disassoc(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt, size_t len)
-{
- struct sta_info *sta;
-
- if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.disassoc)) {
- printf("handle_disassoc - too short payload (len=%lu)\n",
- (unsigned long) len);
- return;
- }
-
- wpa_printf(MSG_DEBUG, "disassocation: STA=" MACSTR " reason_code=%d",
- MAC2STR(mgmt->sa),
- le_to_host16(mgmt->u.disassoc.reason_code));
-
- sta = ap_get_sta(hapd, mgmt->sa);
- if (sta == NULL) {
- printf("Station " MACSTR " trying to disassociate, but it "
- "is not associated.\n", MAC2STR(mgmt->sa));
- return;
- }
-
- sta->flags &= ~(WLAN_STA_ASSOC | WLAN_STA_ASSOC_REQ_OK);
- wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_DISCONNECTED MACSTR,
- MAC2STR(sta->addr));
- wpa_auth_sm_event(sta->wpa_sm, WPA_DISASSOC);
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "disassociated");
- sta->acct_terminate_cause = RADIUS_ACCT_TERMINATE_CAUSE_USER_REQUEST;
- ieee802_1x_notify_port_enabled(sta->eapol_sm, 0);
- /* Stop Accounting and IEEE 802.1X sessions, but leave the STA
- * authenticated. */
- accounting_sta_stop(hapd, sta);
- ieee802_1x_free_station(sta);
- hostapd_drv_sta_remove(hapd, sta->addr);
-
- if (sta->timeout_next == STA_NULLFUNC ||
- sta->timeout_next == STA_DISASSOC) {
- sta->timeout_next = STA_DEAUTH;
- eloop_cancel_timeout(ap_handle_timer, hapd, sta);
- eloop_register_timeout(AP_DEAUTH_DELAY, 0, ap_handle_timer,
- hapd, sta);
- }
-
- mlme_disassociate_indication(
- hapd, sta, le_to_host16(mgmt->u.disassoc.reason_code));
-}
-
-
-static void handle_deauth(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt, size_t len)
-{
- struct sta_info *sta;
-
- if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.deauth)) {
- wpa_msg(hapd, MSG_DEBUG, "handle_deauth - too short payload "
- "(len=%lu)", (unsigned long) len);
- return;
- }
-
- wpa_msg(hapd, MSG_DEBUG, "deauthentication: STA=" MACSTR
- " reason_code=%d",
- MAC2STR(mgmt->sa), le_to_host16(mgmt->u.deauth.reason_code));
-
- sta = ap_get_sta(hapd, mgmt->sa);
- if (sta == NULL) {
- wpa_msg(hapd, MSG_DEBUG, "Station " MACSTR " trying to "
- "deauthenticate, but it is not authenticated",
- MAC2STR(mgmt->sa));
- return;
- }
-
- sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC |
- WLAN_STA_ASSOC_REQ_OK);
- wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_DISCONNECTED MACSTR,
- MAC2STR(sta->addr));
- wpa_auth_sm_event(sta->wpa_sm, WPA_DEAUTH);
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG, "deauthenticated");
- mlme_deauthenticate_indication(
- hapd, sta, le_to_host16(mgmt->u.deauth.reason_code));
- sta->acct_terminate_cause = RADIUS_ACCT_TERMINATE_CAUSE_USER_REQUEST;
- ieee802_1x_notify_port_enabled(sta->eapol_sm, 0);
- ap_free_sta(hapd, sta);
-}
-
-
-static void handle_beacon(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt, size_t len,
- struct hostapd_frame_info *fi)
-{
- struct ieee802_11_elems elems;
-
- if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.beacon)) {
- printf("handle_beacon - too short payload (len=%lu)\n",
- (unsigned long) len);
- return;
- }
-
- (void) ieee802_11_parse_elems(mgmt->u.beacon.variable,
- len - (IEEE80211_HDRLEN +
- sizeof(mgmt->u.beacon)), &elems,
- 0);
-
- ap_list_process_beacon(hapd->iface, mgmt, &elems, fi);
-}
-
-
-#ifdef CONFIG_IEEE80211W
-
-/* MLME-SAQuery.request */
-void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
- const u8 *addr, const u8 *trans_id)
-{
- struct ieee80211_mgmt mgmt;
- u8 *end;
-
- wpa_printf(MSG_DEBUG, "IEEE 802.11: Sending SA Query Request to "
- MACSTR, MAC2STR(addr));
- wpa_hexdump(MSG_DEBUG, "IEEE 802.11: SA Query Transaction ID",
- trans_id, WLAN_SA_QUERY_TR_ID_LEN);
-
- os_memset(&mgmt, 0, sizeof(mgmt));
- mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
- WLAN_FC_STYPE_ACTION);
- os_memcpy(mgmt.da, addr, ETH_ALEN);
- os_memcpy(mgmt.sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(mgmt.bssid, hapd->own_addr, ETH_ALEN);
- mgmt.u.action.category = WLAN_ACTION_SA_QUERY;
- mgmt.u.action.u.sa_query_req.action = WLAN_SA_QUERY_REQUEST;
- os_memcpy(mgmt.u.action.u.sa_query_req.trans_id, trans_id,
- WLAN_SA_QUERY_TR_ID_LEN);
- end = mgmt.u.action.u.sa_query_req.trans_id + WLAN_SA_QUERY_TR_ID_LEN;
- if (hostapd_drv_send_mlme(hapd, &mgmt, end - (u8 *) &mgmt) < 0)
- perror("ieee802_11_send_sa_query_req: send");
-}
-
-
-static void hostapd_sa_query_request(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt)
-{
- struct sta_info *sta;
- struct ieee80211_mgmt resp;
- u8 *end;
-
- wpa_printf(MSG_DEBUG, "IEEE 802.11: Received SA Query Request from "
- MACSTR, MAC2STR(mgmt->sa));
- wpa_hexdump(MSG_DEBUG, "IEEE 802.11: SA Query Transaction ID",
- mgmt->u.action.u.sa_query_resp.trans_id,
- WLAN_SA_QUERY_TR_ID_LEN);
-
- sta = ap_get_sta(hapd, mgmt->sa);
- if (sta == NULL || !(sta->flags & WLAN_STA_ASSOC)) {
- wpa_printf(MSG_DEBUG, "IEEE 802.11: Ignore SA Query Request "
- "from unassociated STA " MACSTR, MAC2STR(mgmt->sa));
- return;
- }
-
- wpa_printf(MSG_DEBUG, "IEEE 802.11: Sending SA Query Response to "
- MACSTR, MAC2STR(mgmt->sa));
-
- os_memset(&resp, 0, sizeof(resp));
- resp.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
- WLAN_FC_STYPE_ACTION);
- os_memcpy(resp.da, mgmt->sa, ETH_ALEN);
- os_memcpy(resp.sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(resp.bssid, hapd->own_addr, ETH_ALEN);
- resp.u.action.category = WLAN_ACTION_SA_QUERY;
- resp.u.action.u.sa_query_req.action = WLAN_SA_QUERY_RESPONSE;
- os_memcpy(resp.u.action.u.sa_query_req.trans_id,
- mgmt->u.action.u.sa_query_req.trans_id,
- WLAN_SA_QUERY_TR_ID_LEN);
- end = resp.u.action.u.sa_query_req.trans_id + WLAN_SA_QUERY_TR_ID_LEN;
- if (hostapd_drv_send_mlme(hapd, &resp, end - (u8 *) &resp) < 0)
- perror("hostapd_sa_query_request: send");
-}
-
-
-static void hostapd_sa_query_action(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt,
- size_t len)
-{
- struct sta_info *sta;
- const u8 *end;
- int i;
-
- end = mgmt->u.action.u.sa_query_resp.trans_id +
- WLAN_SA_QUERY_TR_ID_LEN;
- if (((u8 *) mgmt) + len < end) {
- wpa_printf(MSG_DEBUG, "IEEE 802.11: Too short SA Query Action "
- "frame (len=%lu)", (unsigned long) len);
- return;
- }
-
- if (mgmt->u.action.u.sa_query_resp.action == WLAN_SA_QUERY_REQUEST) {
- hostapd_sa_query_request(hapd, mgmt);
- return;
- }
-
- if (mgmt->u.action.u.sa_query_resp.action != WLAN_SA_QUERY_RESPONSE) {
- wpa_printf(MSG_DEBUG, "IEEE 802.11: Unexpected SA Query "
- "Action %d", mgmt->u.action.u.sa_query_resp.action);
- return;
- }
-
- wpa_printf(MSG_DEBUG, "IEEE 802.11: Received SA Query Response from "
- MACSTR, MAC2STR(mgmt->sa));
- wpa_hexdump(MSG_DEBUG, "IEEE 802.11: SA Query Transaction ID",
- mgmt->u.action.u.sa_query_resp.trans_id,
- WLAN_SA_QUERY_TR_ID_LEN);
-
- /* MLME-SAQuery.confirm */
-
- sta = ap_get_sta(hapd, mgmt->sa);
- if (sta == NULL || sta->sa_query_trans_id == NULL) {
- wpa_printf(MSG_DEBUG, "IEEE 802.11: No matching STA with "
- "pending SA Query request found");
- return;
- }
-
- for (i = 0; i < sta->sa_query_count; i++) {
- if (os_memcmp(sta->sa_query_trans_id +
- i * WLAN_SA_QUERY_TR_ID_LEN,
- mgmt->u.action.u.sa_query_resp.trans_id,
- WLAN_SA_QUERY_TR_ID_LEN) == 0)
- break;
- }
-
- if (i >= sta->sa_query_count) {
- wpa_printf(MSG_DEBUG, "IEEE 802.11: No matching SA Query "
- "transaction identifier found");
- return;
- }
-
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "Reply to pending SA Query received");
- ap_sta_stop_sa_query(hapd, sta);
-}
-
-
-static int robust_action_frame(u8 category)
-{
- return category != WLAN_ACTION_PUBLIC &&
- category != WLAN_ACTION_HT;
-}
-#endif /* CONFIG_IEEE80211W */
-
-
-static void handle_action(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt, size_t len)
-{
-#ifdef CONFIG_IEEE80211W
- struct sta_info *sta;
-#endif
-
- if (len < IEEE80211_HDRLEN + 1) {
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "handle_action - too short payload (len=%lu)",
- (unsigned long) len);
- return;
- }
-
-#ifdef CONFIG_IEEE80211W
- sta = ap_get_sta(hapd, mgmt->sa);
- if (sta && (sta->flags & WLAN_STA_MFP) &&
- !(mgmt->frame_control & host_to_le16(WLAN_FC_ISWEP) &&
- robust_action_frame(mgmt->u.action.category))) {
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "Dropped unprotected Robust Action frame from "
- "an MFP STA");
- return;
- }
-#endif /* CONFIG_IEEE80211W */
-
- switch (mgmt->u.action.category) {
-#ifdef CONFIG_IEEE80211R
- case WLAN_ACTION_FT:
- {
- if (sta == NULL || !(sta->flags & WLAN_STA_ASSOC)) {
- wpa_printf(MSG_DEBUG, "IEEE 802.11: Ignored FT Action "
- "frame from unassociated STA " MACSTR,
- MAC2STR(mgmt->sa));
- return;
- }
-
- if (wpa_ft_action_rx(sta->wpa_sm, (u8 *) &mgmt->u.action,
- len - IEEE80211_HDRLEN))
- break;
-
- return;
- }
-#endif /* CONFIG_IEEE80211R */
- case WLAN_ACTION_WMM:
- hostapd_wmm_action(hapd, mgmt, len);
- return;
-#ifdef CONFIG_IEEE80211W
- case WLAN_ACTION_SA_QUERY:
- hostapd_sa_query_action(hapd, mgmt, len);
- return;
-#endif /* CONFIG_IEEE80211W */
- case WLAN_ACTION_PUBLIC:
- if (hapd->public_action_cb) {
- hapd->public_action_cb(hapd->public_action_cb_ctx,
- (u8 *) mgmt, len,
- hapd->iface->freq);
- return;
- }
- break;
- case WLAN_ACTION_VENDOR_SPECIFIC:
- if (hapd->vendor_action_cb) {
- if (hapd->vendor_action_cb(hapd->vendor_action_cb_ctx,
- (u8 *) mgmt, len,
- hapd->iface->freq) == 0)
- return;
- }
- break;
- }
-
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "handle_action - unknown action category %d or invalid "
- "frame",
- mgmt->u.action.category);
- if (!(mgmt->da[0] & 0x01) && !(mgmt->u.action.category & 0x80) &&
- !(mgmt->sa[0] & 0x01)) {
- struct ieee80211_mgmt *resp;
-
- /*
- * IEEE 802.11-REVma/D9.0 - 7.3.1.11
- * Return the Action frame to the source without change
- * except that MSB of the Category set to 1.
- */
- wpa_printf(MSG_DEBUG, "IEEE 802.11: Return unknown Action "
- "frame back to sender");
- resp = os_malloc(len);
- if (resp == NULL)
- return;
- os_memcpy(resp, mgmt, len);
- os_memcpy(resp->da, resp->sa, ETH_ALEN);
- os_memcpy(resp->sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(resp->bssid, hapd->own_addr, ETH_ALEN);
- resp->u.action.category |= 0x80;
-
- hostapd_drv_send_mlme(hapd, resp, len);
- os_free(resp);
- }
-}
-
-
-/**
- * ieee802_11_mgmt - process incoming IEEE 802.11 management frames
- * @hapd: hostapd BSS data structure (the BSS to which the management frame was
- * sent to)
- * @buf: management frame data (starting from IEEE 802.11 header)
- * @len: length of frame data in octets
- * @fi: meta data about received frame (signal level, etc.)
- *
- * Process all incoming IEEE 802.11 management frames. This will be called for
- * each frame received from the kernel driver through wlan#ap interface. In
- * addition, it can be called to re-inserted pending frames (e.g., when using
- * external RADIUS server as an MAC ACL).
- */
-void ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len,
- struct hostapd_frame_info *fi)
-{
- struct ieee80211_mgmt *mgmt;
- int broadcast;
- u16 fc, stype;
-
- if (len < 24)
- return;
-
- mgmt = (struct ieee80211_mgmt *) buf;
- fc = le_to_host16(mgmt->frame_control);
- stype = WLAN_FC_GET_STYPE(fc);
-
- if (stype == WLAN_FC_STYPE_BEACON) {
- handle_beacon(hapd, mgmt, len, fi);
- return;
- }
-
- broadcast = mgmt->bssid[0] == 0xff && mgmt->bssid[1] == 0xff &&
- mgmt->bssid[2] == 0xff && mgmt->bssid[3] == 0xff &&
- mgmt->bssid[4] == 0xff && mgmt->bssid[5] == 0xff;
-
- if (!broadcast &&
- os_memcmp(mgmt->bssid, hapd->own_addr, ETH_ALEN) != 0) {
- printf("MGMT: BSSID=" MACSTR " not our address\n",
- MAC2STR(mgmt->bssid));
- return;
- }
-
-
- if (stype == WLAN_FC_STYPE_PROBE_REQ) {
- handle_probe_req(hapd, mgmt, len);
- return;
- }
-
- if (os_memcmp(mgmt->da, hapd->own_addr, ETH_ALEN) != 0) {
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "MGMT: DA=" MACSTR " not our address",
- MAC2STR(mgmt->da));
- return;
- }
-
- switch (stype) {
- case WLAN_FC_STYPE_AUTH:
- wpa_printf(MSG_DEBUG, "mgmt::auth");
- handle_auth(hapd, mgmt, len);
- break;
- case WLAN_FC_STYPE_ASSOC_REQ:
- wpa_printf(MSG_DEBUG, "mgmt::assoc_req");
- handle_assoc(hapd, mgmt, len, 0);
- break;
- case WLAN_FC_STYPE_REASSOC_REQ:
- wpa_printf(MSG_DEBUG, "mgmt::reassoc_req");
- handle_assoc(hapd, mgmt, len, 1);
- break;
- case WLAN_FC_STYPE_DISASSOC:
- wpa_printf(MSG_DEBUG, "mgmt::disassoc");
- handle_disassoc(hapd, mgmt, len);
- break;
- case WLAN_FC_STYPE_DEAUTH:
- wpa_msg(hapd, MSG_DEBUG, "mgmt::deauth");
- handle_deauth(hapd, mgmt, len);
- break;
- case WLAN_FC_STYPE_ACTION:
- wpa_printf(MSG_DEBUG, "mgmt::action");
- handle_action(hapd, mgmt, len);
- break;
- default:
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "unknown mgmt frame subtype %d", stype);
- break;
- }
-}
-
-
-static void handle_auth_cb(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt,
- size_t len, int ok)
-{
- u16 auth_alg, auth_transaction, status_code;
- struct sta_info *sta;
-
- if (!ok) {
- hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_NOTICE,
- "did not acknowledge authentication response");
- return;
- }
-
- if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.auth)) {
- printf("handle_auth_cb - too short payload (len=%lu)\n",
- (unsigned long) len);
- return;
- }
-
- auth_alg = le_to_host16(mgmt->u.auth.auth_alg);
- auth_transaction = le_to_host16(mgmt->u.auth.auth_transaction);
- status_code = le_to_host16(mgmt->u.auth.status_code);
-
- sta = ap_get_sta(hapd, mgmt->da);
- if (!sta) {
- printf("handle_auth_cb: STA " MACSTR " not found\n",
- MAC2STR(mgmt->da));
- return;
- }
-
- if (status_code == WLAN_STATUS_SUCCESS &&
- ((auth_alg == WLAN_AUTH_OPEN && auth_transaction == 2) ||
- (auth_alg == WLAN_AUTH_SHARED_KEY && auth_transaction == 4))) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "authenticated");
- sta->flags |= WLAN_STA_AUTH;
- }
-}
-
-
-static void handle_assoc_cb(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt,
- size_t len, int reassoc, int ok)
-{
- u16 status;
- struct sta_info *sta;
- int new_assoc = 1;
- struct ieee80211_ht_capabilities ht_cap;
-
- if (!ok) {
- hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "did not acknowledge association response");
- return;
- }
-
- if (len < IEEE80211_HDRLEN + (reassoc ? sizeof(mgmt->u.reassoc_resp) :
- sizeof(mgmt->u.assoc_resp))) {
- printf("handle_assoc_cb(reassoc=%d) - too short payload "
- "(len=%lu)\n", reassoc, (unsigned long) len);
- return;
- }
-
- if (reassoc)
- status = le_to_host16(mgmt->u.reassoc_resp.status_code);
- else
- status = le_to_host16(mgmt->u.assoc_resp.status_code);
-
- sta = ap_get_sta(hapd, mgmt->da);
- if (!sta) {
- printf("handle_assoc_cb: STA " MACSTR " not found\n",
- MAC2STR(mgmt->da));
- return;
- }
-
- if (status != WLAN_STATUS_SUCCESS)
- goto fail;
-
- /* Stop previous accounting session, if one is started, and allocate
- * new session id for the new session. */
- accounting_sta_stop(hapd, sta);
-
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO,
- "associated (aid %d)",
- sta->aid);
-
- if (sta->flags & WLAN_STA_ASSOC)
- new_assoc = 0;
- sta->flags |= WLAN_STA_ASSOC;
- if ((!hapd->conf->ieee802_1x && !hapd->conf->wpa) ||
- sta->auth_alg == WLAN_AUTH_FT) {
- /*
- * Open, static WEP, or FT protocol; no separate authorization
- * step.
- */
- ap_sta_set_authorized(hapd, sta, 1);
- wpa_msg(hapd->msg_ctx, MSG_INFO,
- AP_STA_CONNECTED MACSTR, MAC2STR(sta->addr));
- }
-
- if (reassoc)
- mlme_reassociate_indication(hapd, sta);
- else
- mlme_associate_indication(hapd, sta);
-
-#ifdef CONFIG_IEEE80211W
- sta->sa_query_timed_out = 0;
-#endif /* CONFIG_IEEE80211W */
-
- /*
- * Remove the STA entry in order to make sure the STA PS state gets
- * cleared and configuration gets updated in case of reassociation back
- * to the same AP.
- */
- hostapd_drv_sta_remove(hapd, sta->addr);
-
-#ifdef CONFIG_IEEE80211N
- if (sta->flags & WLAN_STA_HT)
- hostapd_get_ht_capab(hapd, sta->ht_capabilities, &ht_cap);
-#endif /* CONFIG_IEEE80211N */
-
- if (hostapd_sta_add(hapd, sta->addr, sta->aid, sta->capability,
- sta->supported_rates, sta->supported_rates_len,
- sta->listen_interval,
- sta->flags & WLAN_STA_HT ? &ht_cap : NULL)) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_NOTICE,
- "Could not add STA to kernel driver");
- }
-
- if (sta->flags & WLAN_STA_WDS)
- hostapd_set_wds_sta(hapd, sta->addr, sta->aid, 1);
-
- if (sta->eapol_sm == NULL) {
- /*
- * This STA does not use RADIUS server for EAP authentication,
- * so bind it to the selected VLAN interface now, since the
- * interface selection is not going to change anymore.
- */
- if (ap_sta_bind_vlan(hapd, sta, 0) < 0)
- goto fail;
- } else if (sta->vlan_id) {
- /* VLAN ID already set (e.g., by PMKSA caching), so bind STA */
- if (ap_sta_bind_vlan(hapd, sta, 0) < 0)
- goto fail;
- }
-
- hostapd_set_sta_flags(hapd, sta);
-
- if (sta->auth_alg == WLAN_AUTH_FT)
- wpa_auth_sm_event(sta->wpa_sm, WPA_ASSOC_FT);
- else
- wpa_auth_sm_event(sta->wpa_sm, WPA_ASSOC);
- hapd->new_assoc_sta_cb(hapd, sta, !new_assoc);
-
- ieee802_1x_notify_port_enabled(sta->eapol_sm, 1);
-
- fail:
- /* Copy of the association request is not needed anymore */
- if (sta->last_assoc_req) {
- os_free(sta->last_assoc_req);
- sta->last_assoc_req = NULL;
- }
-}
-
-
-/**
- * ieee802_11_mgmt_cb - Process management frame TX status callback
- * @hapd: hostapd BSS data structure (the BSS from which the management frame
- * was sent from)
- * @buf: management frame data (starting from IEEE 802.11 header)
- * @len: length of frame data in octets
- * @stype: management frame subtype from frame control field
- * @ok: Whether the frame was ACK'ed
- */
-void ieee802_11_mgmt_cb(struct hostapd_data *hapd, const u8 *buf, size_t len,
- u16 stype, int ok)
-{
- const struct ieee80211_mgmt *mgmt;
- mgmt = (const struct ieee80211_mgmt *) buf;
-
- switch (stype) {
- case WLAN_FC_STYPE_AUTH:
- wpa_printf(MSG_DEBUG, "mgmt::auth cb");
- handle_auth_cb(hapd, mgmt, len, ok);
- break;
- case WLAN_FC_STYPE_ASSOC_RESP:
- wpa_printf(MSG_DEBUG, "mgmt::assoc_resp cb");
- handle_assoc_cb(hapd, mgmt, len, 0, ok);
- break;
- case WLAN_FC_STYPE_REASSOC_RESP:
- wpa_printf(MSG_DEBUG, "mgmt::reassoc_resp cb");
- handle_assoc_cb(hapd, mgmt, len, 1, ok);
- break;
- case WLAN_FC_STYPE_PROBE_RESP:
- wpa_printf(MSG_EXCESSIVE, "mgmt::proberesp cb");
- break;
- case WLAN_FC_STYPE_DEAUTH:
- /* ignore */
- break;
- case WLAN_FC_STYPE_ACTION:
- wpa_printf(MSG_DEBUG, "mgmt::action cb");
- break;
- default:
- printf("unknown mgmt cb frame subtype %d\n", stype);
- break;
- }
-}
-
-
-int ieee802_11_get_mib(struct hostapd_data *hapd, char *buf, size_t buflen)
-{
- /* TODO */
- return 0;
-}
-
-
-int ieee802_11_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta,
- char *buf, size_t buflen)
-{
- /* TODO */
- return 0;
-}
-
-
-void hostapd_tx_status(struct hostapd_data *hapd, const u8 *addr,
- const u8 *buf, size_t len, int ack)
-{
- struct sta_info *sta;
- struct hostapd_iface *iface = hapd->iface;
-
- sta = ap_get_sta(hapd, addr);
- if (sta == NULL && iface->num_bss > 1) {
- size_t j;
- for (j = 0; j < iface->num_bss; j++) {
- hapd = iface->bss[j];
- sta = ap_get_sta(hapd, addr);
- if (sta)
- break;
- }
- }
- if (sta == NULL)
- return;
- if (sta->flags & WLAN_STA_PENDING_POLL) {
- wpa_printf(MSG_DEBUG, "STA " MACSTR " %s pending "
- "activity poll", MAC2STR(sta->addr),
- ack ? "ACKed" : "did not ACK");
- if (ack)
- sta->flags &= ~WLAN_STA_PENDING_POLL;
- }
-
- ieee802_1x_tx_status(hapd, sta, buf, len, ack);
-}
-
-
-void ieee802_11_rx_from_unknown(struct hostapd_data *hapd, const u8 *src,
- int wds)
-{
- struct sta_info *sta;
-
- sta = ap_get_sta(hapd, src);
- if (sta && (sta->flags & WLAN_STA_ASSOC)) {
- if (wds && !(sta->flags & WLAN_STA_WDS)) {
- wpa_printf(MSG_DEBUG, "Enable 4-address WDS mode for "
- "STA " MACSTR " (aid %u)",
- MAC2STR(sta->addr), sta->aid);
- sta->flags |= WLAN_STA_WDS;
- hostapd_set_wds_sta(hapd, sta->addr, sta->aid, 1);
- }
- return;
- }
-
- wpa_printf(MSG_DEBUG, "Data/PS-poll frame from not associated STA "
- MACSTR, MAC2STR(src));
- if (src[0] & 0x01) {
- /* Broadcast bit set in SA?! Ignore the frame silently. */
- return;
- }
-
- if (sta && (sta->flags & WLAN_STA_ASSOC_REQ_OK)) {
- wpa_printf(MSG_DEBUG, "Association Response to the STA has "
- "already been sent, but no TX status yet known - "
- "ignore Class 3 frame issue with " MACSTR,
- MAC2STR(src));
- return;
- }
-
- if (sta && (sta->flags & WLAN_STA_AUTH))
- hostapd_drv_sta_disassoc(
- hapd, src,
- WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
- else
- hostapd_drv_sta_deauth(
- hapd, src,
- WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
-}
-
-
-#endif /* CONFIG_NATIVE_WINDOWS */
diff --git a/hostapd-0.8/src/ap/ieee802_11.h b/hostapd-0.8/src/ap/ieee802_11.h
deleted file mode 100644
index 157198c..0000000
--- a/hostapd-0.8/src/ap/ieee802_11.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * hostapd / IEEE 802.11 Management
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef IEEE802_11_H
-#define IEEE802_11_H
-
-struct hostapd_iface;
-struct hostapd_data;
-struct sta_info;
-struct hostapd_frame_info;
-struct ieee80211_ht_capabilities;
-
-void ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len,
- struct hostapd_frame_info *fi);
-void ieee802_11_mgmt_cb(struct hostapd_data *hapd, const u8 *buf, size_t len,
- u16 stype, int ok);
-void ieee802_11_print_ssid(char *buf, const u8 *ssid, u8 len);
-#ifdef NEED_AP_MLME
-int ieee802_11_get_mib(struct hostapd_data *hapd, char *buf, size_t buflen);
-int ieee802_11_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta,
- char *buf, size_t buflen);
-#else /* NEED_AP_MLME */
-static inline int ieee802_11_get_mib(struct hostapd_data *hapd, char *buf,
- size_t buflen)
-{
- return 0;
-}
-
-static inline int ieee802_11_get_mib_sta(struct hostapd_data *hapd,
- struct sta_info *sta,
- char *buf, size_t buflen)
-{
- return 0;
-}
-#endif /* NEED_AP_MLME */
-u16 hostapd_own_capab_info(struct hostapd_data *hapd, struct sta_info *sta,
- int probe);
-u8 * hostapd_eid_ext_capab(struct hostapd_data *hapd, u8 *eid);
-u8 * hostapd_eid_supp_rates(struct hostapd_data *hapd, u8 *eid);
-u8 * hostapd_eid_ext_supp_rates(struct hostapd_data *hapd, u8 *eid);
-u8 * hostapd_eid_ht_capabilities(struct hostapd_data *hapd, u8 *eid);
-u8 * hostapd_eid_ht_operation(struct hostapd_data *hapd, u8 *eid);
-int hostapd_ht_operation_update(struct hostapd_iface *iface);
-void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
- const u8 *addr, const u8 *trans_id);
-void hostapd_get_ht_capab(struct hostapd_data *hapd,
- struct ieee80211_ht_capabilities *ht_cap,
- struct ieee80211_ht_capabilities *neg_ht_cap);
-u16 copy_sta_ht_capab(struct hostapd_data *hapd, struct sta_info *sta,
- const u8 *ht_capab, size_t ht_capab_len);
-void update_ht_state(struct hostapd_data *hapd, struct sta_info *sta);
-void hostapd_tx_status(struct hostapd_data *hapd, const u8 *addr,
- const u8 *buf, size_t len, int ack);
-void ieee802_11_rx_from_unknown(struct hostapd_data *hapd, const u8 *src,
- int wds);
-
-#endif /* IEEE802_11_H */
diff --git a/hostapd-0.8/src/ap/ieee802_11_auth.c b/hostapd-0.8/src/ap/ieee802_11_auth.c
deleted file mode 100644
index b933263..0000000
--- a/hostapd-0.8/src/ap/ieee802_11_auth.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- * hostapd / IEEE 802.11 authentication (ACL)
- * Copyright (c) 2003-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- *
- * Access control list for IEEE 802.11 authentication can uses statically
- * configured ACL from configuration files or an external RADIUS server.
- * Results from external RADIUS queries are cached to allow faster
- * authentication frame processing.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "radius/radius.h"
-#include "radius/radius_client.h"
-#include "hostapd.h"
-#include "ap_config.h"
-#include "ap_drv_ops.h"
-#include "ieee802_11.h"
-#include "ieee802_11_auth.h"
-
-#define RADIUS_ACL_TIMEOUT 30
-
-
-struct hostapd_cached_radius_acl {
- os_time_t timestamp;
- macaddr addr;
- int accepted; /* HOSTAPD_ACL_* */
- struct hostapd_cached_radius_acl *next;
- u32 session_timeout;
- u32 acct_interim_interval;
- int vlan_id;
-};
-
-
-struct hostapd_acl_query_data {
- os_time_t timestamp;
- u8 radius_id;
- macaddr addr;
- u8 *auth_msg; /* IEEE 802.11 authentication frame from station */
- size_t auth_msg_len;
- struct hostapd_acl_query_data *next;
-};
-
-
-#ifndef CONFIG_NO_RADIUS
-static void hostapd_acl_cache_free(struct hostapd_cached_radius_acl *acl_cache)
-{
- struct hostapd_cached_radius_acl *prev;
-
- while (acl_cache) {
- prev = acl_cache;
- acl_cache = acl_cache->next;
- os_free(prev);
- }
-}
-
-
-static int hostapd_acl_cache_get(struct hostapd_data *hapd, const u8 *addr,
- u32 *session_timeout,
- u32 *acct_interim_interval, int *vlan_id)
-{
- struct hostapd_cached_radius_acl *entry;
- struct os_time now;
-
- os_get_time(&now);
- entry = hapd->acl_cache;
-
- while (entry) {
- if (os_memcmp(entry->addr, addr, ETH_ALEN) == 0) {
- if (now.sec - entry->timestamp > RADIUS_ACL_TIMEOUT)
- return -1; /* entry has expired */
- if (entry->accepted == HOSTAPD_ACL_ACCEPT_TIMEOUT)
- if (session_timeout)
- *session_timeout =
- entry->session_timeout;
- if (acct_interim_interval)
- *acct_interim_interval =
- entry->acct_interim_interval;
- if (vlan_id)
- *vlan_id = entry->vlan_id;
- return entry->accepted;
- }
-
- entry = entry->next;
- }
-
- return -1;
-}
-#endif /* CONFIG_NO_RADIUS */
-
-
-static void hostapd_acl_query_free(struct hostapd_acl_query_data *query)
-{
- if (query == NULL)
- return;
- os_free(query->auth_msg);
- os_free(query);
-}
-
-
-#ifndef CONFIG_NO_RADIUS
-static int hostapd_radius_acl_query(struct hostapd_data *hapd, const u8 *addr,
- struct hostapd_acl_query_data *query)
-{
- struct radius_msg *msg;
- char buf[128];
-
- query->radius_id = radius_client_get_id(hapd->radius);
- msg = radius_msg_new(RADIUS_CODE_ACCESS_REQUEST, query->radius_id);
- if (msg == NULL)
- return -1;
-
- radius_msg_make_authenticator(msg, addr, ETH_ALEN);
-
- os_snprintf(buf, sizeof(buf), RADIUS_ADDR_FORMAT, MAC2STR(addr));
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_USER_NAME, (u8 *) buf,
- os_strlen(buf))) {
- wpa_printf(MSG_DEBUG, "Could not add User-Name");
- goto fail;
- }
-
- if (!radius_msg_add_attr_user_password(
- msg, (u8 *) buf, os_strlen(buf),
- hapd->conf->radius->auth_server->shared_secret,
- hapd->conf->radius->auth_server->shared_secret_len)) {
- wpa_printf(MSG_DEBUG, "Could not add User-Password");
- goto fail;
- }
-
- if (hapd->conf->own_ip_addr.af == AF_INET &&
- !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IP_ADDRESS,
- (u8 *) &hapd->conf->own_ip_addr.u.v4, 4)) {
- wpa_printf(MSG_DEBUG, "Could not add NAS-IP-Address");
- goto fail;
- }
-
-#ifdef CONFIG_IPV6
- if (hapd->conf->own_ip_addr.af == AF_INET6 &&
- !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IPV6_ADDRESS,
- (u8 *) &hapd->conf->own_ip_addr.u.v6, 16)) {
- wpa_printf(MSG_DEBUG, "Could not add NAS-IPv6-Address");
- goto fail;
- }
-#endif /* CONFIG_IPV6 */
-
- if (hapd->conf->nas_identifier &&
- !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IDENTIFIER,
- (u8 *) hapd->conf->nas_identifier,
- os_strlen(hapd->conf->nas_identifier))) {
- wpa_printf(MSG_DEBUG, "Could not add NAS-Identifier");
- goto fail;
- }
-
- os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT ":%s",
- MAC2STR(hapd->own_addr), hapd->conf->ssid.ssid);
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_CALLED_STATION_ID,
- (u8 *) buf, os_strlen(buf))) {
- wpa_printf(MSG_DEBUG, "Could not add Called-Station-Id");
- goto fail;
- }
-
- os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT,
- MAC2STR(addr));
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_CALLING_STATION_ID,
- (u8 *) buf, os_strlen(buf))) {
- wpa_printf(MSG_DEBUG, "Could not add Calling-Station-Id");
- goto fail;
- }
-
- if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT_TYPE,
- RADIUS_NAS_PORT_TYPE_IEEE_802_11)) {
- wpa_printf(MSG_DEBUG, "Could not add NAS-Port-Type");
- goto fail;
- }
-
- os_snprintf(buf, sizeof(buf), "CONNECT 11Mbps 802.11b");
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_CONNECT_INFO,
- (u8 *) buf, os_strlen(buf))) {
- wpa_printf(MSG_DEBUG, "Could not add Connect-Info");
- goto fail;
- }
-
- radius_client_send(hapd->radius, msg, RADIUS_AUTH, addr);
- return 0;
-
- fail:
- radius_msg_free(msg);
- return -1;
-}
-#endif /* CONFIG_NO_RADIUS */
-
-
-/**
- * hostapd_allowed_address - Check whether a specified STA can be authenticated
- * @hapd: hostapd BSS data
- * @addr: MAC address of the STA
- * @msg: Authentication message
- * @len: Length of msg in octets
- * @session_timeout: Buffer for returning session timeout (from RADIUS)
- * @acct_interim_interval: Buffer for returning account interval (from RADIUS)
- * @vlan_id: Buffer for returning VLAN ID
- * Returns: HOSTAPD_ACL_ACCEPT, HOSTAPD_ACL_REJECT, or HOSTAPD_ACL_PENDING
- */
-int hostapd_allowed_address(struct hostapd_data *hapd, const u8 *addr,
- const u8 *msg, size_t len, u32 *session_timeout,
- u32 *acct_interim_interval, int *vlan_id)
-{
- if (session_timeout)
- *session_timeout = 0;
- if (acct_interim_interval)
- *acct_interim_interval = 0;
- if (vlan_id)
- *vlan_id = 0;
-
- if (hostapd_maclist_found(hapd->conf->accept_mac,
- hapd->conf->num_accept_mac, addr, vlan_id))
- return HOSTAPD_ACL_ACCEPT;
-
- if (hostapd_maclist_found(hapd->conf->deny_mac,
- hapd->conf->num_deny_mac, addr, vlan_id))
- return HOSTAPD_ACL_REJECT;
-
- if (hapd->conf->macaddr_acl == ACCEPT_UNLESS_DENIED)
- return HOSTAPD_ACL_ACCEPT;
- if (hapd->conf->macaddr_acl == DENY_UNLESS_ACCEPTED)
- return HOSTAPD_ACL_REJECT;
-
- if (hapd->conf->macaddr_acl == USE_EXTERNAL_RADIUS_AUTH) {
-#ifdef CONFIG_NO_RADIUS
- return HOSTAPD_ACL_REJECT;
-#else /* CONFIG_NO_RADIUS */
- struct hostapd_acl_query_data *query;
-
- /* Check whether ACL cache has an entry for this station */
- int res = hostapd_acl_cache_get(hapd, addr, session_timeout,
- acct_interim_interval,
- vlan_id);
- if (res == HOSTAPD_ACL_ACCEPT ||
- res == HOSTAPD_ACL_ACCEPT_TIMEOUT)
- return res;
- if (res == HOSTAPD_ACL_REJECT)
- return HOSTAPD_ACL_REJECT;
-
- query = hapd->acl_queries;
- while (query) {
- if (os_memcmp(query->addr, addr, ETH_ALEN) == 0) {
- /* pending query in RADIUS retransmit queue;
- * do not generate a new one */
- return HOSTAPD_ACL_PENDING;
- }
- query = query->next;
- }
-
- if (!hapd->conf->radius->auth_server)
- return HOSTAPD_ACL_REJECT;
-
- /* No entry in the cache - query external RADIUS server */
- query = os_zalloc(sizeof(*query));
- if (query == NULL) {
- wpa_printf(MSG_ERROR, "malloc for query data failed");
- return HOSTAPD_ACL_REJECT;
- }
- time(&query->timestamp);
- os_memcpy(query->addr, addr, ETH_ALEN);
- if (hostapd_radius_acl_query(hapd, addr, query)) {
- wpa_printf(MSG_DEBUG, "Failed to send Access-Request "
- "for ACL query.");
- hostapd_acl_query_free(query);
- return HOSTAPD_ACL_REJECT;
- }
-
- query->auth_msg = os_malloc(len);
- if (query->auth_msg == NULL) {
- wpa_printf(MSG_ERROR, "Failed to allocate memory for "
- "auth frame.");
- hostapd_acl_query_free(query);
- return HOSTAPD_ACL_REJECT;
- }
- os_memcpy(query->auth_msg, msg, len);
- query->auth_msg_len = len;
- query->next = hapd->acl_queries;
- hapd->acl_queries = query;
-
- /* Queued data will be processed in hostapd_acl_recv_radius()
- * when RADIUS server replies to the sent Access-Request. */
- return HOSTAPD_ACL_PENDING;
-#endif /* CONFIG_NO_RADIUS */
- }
-
- return HOSTAPD_ACL_REJECT;
-}
-
-
-#ifndef CONFIG_NO_RADIUS
-static void hostapd_acl_expire_cache(struct hostapd_data *hapd, os_time_t now)
-{
- struct hostapd_cached_radius_acl *prev, *entry, *tmp;
-
- prev = NULL;
- entry = hapd->acl_cache;
-
- while (entry) {
- if (now - entry->timestamp > RADIUS_ACL_TIMEOUT) {
- wpa_printf(MSG_DEBUG, "Cached ACL entry for " MACSTR
- " has expired.", MAC2STR(entry->addr));
- if (prev)
- prev->next = entry->next;
- else
- hapd->acl_cache = entry->next;
- hostapd_drv_set_radius_acl_expire(hapd, entry->addr);
- tmp = entry;
- entry = entry->next;
- os_free(tmp);
- continue;
- }
-
- prev = entry;
- entry = entry->next;
- }
-}
-
-
-static void hostapd_acl_expire_queries(struct hostapd_data *hapd,
- os_time_t now)
-{
- struct hostapd_acl_query_data *prev, *entry, *tmp;
-
- prev = NULL;
- entry = hapd->acl_queries;
-
- while (entry) {
- if (now - entry->timestamp > RADIUS_ACL_TIMEOUT) {
- wpa_printf(MSG_DEBUG, "ACL query for " MACSTR
- " has expired.", MAC2STR(entry->addr));
- if (prev)
- prev->next = entry->next;
- else
- hapd->acl_queries = entry->next;
-
- tmp = entry;
- entry = entry->next;
- hostapd_acl_query_free(tmp);
- continue;
- }
-
- prev = entry;
- entry = entry->next;
- }
-}
-
-
-/**
- * hostapd_acl_expire - ACL cache expiration callback
- * @eloop_ctx: struct hostapd_data *
- * @timeout_ctx: Not used
- */
-static void hostapd_acl_expire(void *eloop_ctx, void *timeout_ctx)
-{
- struct hostapd_data *hapd = eloop_ctx;
- struct os_time now;
-
- os_get_time(&now);
- hostapd_acl_expire_cache(hapd, now.sec);
- hostapd_acl_expire_queries(hapd, now.sec);
-
- eloop_register_timeout(10, 0, hostapd_acl_expire, hapd, NULL);
-}
-
-
-/**
- * hostapd_acl_recv_radius - Process incoming RADIUS Authentication messages
- * @msg: RADIUS response message
- * @req: RADIUS request message
- * @shared_secret: RADIUS shared secret
- * @shared_secret_len: Length of shared_secret in octets
- * @data: Context data (struct hostapd_data *)
- * Returns: RADIUS_RX_PROCESSED if RADIUS message was a reply to ACL query (and
- * was processed here) or RADIUS_RX_UNKNOWN if not.
- */
-static RadiusRxResult
-hostapd_acl_recv_radius(struct radius_msg *msg, struct radius_msg *req,
- const u8 *shared_secret, size_t shared_secret_len,
- void *data)
-{
- struct hostapd_data *hapd = data;
- struct hostapd_acl_query_data *query, *prev;
- struct hostapd_cached_radius_acl *cache;
- struct radius_hdr *hdr = radius_msg_get_hdr(msg);
-
- query = hapd->acl_queries;
- prev = NULL;
- while (query) {
- if (query->radius_id == hdr->identifier)
- break;
- prev = query;
- query = query->next;
- }
- if (query == NULL)
- return RADIUS_RX_UNKNOWN;
-
- wpa_printf(MSG_DEBUG, "Found matching Access-Request for RADIUS "
- "message (id=%d)", query->radius_id);
-
- if (radius_msg_verify(msg, shared_secret, shared_secret_len, req, 0)) {
- wpa_printf(MSG_INFO, "Incoming RADIUS packet did not have "
- "correct authenticator - dropped\n");
- return RADIUS_RX_INVALID_AUTHENTICATOR;
- }
-
- if (hdr->code != RADIUS_CODE_ACCESS_ACCEPT &&
- hdr->code != RADIUS_CODE_ACCESS_REJECT) {
- wpa_printf(MSG_DEBUG, "Unknown RADIUS message code %d to ACL "
- "query", hdr->code);
- return RADIUS_RX_UNKNOWN;
- }
-
- /* Insert Accept/Reject info into ACL cache */
- cache = os_zalloc(sizeof(*cache));
- if (cache == NULL) {
- wpa_printf(MSG_DEBUG, "Failed to add ACL cache entry");
- goto done;
- }
- time(&cache->timestamp);
- os_memcpy(cache->addr, query->addr, sizeof(cache->addr));
- if (hdr->code == RADIUS_CODE_ACCESS_ACCEPT) {
- if (radius_msg_get_attr_int32(msg, RADIUS_ATTR_SESSION_TIMEOUT,
- &cache->session_timeout) == 0)
- cache->accepted = HOSTAPD_ACL_ACCEPT_TIMEOUT;
- else
- cache->accepted = HOSTAPD_ACL_ACCEPT;
-
- if (radius_msg_get_attr_int32(
- msg, RADIUS_ATTR_ACCT_INTERIM_INTERVAL,
- &cache->acct_interim_interval) == 0 &&
- cache->acct_interim_interval < 60) {
- wpa_printf(MSG_DEBUG, "Ignored too small "
- "Acct-Interim-Interval %d for STA " MACSTR,
- cache->acct_interim_interval,
- MAC2STR(query->addr));
- cache->acct_interim_interval = 0;
- }
-
- cache->vlan_id = radius_msg_get_vlanid(msg);
- } else
- cache->accepted = HOSTAPD_ACL_REJECT;
- cache->next = hapd->acl_cache;
- hapd->acl_cache = cache;
-
-#ifdef CONFIG_DRIVER_RADIUS_ACL
- hostapd_drv_set_radius_acl_auth(hapd, query->addr, cache->accepted,
- cache->session_timeout);
-#else /* CONFIG_DRIVER_RADIUS_ACL */
-#ifdef NEED_AP_MLME
- /* Re-send original authentication frame for 802.11 processing */
- wpa_printf(MSG_DEBUG, "Re-sending authentication frame after "
- "successful RADIUS ACL query");
- ieee802_11_mgmt(hapd, query->auth_msg, query->auth_msg_len, NULL);
-#endif /* NEED_AP_MLME */
-#endif /* CONFIG_DRIVER_RADIUS_ACL */
-
- done:
- if (prev == NULL)
- hapd->acl_queries = query->next;
- else
- prev->next = query->next;
-
- hostapd_acl_query_free(query);
-
- return RADIUS_RX_PROCESSED;
-}
-#endif /* CONFIG_NO_RADIUS */
-
-
-/**
- * hostapd_acl_init: Initialize IEEE 802.11 ACL
- * @hapd: hostapd BSS data
- * Returns: 0 on success, -1 on failure
- */
-int hostapd_acl_init(struct hostapd_data *hapd)
-{
-#ifndef CONFIG_NO_RADIUS
- if (radius_client_register(hapd->radius, RADIUS_AUTH,
- hostapd_acl_recv_radius, hapd))
- return -1;
-
- eloop_register_timeout(10, 0, hostapd_acl_expire, hapd, NULL);
-#endif /* CONFIG_NO_RADIUS */
-
- return 0;
-}
-
-
-/**
- * hostapd_acl_deinit - Deinitialize IEEE 802.11 ACL
- * @hapd: hostapd BSS data
- */
-void hostapd_acl_deinit(struct hostapd_data *hapd)
-{
- struct hostapd_acl_query_data *query, *prev;
-
-#ifndef CONFIG_NO_RADIUS
- eloop_cancel_timeout(hostapd_acl_expire, hapd, NULL);
-
- hostapd_acl_cache_free(hapd->acl_cache);
-#endif /* CONFIG_NO_RADIUS */
-
- query = hapd->acl_queries;
- while (query) {
- prev = query;
- query = query->next;
- hostapd_acl_query_free(prev);
- }
-}
diff --git a/hostapd-0.8/src/ap/ieee802_11_auth.h b/hostapd-0.8/src/ap/ieee802_11_auth.h
deleted file mode 100644
index b2971e5..0000000
--- a/hostapd-0.8/src/ap/ieee802_11_auth.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * hostapd / IEEE 802.11 authentication (ACL)
- * Copyright (c) 2003-2005, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef IEEE802_11_AUTH_H
-#define IEEE802_11_AUTH_H
-
-enum {
- HOSTAPD_ACL_REJECT = 0,
- HOSTAPD_ACL_ACCEPT = 1,
- HOSTAPD_ACL_PENDING = 2,
- HOSTAPD_ACL_ACCEPT_TIMEOUT = 3
-};
-
-int hostapd_allowed_address(struct hostapd_data *hapd, const u8 *addr,
- const u8 *msg, size_t len, u32 *session_timeout,
- u32 *acct_interim_interval, int *vlan_id);
-int hostapd_acl_init(struct hostapd_data *hapd);
-void hostapd_acl_deinit(struct hostapd_data *hapd);
-
-#endif /* IEEE802_11_AUTH_H */
diff --git a/hostapd-0.8/src/ap/ieee802_11_ht.c b/hostapd-0.8/src/ap/ieee802_11_ht.c
deleted file mode 100644
index 3dce5cb..0000000
--- a/hostapd-0.8/src/ap/ieee802_11_ht.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * hostapd / IEEE 802.11n HT
- * Copyright (c) 2002-2009, Jouni Malinen
- * Copyright (c) 2007-2008, Intel Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "common/ieee802_11_defs.h"
-#include "drivers/driver.h"
-#include "hostapd.h"
-#include "ap_config.h"
-#include "sta_info.h"
-#include "beacon.h"
-#include "ieee802_11.h"
-
-
-u8 * hostapd_eid_ht_capabilities(struct hostapd_data *hapd, u8 *eid)
-{
- struct ieee80211_ht_capabilities *cap;
- u8 *pos = eid;
-
- if (!hapd->iconf->ieee80211n || !hapd->iface->current_mode ||
- hapd->conf->disable_11n)
- return eid;
-
- *pos++ = WLAN_EID_HT_CAP;
- *pos++ = sizeof(*cap);
-
- cap = (struct ieee80211_ht_capabilities *) pos;
- os_memset(cap, 0, sizeof(*cap));
- cap->ht_capabilities_info = host_to_le16(hapd->iconf->ht_capab);
- cap->a_mpdu_params = hapd->iface->current_mode->a_mpdu_params;
- os_memcpy(cap->supported_mcs_set, hapd->iface->current_mode->mcs_set,
- 16);
-
- /* TODO: ht_extended_capabilities (now fully disabled) */
- /* TODO: tx_bf_capability_info (now fully disabled) */
- /* TODO: asel_capabilities (now fully disabled) */
-
- pos += sizeof(*cap);
-
- return pos;
-}
-
-
-u8 * hostapd_eid_ht_operation(struct hostapd_data *hapd, u8 *eid)
-{
- struct ieee80211_ht_operation *oper;
- u8 *pos = eid;
-
- if (!hapd->iconf->ieee80211n || hapd->conf->disable_11n)
- return eid;
-
- *pos++ = WLAN_EID_HT_OPERATION;
- *pos++ = sizeof(*oper);
-
- oper = (struct ieee80211_ht_operation *) pos;
- os_memset(oper, 0, sizeof(*oper));
-
- oper->control_chan = hapd->iconf->channel;
- oper->operation_mode = host_to_le16(hapd->iface->ht_op_mode);
- if (hapd->iconf->secondary_channel == 1)
- oper->ht_param |= HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE |
- HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH;
- if (hapd->iconf->secondary_channel == -1)
- oper->ht_param |= HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW |
- HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH;
-
- pos += sizeof(*oper);
-
- return pos;
-}
-
-
-/*
-op_mode
-Set to 0 (HT pure) under the followign conditions
- - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or
- - all STAs in the BSS are 20 MHz HT in 20 MHz BSS
-Set to 1 (HT non-member protection) if there may be non-HT STAs
- in both the primary and the secondary channel
-Set to 2 if only HT STAs are associated in BSS,
- however and at least one 20 MHz HT STA is associated
-Set to 3 (HT mixed mode) when one or more non-HT STAs are associated
-*/
-int hostapd_ht_operation_update(struct hostapd_iface *iface)
-{
- u16 cur_op_mode, new_op_mode;
- int op_mode_changes = 0;
-
- if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed)
- return 0;
-
- wpa_printf(MSG_DEBUG, "%s current operation mode=0x%X",
- __func__, iface->ht_op_mode);
-
- if (!(iface->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)
- && iface->num_sta_ht_no_gf) {
- iface->ht_op_mode |=
- HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT;
- op_mode_changes++;
- } else if ((iface->ht_op_mode &
- HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) &&
- iface->num_sta_ht_no_gf == 0) {
- iface->ht_op_mode &=
- ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT;
- op_mode_changes++;
- }
-
- if (!(iface->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) &&
- (iface->num_sta_no_ht || iface->olbc_ht)) {
- iface->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT;
- op_mode_changes++;
- } else if ((iface->ht_op_mode &
- HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) &&
- (iface->num_sta_no_ht == 0 && !iface->olbc_ht)) {
- iface->ht_op_mode &=
- ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT;
- op_mode_changes++;
- }
-
- new_op_mode = 0;
- if (iface->num_sta_no_ht)
- new_op_mode = OP_MODE_MIXED;
- else if ((iface->conf->ht_capab & HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET)
- && iface->num_sta_ht_20mhz)
- new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED;
- else if (iface->olbc_ht)
- new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS;
- else
- new_op_mode = OP_MODE_PURE;
-
- cur_op_mode = iface->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK;
- if (cur_op_mode != new_op_mode) {
- iface->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK;
- iface->ht_op_mode |= new_op_mode;
- op_mode_changes++;
- }
-
- wpa_printf(MSG_DEBUG, "%s new operation mode=0x%X changes=%d",
- __func__, iface->ht_op_mode, op_mode_changes);
-
- return op_mode_changes;
-}
-
-
-u16 copy_sta_ht_capab(struct hostapd_data *hapd, struct sta_info *sta,
- const u8 *ht_capab, size_t ht_capab_len)
-{
- /* Disable HT caps for STAs associated to no-HT BSSes. */
- if (!ht_capab ||
- ht_capab_len < sizeof(struct ieee80211_ht_capabilities) ||
- hapd->conf->disable_11n) {
- sta->flags &= ~WLAN_STA_HT;
- os_free(sta->ht_capabilities);
- sta->ht_capabilities = NULL;
- return WLAN_STATUS_SUCCESS;
- }
-
- if (sta->ht_capabilities == NULL) {
- sta->ht_capabilities =
- os_zalloc(sizeof(struct ieee80211_ht_capabilities));
- if (sta->ht_capabilities == NULL)
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- sta->flags |= WLAN_STA_HT;
- os_memcpy(sta->ht_capabilities, ht_capab,
- sizeof(struct ieee80211_ht_capabilities));
-
- return WLAN_STATUS_SUCCESS;
-}
-
-
-static void update_sta_ht(struct hostapd_data *hapd, struct sta_info *sta)
-{
- u16 ht_capab;
-
- ht_capab = le_to_host16(sta->ht_capabilities->ht_capabilities_info);
- wpa_printf(MSG_DEBUG, "HT: STA " MACSTR " HT Capabilities Info: "
- "0x%04x", MAC2STR(sta->addr), ht_capab);
- if ((ht_capab & HT_CAP_INFO_GREEN_FIELD) == 0) {
- if (!sta->no_ht_gf_set) {
- sta->no_ht_gf_set = 1;
- hapd->iface->num_sta_ht_no_gf++;
- }
- wpa_printf(MSG_DEBUG, "%s STA " MACSTR " - no greenfield, num "
- "of non-gf stations %d",
- __func__, MAC2STR(sta->addr),
- hapd->iface->num_sta_ht_no_gf);
- }
- if ((ht_capab & HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET) == 0) {
- if (!sta->ht_20mhz_set) {
- sta->ht_20mhz_set = 1;
- hapd->iface->num_sta_ht_20mhz++;
- }
- wpa_printf(MSG_DEBUG, "%s STA " MACSTR " - 20 MHz HT, num of "
- "20MHz HT STAs %d",
- __func__, MAC2STR(sta->addr),
- hapd->iface->num_sta_ht_20mhz);
- }
-}
-
-
-static void update_sta_no_ht(struct hostapd_data *hapd, struct sta_info *sta)
-{
- if (!sta->no_ht_set) {
- sta->no_ht_set = 1;
- hapd->iface->num_sta_no_ht++;
- }
- if (hapd->iconf->ieee80211n) {
- wpa_printf(MSG_DEBUG, "%s STA " MACSTR " - no HT, num of "
- "non-HT stations %d",
- __func__, MAC2STR(sta->addr),
- hapd->iface->num_sta_no_ht);
- }
-}
-
-
-void update_ht_state(struct hostapd_data *hapd, struct sta_info *sta)
-{
- if ((sta->flags & WLAN_STA_HT) && sta->ht_capabilities)
- update_sta_ht(hapd, sta);
- else
- update_sta_no_ht(hapd, sta);
-
- if (hostapd_ht_operation_update(hapd->iface) > 0)
- ieee802_11_set_beacons(hapd->iface);
-}
-
-
-void hostapd_get_ht_capab(struct hostapd_data *hapd,
- struct ieee80211_ht_capabilities *ht_cap,
- struct ieee80211_ht_capabilities *neg_ht_cap)
-{
- u16 cap;
-
- if (ht_cap == NULL)
- return;
- os_memcpy(neg_ht_cap, ht_cap, sizeof(*neg_ht_cap));
- cap = le_to_host16(neg_ht_cap->ht_capabilities_info);
- cap &= hapd->iconf->ht_capab;
- cap |= (hapd->iconf->ht_capab & HT_CAP_INFO_SMPS_DISABLED);
-
- /*
- * STBC needs to be handled specially
- * if we don't support RX STBC, mask out TX STBC in the STA's HT caps
- * if we don't support TX STBC, mask out RX STBC in the STA's HT caps
- */
- if (!(hapd->iconf->ht_capab & HT_CAP_INFO_RX_STBC_MASK))
- cap &= ~HT_CAP_INFO_TX_STBC;
- if (!(hapd->iconf->ht_capab & HT_CAP_INFO_TX_STBC))
- cap &= ~HT_CAP_INFO_RX_STBC_MASK;
-
- neg_ht_cap->ht_capabilities_info = host_to_le16(cap);
-}
diff --git a/hostapd-0.8/src/ap/ieee802_1x.c b/hostapd-0.8/src/ap/ieee802_1x.c
deleted file mode 100644
index ac0c127..0000000
--- a/hostapd-0.8/src/ap/ieee802_1x.c
+++ /dev/null
@@ -1,2085 +0,0 @@
-/*
- * hostapd / IEEE 802.1X-2004 Authenticator
- * Copyright (c) 2002-2011, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "crypto/md5.h"
-#include "crypto/crypto.h"
-#include "crypto/random.h"
-#include "common/ieee802_11_defs.h"
-#include "common/wpa_ctrl.h"
-#include "radius/radius.h"
-#include "radius/radius_client.h"
-#include "eap_server/eap.h"
-#include "eap_common/eap_wsc_common.h"
-#include "eapol_auth/eapol_auth_sm.h"
-#include "eapol_auth/eapol_auth_sm_i.h"
-#include "hostapd.h"
-#include "accounting.h"
-#include "sta_info.h"
-#include "wpa_auth.h"
-#include "preauth_auth.h"
-#include "pmksa_cache_auth.h"
-#include "ap_config.h"
-#include "ap_drv_ops.h"
-#include "ieee802_1x.h"
-
-
-static void ieee802_1x_finished(struct hostapd_data *hapd,
- struct sta_info *sta, int success);
-
-
-static void ieee802_1x_send(struct hostapd_data *hapd, struct sta_info *sta,
- u8 type, const u8 *data, size_t datalen)
-{
- u8 *buf;
- struct ieee802_1x_hdr *xhdr;
- size_t len;
- int encrypt = 0;
-
- len = sizeof(*xhdr) + datalen;
- buf = os_zalloc(len);
- if (buf == NULL) {
- wpa_printf(MSG_ERROR, "malloc() failed for "
- "ieee802_1x_send(len=%lu)",
- (unsigned long) len);
- return;
- }
-
- xhdr = (struct ieee802_1x_hdr *) buf;
- xhdr->version = hapd->conf->eapol_version;
- xhdr->type = type;
- xhdr->length = host_to_be16(datalen);
-
- if (datalen > 0 && data != NULL)
- os_memcpy(xhdr + 1, data, datalen);
-
- if (wpa_auth_pairwise_set(sta->wpa_sm))
- encrypt = 1;
- if (sta->flags & WLAN_STA_PREAUTH) {
- rsn_preauth_send(hapd, sta, buf, len);
- } else {
- hostapd_drv_hapd_send_eapol(hapd, sta->addr, buf, len,
- encrypt, sta->flags);
- }
-
- os_free(buf);
-}
-
-
-void ieee802_1x_set_sta_authorized(struct hostapd_data *hapd,
- struct sta_info *sta, int authorized)
-{
- int res;
-
- if (sta->flags & WLAN_STA_PREAUTH)
- return;
-
- if (authorized) {
- if (!ap_sta_is_authorized(sta))
- wpa_msg(hapd->msg_ctx, MSG_INFO,
- AP_STA_CONNECTED MACSTR, MAC2STR(sta->addr));
- ap_sta_set_authorized(hapd, sta, 1);
- res = hostapd_set_authorized(hapd, sta, 1);
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG, "authorizing port");
- } else {
- if (ap_sta_is_authorized(sta) && (sta->flags & WLAN_STA_ASSOC))
- wpa_msg(hapd->msg_ctx, MSG_INFO,
- AP_STA_DISCONNECTED MACSTR,
- MAC2STR(sta->addr));
- ap_sta_set_authorized(hapd, sta, 0);
- res = hostapd_set_authorized(hapd, sta, 0);
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG, "unauthorizing port");
- }
-
- if (res && errno != ENOENT) {
- printf("Could not set station " MACSTR " flags for kernel "
- "driver (errno=%d).\n", MAC2STR(sta->addr), errno);
- }
-
- if (authorized)
- accounting_sta_start(hapd, sta);
-}
-
-
-static void ieee802_1x_tx_key_one(struct hostapd_data *hapd,
- struct sta_info *sta,
- int idx, int broadcast,
- u8 *key_data, size_t key_len)
-{
- u8 *buf, *ekey;
- struct ieee802_1x_hdr *hdr;
- struct ieee802_1x_eapol_key *key;
- size_t len, ekey_len;
- struct eapol_state_machine *sm = sta->eapol_sm;
-
- if (sm == NULL)
- return;
-
- len = sizeof(*key) + key_len;
- buf = os_zalloc(sizeof(*hdr) + len);
- if (buf == NULL)
- return;
-
- hdr = (struct ieee802_1x_hdr *) buf;
- key = (struct ieee802_1x_eapol_key *) (hdr + 1);
- key->type = EAPOL_KEY_TYPE_RC4;
- key->key_length = htons(key_len);
- wpa_get_ntp_timestamp(key->replay_counter);
-
- if (random_get_bytes(key->key_iv, sizeof(key->key_iv))) {
- wpa_printf(MSG_ERROR, "Could not get random numbers");
- os_free(buf);
- return;
- }
-
- key->key_index = idx | (broadcast ? 0 : BIT(7));
- if (hapd->conf->eapol_key_index_workaround) {
- /* According to some information, WinXP Supplicant seems to
- * interpret bit7 as an indication whether the key is to be
- * activated, so make it possible to enable workaround that
- * sets this bit for all keys. */
- key->key_index |= BIT(7);
- }
-
- /* Key is encrypted using "Key-IV + MSK[0..31]" as the RC4-key and
- * MSK[32..63] is used to sign the message. */
- if (sm->eap_if->eapKeyData == NULL || sm->eap_if->eapKeyDataLen < 64) {
- wpa_printf(MSG_ERROR, "No eapKeyData available for encrypting "
- "and signing EAPOL-Key");
- os_free(buf);
- return;
- }
- os_memcpy((u8 *) (key + 1), key_data, key_len);
- ekey_len = sizeof(key->key_iv) + 32;
- ekey = os_malloc(ekey_len);
- if (ekey == NULL) {
- wpa_printf(MSG_ERROR, "Could not encrypt key");
- os_free(buf);
- return;
- }
- os_memcpy(ekey, key->key_iv, sizeof(key->key_iv));
- os_memcpy(ekey + sizeof(key->key_iv), sm->eap_if->eapKeyData, 32);
- rc4_skip(ekey, ekey_len, 0, (u8 *) (key + 1), key_len);
- os_free(ekey);
-
- /* This header is needed here for HMAC-MD5, but it will be regenerated
- * in ieee802_1x_send() */
- hdr->version = hapd->conf->eapol_version;
- hdr->type = IEEE802_1X_TYPE_EAPOL_KEY;
- hdr->length = host_to_be16(len);
- hmac_md5(sm->eap_if->eapKeyData + 32, 32, buf, sizeof(*hdr) + len,
- key->key_signature);
-
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Sending EAPOL-Key to " MACSTR
- " (%s index=%d)", MAC2STR(sm->addr),
- broadcast ? "broadcast" : "unicast", idx);
- ieee802_1x_send(hapd, sta, IEEE802_1X_TYPE_EAPOL_KEY, (u8 *) key, len);
- if (sta->eapol_sm)
- sta->eapol_sm->dot1xAuthEapolFramesTx++;
- os_free(buf);
-}
-
-
-#ifndef CONFIG_NO_VLAN
-static struct hostapd_wep_keys *
-ieee802_1x_group_alloc(struct hostapd_data *hapd, const char *ifname)
-{
- struct hostapd_wep_keys *key;
-
- key = os_zalloc(sizeof(*key));
- if (key == NULL)
- return NULL;
-
- key->default_len = hapd->conf->default_wep_key_len;
-
- if (key->idx >= hapd->conf->broadcast_key_idx_max ||
- key->idx < hapd->conf->broadcast_key_idx_min)
- key->idx = hapd->conf->broadcast_key_idx_min;
- else
- key->idx++;
-
- if (!key->key[key->idx])
- key->key[key->idx] = os_malloc(key->default_len);
- if (key->key[key->idx] == NULL ||
- random_get_bytes(key->key[key->idx], key->default_len)) {
- printf("Could not generate random WEP key (dynamic VLAN).\n");
- os_free(key->key[key->idx]);
- key->key[key->idx] = NULL;
- os_free(key);
- return NULL;
- }
- key->len[key->idx] = key->default_len;
-
- wpa_printf(MSG_DEBUG, "%s: Default WEP idx %d for dynamic VLAN\n",
- ifname, key->idx);
- wpa_hexdump_key(MSG_DEBUG, "Default WEP key (dynamic VLAN)",
- key->key[key->idx], key->len[key->idx]);
-
- if (hostapd_drv_set_key(ifname, hapd, WPA_ALG_WEP,
- broadcast_ether_addr, key->idx, 1,
- NULL, 0, key->key[key->idx],
- key->len[key->idx]))
- printf("Could not set dynamic VLAN WEP encryption key.\n");
-
- hostapd_set_drv_ieee8021x(hapd, ifname, 1);
-
- return key;
-}
-
-
-static struct hostapd_wep_keys *
-ieee802_1x_get_group(struct hostapd_data *hapd, struct hostapd_ssid *ssid,
- size_t vlan_id)
-{
- const char *ifname;
-
- if (vlan_id == 0)
- return &ssid->wep;
-
- if (vlan_id <= ssid->max_dyn_vlan_keys && ssid->dyn_vlan_keys &&
- ssid->dyn_vlan_keys[vlan_id])
- return ssid->dyn_vlan_keys[vlan_id];
-
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Creating new group "
- "state machine for VLAN ID %lu",
- (unsigned long) vlan_id);
-
- ifname = hostapd_get_vlan_id_ifname(hapd->conf->vlan, vlan_id);
- if (ifname == NULL) {
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Unknown VLAN ID %lu - "
- "cannot create group key state machine",
- (unsigned long) vlan_id);
- return NULL;
- }
-
- if (ssid->dyn_vlan_keys == NULL) {
- int size = (vlan_id + 1) * sizeof(ssid->dyn_vlan_keys[0]);
- ssid->dyn_vlan_keys = os_zalloc(size);
- if (ssid->dyn_vlan_keys == NULL)
- return NULL;
- ssid->max_dyn_vlan_keys = vlan_id;
- }
-
- if (ssid->max_dyn_vlan_keys < vlan_id) {
- struct hostapd_wep_keys **na;
- int size = (vlan_id + 1) * sizeof(ssid->dyn_vlan_keys[0]);
- na = os_realloc(ssid->dyn_vlan_keys, size);
- if (na == NULL)
- return NULL;
- ssid->dyn_vlan_keys = na;
- os_memset(&ssid->dyn_vlan_keys[ssid->max_dyn_vlan_keys + 1], 0,
- (vlan_id - ssid->max_dyn_vlan_keys) *
- sizeof(ssid->dyn_vlan_keys[0]));
- ssid->max_dyn_vlan_keys = vlan_id;
- }
-
- ssid->dyn_vlan_keys[vlan_id] = ieee802_1x_group_alloc(hapd, ifname);
-
- return ssid->dyn_vlan_keys[vlan_id];
-}
-#endif /* CONFIG_NO_VLAN */
-
-
-void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta)
-{
- struct eapol_authenticator *eapol = hapd->eapol_auth;
- struct eapol_state_machine *sm = sta->eapol_sm;
-#ifndef CONFIG_NO_VLAN
- struct hostapd_wep_keys *key = NULL;
- int vlan_id;
-#endif /* CONFIG_NO_VLAN */
-
- if (sm == NULL || !sm->eap_if->eapKeyData)
- return;
-
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Sending EAPOL-Key(s) to " MACSTR,
- MAC2STR(sta->addr));
-
-#ifndef CONFIG_NO_VLAN
- vlan_id = sta->vlan_id;
- if (vlan_id < 0 || vlan_id > MAX_VLAN_ID)
- vlan_id = 0;
-
- if (vlan_id) {
- key = ieee802_1x_get_group(hapd, sta->ssid, vlan_id);
- if (key && key->key[key->idx])
- ieee802_1x_tx_key_one(hapd, sta, key->idx, 1,
- key->key[key->idx],
- key->len[key->idx]);
- } else
-#endif /* CONFIG_NO_VLAN */
- if (eapol->default_wep_key) {
- ieee802_1x_tx_key_one(hapd, sta, eapol->default_wep_key_idx, 1,
- eapol->default_wep_key,
- hapd->conf->default_wep_key_len);
- }
-
- if (hapd->conf->individual_wep_key_len > 0) {
- u8 *ikey;
- ikey = os_malloc(hapd->conf->individual_wep_key_len);
- if (ikey == NULL ||
- random_get_bytes(ikey, hapd->conf->individual_wep_key_len))
- {
- wpa_printf(MSG_ERROR, "Could not generate random "
- "individual WEP key.");
- os_free(ikey);
- return;
- }
-
- wpa_hexdump_key(MSG_DEBUG, "Individual WEP key",
- ikey, hapd->conf->individual_wep_key_len);
-
- ieee802_1x_tx_key_one(hapd, sta, 0, 0, ikey,
- hapd->conf->individual_wep_key_len);
-
- /* TODO: set encryption in TX callback, i.e., only after STA
- * has ACKed EAPOL-Key frame */
- if (hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_WEP,
- sta->addr, 0, 1, NULL, 0, ikey,
- hapd->conf->individual_wep_key_len)) {
- wpa_printf(MSG_ERROR, "Could not set individual WEP "
- "encryption.");
- }
-
- os_free(ikey);
- }
-}
-
-
-const char *radius_mode_txt(struct hostapd_data *hapd)
-{
- switch (hapd->iface->conf->hw_mode) {
- case HOSTAPD_MODE_IEEE80211A:
- return "802.11a";
- case HOSTAPD_MODE_IEEE80211G:
- return "802.11g";
- case HOSTAPD_MODE_IEEE80211B:
- default:
- return "802.11b";
- }
-}
-
-
-int radius_sta_rate(struct hostapd_data *hapd, struct sta_info *sta)
-{
- int i;
- u8 rate = 0;
-
- for (i = 0; i < sta->supported_rates_len; i++)
- if ((sta->supported_rates[i] & 0x7f) > rate)
- rate = sta->supported_rates[i] & 0x7f;
-
- return rate;
-}
-
-
-#ifndef CONFIG_NO_RADIUS
-static void ieee802_1x_learn_identity(struct hostapd_data *hapd,
- struct eapol_state_machine *sm,
- const u8 *eap, size_t len)
-{
- const u8 *identity;
- size_t identity_len;
-
- if (len <= sizeof(struct eap_hdr) ||
- eap[sizeof(struct eap_hdr)] != EAP_TYPE_IDENTITY)
- return;
-
- identity = eap_get_identity(sm->eap, &identity_len);
- if (identity == NULL)
- return;
-
- /* Save station identity for future RADIUS packets */
- os_free(sm->identity);
- sm->identity = os_malloc(identity_len + 1);
- if (sm->identity == NULL) {
- sm->identity_len = 0;
- return;
- }
-
- os_memcpy(sm->identity, identity, identity_len);
- sm->identity_len = identity_len;
- sm->identity[identity_len] = '\0';
- hostapd_logger(hapd, sm->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG, "STA identity '%s'", sm->identity);
- sm->dot1xAuthEapolRespIdFramesRx++;
-}
-
-
-static void ieee802_1x_encapsulate_radius(struct hostapd_data *hapd,
- struct sta_info *sta,
- const u8 *eap, size_t len)
-{
- struct radius_msg *msg;
- char buf[128];
- struct eapol_state_machine *sm = sta->eapol_sm;
-
- if (sm == NULL)
- return;
-
- ieee802_1x_learn_identity(hapd, sm, eap, len);
-
- wpa_printf(MSG_DEBUG, "Encapsulating EAP message into a RADIUS "
- "packet");
-
- sm->radius_identifier = radius_client_get_id(hapd->radius);
- msg = radius_msg_new(RADIUS_CODE_ACCESS_REQUEST,
- sm->radius_identifier);
- if (msg == NULL) {
- printf("Could not create net RADIUS packet\n");
- return;
- }
-
- radius_msg_make_authenticator(msg, (u8 *) sta, sizeof(*sta));
-
- if (sm->identity &&
- !radius_msg_add_attr(msg, RADIUS_ATTR_USER_NAME,
- sm->identity, sm->identity_len)) {
- printf("Could not add User-Name\n");
- goto fail;
- }
-
- if (hapd->conf->own_ip_addr.af == AF_INET &&
- !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IP_ADDRESS,
- (u8 *) &hapd->conf->own_ip_addr.u.v4, 4)) {
- printf("Could not add NAS-IP-Address\n");
- goto fail;
- }
-
-#ifdef CONFIG_IPV6
- if (hapd->conf->own_ip_addr.af == AF_INET6 &&
- !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IPV6_ADDRESS,
- (u8 *) &hapd->conf->own_ip_addr.u.v6, 16)) {
- printf("Could not add NAS-IPv6-Address\n");
- goto fail;
- }
-#endif /* CONFIG_IPV6 */
-
- if (hapd->conf->nas_identifier &&
- !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IDENTIFIER,
- (u8 *) hapd->conf->nas_identifier,
- os_strlen(hapd->conf->nas_identifier))) {
- printf("Could not add NAS-Identifier\n");
- goto fail;
- }
-
- if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT, sta->aid)) {
- printf("Could not add NAS-Port\n");
- goto fail;
- }
-
- os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT ":%s",
- MAC2STR(hapd->own_addr), hapd->conf->ssid.ssid);
- buf[sizeof(buf) - 1] = '\0';
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_CALLED_STATION_ID,
- (u8 *) buf, os_strlen(buf))) {
- printf("Could not add Called-Station-Id\n");
- goto fail;
- }
-
- os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT,
- MAC2STR(sta->addr));
- buf[sizeof(buf) - 1] = '\0';
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_CALLING_STATION_ID,
- (u8 *) buf, os_strlen(buf))) {
- printf("Could not add Calling-Station-Id\n");
- goto fail;
- }
-
- /* TODO: should probably check MTU from driver config; 2304 is max for
- * IEEE 802.11, but use 1400 to avoid problems with too large packets
- */
- if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_FRAMED_MTU, 1400)) {
- printf("Could not add Framed-MTU\n");
- goto fail;
- }
-
- if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT_TYPE,
- RADIUS_NAS_PORT_TYPE_IEEE_802_11)) {
- printf("Could not add NAS-Port-Type\n");
- goto fail;
- }
-
- if (sta->flags & WLAN_STA_PREAUTH) {
- os_strlcpy(buf, "IEEE 802.11i Pre-Authentication",
- sizeof(buf));
- } else {
- os_snprintf(buf, sizeof(buf), "CONNECT %d%sMbps %s",
- radius_sta_rate(hapd, sta) / 2,
- (radius_sta_rate(hapd, sta) & 1) ? ".5" : "",
- radius_mode_txt(hapd));
- buf[sizeof(buf) - 1] = '\0';
- }
- if (!radius_msg_add_attr(msg, RADIUS_ATTR_CONNECT_INFO,
- (u8 *) buf, os_strlen(buf))) {
- printf("Could not add Connect-Info\n");
- goto fail;
- }
-
- if (eap && !radius_msg_add_eap(msg, eap, len)) {
- printf("Could not add EAP-Message\n");
- goto fail;
- }
-
- /* State attribute must be copied if and only if this packet is
- * Access-Request reply to the previous Access-Challenge */
- if (sm->last_recv_radius &&
- radius_msg_get_hdr(sm->last_recv_radius)->code ==
- RADIUS_CODE_ACCESS_CHALLENGE) {
- int res = radius_msg_copy_attr(msg, sm->last_recv_radius,
- RADIUS_ATTR_STATE);
- if (res < 0) {
- printf("Could not copy State attribute from previous "
- "Access-Challenge\n");
- goto fail;
- }
- if (res > 0) {
- wpa_printf(MSG_DEBUG, "Copied RADIUS State Attribute");
- }
- }
-
- if (radius_client_send(hapd->radius, msg, RADIUS_AUTH, sta->addr) < 0)
- goto fail;
-
- return;
-
- fail:
- radius_msg_free(msg);
-}
-#endif /* CONFIG_NO_RADIUS */
-
-
-static void handle_eap_response(struct hostapd_data *hapd,
- struct sta_info *sta, struct eap_hdr *eap,
- size_t len)
-{
- u8 type, *data;
- struct eapol_state_machine *sm = sta->eapol_sm;
- if (sm == NULL)
- return;
-
- data = (u8 *) (eap + 1);
-
- if (len < sizeof(*eap) + 1) {
- printf("handle_eap_response: too short response data\n");
- return;
- }
-
- sm->eap_type_supp = type = data[0];
-
- hostapd_logger(hapd, sm->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG, "received EAP packet (code=%d "
- "id=%d len=%d) from STA: EAP Response-%s (%d)",
- eap->code, eap->identifier, be_to_host16(eap->length),
- eap_server_get_name(0, type), type);
-
- sm->dot1xAuthEapolRespFramesRx++;
-
- wpabuf_free(sm->eap_if->eapRespData);
- sm->eap_if->eapRespData = wpabuf_alloc_copy(eap, len);
- sm->eapolEap = TRUE;
-}
-
-
-/* Process incoming EAP packet from Supplicant */
-static void handle_eap(struct hostapd_data *hapd, struct sta_info *sta,
- u8 *buf, size_t len)
-{
- struct eap_hdr *eap;
- u16 eap_len;
-
- if (len < sizeof(*eap)) {
- printf(" too short EAP packet\n");
- return;
- }
-
- eap = (struct eap_hdr *) buf;
-
- eap_len = be_to_host16(eap->length);
- wpa_printf(MSG_DEBUG, "EAP: code=%d identifier=%d length=%d",
- eap->code, eap->identifier, eap_len);
- if (eap_len < sizeof(*eap)) {
- wpa_printf(MSG_DEBUG, " Invalid EAP length");
- return;
- } else if (eap_len > len) {
- wpa_printf(MSG_DEBUG, " Too short frame to contain this EAP "
- "packet");
- return;
- } else if (eap_len < len) {
- wpa_printf(MSG_DEBUG, " Ignoring %lu extra bytes after EAP "
- "packet", (unsigned long) len - eap_len);
- }
-
- switch (eap->code) {
- case EAP_CODE_REQUEST:
- wpa_printf(MSG_DEBUG, " (request)");
- return;
- case EAP_CODE_RESPONSE:
- wpa_printf(MSG_DEBUG, " (response)");
- handle_eap_response(hapd, sta, eap, eap_len);
- break;
- case EAP_CODE_SUCCESS:
- wpa_printf(MSG_DEBUG, " (success)");
- return;
- case EAP_CODE_FAILURE:
- wpa_printf(MSG_DEBUG, " (failure)");
- return;
- default:
- wpa_printf(MSG_DEBUG, " (unknown code)");
- return;
- }
-}
-
-
-static struct eapol_state_machine *
-ieee802_1x_alloc_eapol_sm(struct hostapd_data *hapd, struct sta_info *sta)
-{
- int flags = 0;
- if (sta->flags & WLAN_STA_PREAUTH)
- flags |= EAPOL_SM_PREAUTH;
- if (sta->wpa_sm) {
- flags |= EAPOL_SM_USES_WPA;
- if (wpa_auth_sta_get_pmksa(sta->wpa_sm))
- flags |= EAPOL_SM_FROM_PMKSA_CACHE;
- }
- return eapol_auth_alloc(hapd->eapol_auth, sta->addr, flags,
- sta->wps_ie, sta->p2p_ie, sta);
-}
-
-
-/**
- * ieee802_1x_receive - Process the EAPOL frames from the Supplicant
- * @hapd: hostapd BSS data
- * @sa: Source address (sender of the EAPOL frame)
- * @buf: EAPOL frame
- * @len: Length of buf in octets
- *
- * This function is called for each incoming EAPOL frame from the interface
- */
-void ieee802_1x_receive(struct hostapd_data *hapd, const u8 *sa, const u8 *buf,
- size_t len)
-{
- struct sta_info *sta;
- struct ieee802_1x_hdr *hdr;
- struct ieee802_1x_eapol_key *key;
- u16 datalen;
- struct rsn_pmksa_cache_entry *pmksa;
- int key_mgmt;
-
- if (!hapd->conf->ieee802_1x && !hapd->conf->wpa &&
- !hapd->conf->wps_state)
- return;
-
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: %lu bytes from " MACSTR,
- (unsigned long) len, MAC2STR(sa));
- sta = ap_get_sta(hapd, sa);
- if (!sta || !(sta->flags & (WLAN_STA_ASSOC | WLAN_STA_PREAUTH))) {
- wpa_printf(MSG_DEBUG, "IEEE 802.1X data frame from not "
- "associated/Pre-authenticating STA");
- return;
- }
-
- if (len < sizeof(*hdr)) {
- printf(" too short IEEE 802.1X packet\n");
- return;
- }
-
- hdr = (struct ieee802_1x_hdr *) buf;
- datalen = be_to_host16(hdr->length);
- wpa_printf(MSG_DEBUG, " IEEE 802.1X: version=%d type=%d length=%d",
- hdr->version, hdr->type, datalen);
-
- if (len - sizeof(*hdr) < datalen) {
- printf(" frame too short for this IEEE 802.1X packet\n");
- if (sta->eapol_sm)
- sta->eapol_sm->dot1xAuthEapLengthErrorFramesRx++;
- return;
- }
- if (len - sizeof(*hdr) > datalen) {
- wpa_printf(MSG_DEBUG, " ignoring %lu extra octets after "
- "IEEE 802.1X packet",
- (unsigned long) len - sizeof(*hdr) - datalen);
- }
-
- if (sta->eapol_sm) {
- sta->eapol_sm->dot1xAuthLastEapolFrameVersion = hdr->version;
- sta->eapol_sm->dot1xAuthEapolFramesRx++;
- }
-
- key = (struct ieee802_1x_eapol_key *) (hdr + 1);
- if (datalen >= sizeof(struct ieee802_1x_eapol_key) &&
- hdr->type == IEEE802_1X_TYPE_EAPOL_KEY &&
- (key->type == EAPOL_KEY_TYPE_WPA ||
- key->type == EAPOL_KEY_TYPE_RSN)) {
- wpa_receive(hapd->wpa_auth, sta->wpa_sm, (u8 *) hdr,
- sizeof(*hdr) + datalen);
- return;
- }
-
- if (!hapd->conf->ieee802_1x &&
- !(sta->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS))) {
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Ignore EAPOL message - "
- "802.1X not enabled and WPS not used");
- return;
- }
-
- key_mgmt = wpa_auth_sta_key_mgmt(sta->wpa_sm);
- if (key_mgmt != -1 && wpa_key_mgmt_wpa_psk(key_mgmt)) {
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Ignore EAPOL message - "
- "STA is using PSK");
- return;
- }
-
- if (!sta->eapol_sm) {
- sta->eapol_sm = ieee802_1x_alloc_eapol_sm(hapd, sta);
- if (!sta->eapol_sm)
- return;
-
-#ifdef CONFIG_WPS
- if (!hapd->conf->ieee802_1x &&
- ((sta->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS)) ==
- WLAN_STA_MAYBE_WPS)) {
- /*
- * Delay EAPOL frame transmission until a possible WPS
- * STA initiates the handshake with EAPOL-Start.
- */
- sta->eapol_sm->flags |= EAPOL_SM_WAIT_START;
- }
-#endif /* CONFIG_WPS */
-
- sta->eapol_sm->eap_if->portEnabled = TRUE;
- }
-
- /* since we support version 1, we can ignore version field and proceed
- * as specified in version 1 standard [IEEE Std 802.1X-2001, 7.5.5] */
- /* TODO: actually, we are not version 1 anymore.. However, Version 2
- * does not change frame contents, so should be ok to process frames
- * more or less identically. Some changes might be needed for
- * verification of fields. */
-
- switch (hdr->type) {
- case IEEE802_1X_TYPE_EAP_PACKET:
- handle_eap(hapd, sta, (u8 *) (hdr + 1), datalen);
- break;
-
- case IEEE802_1X_TYPE_EAPOL_START:
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG, "received EAPOL-Start "
- "from STA");
- sta->eapol_sm->flags &= ~EAPOL_SM_WAIT_START;
- pmksa = wpa_auth_sta_get_pmksa(sta->wpa_sm);
- if (pmksa) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA,
- HOSTAPD_LEVEL_DEBUG, "cached PMKSA "
- "available - ignore it since "
- "STA sent EAPOL-Start");
- wpa_auth_sta_clear_pmksa(sta->wpa_sm, pmksa);
- }
- sta->eapol_sm->eapolStart = TRUE;
- sta->eapol_sm->dot1xAuthEapolStartFramesRx++;
- eap_server_clear_identity(sta->eapol_sm->eap);
- wpa_auth_sm_event(sta->wpa_sm, WPA_REAUTH_EAPOL);
- break;
-
- case IEEE802_1X_TYPE_EAPOL_LOGOFF:
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG, "received EAPOL-Logoff "
- "from STA");
- sta->acct_terminate_cause =
- RADIUS_ACCT_TERMINATE_CAUSE_USER_REQUEST;
- accounting_sta_stop(hapd, sta);
- sta->eapol_sm->eapolLogoff = TRUE;
- sta->eapol_sm->dot1xAuthEapolLogoffFramesRx++;
- eap_server_clear_identity(sta->eapol_sm->eap);
- break;
-
- case IEEE802_1X_TYPE_EAPOL_KEY:
- wpa_printf(MSG_DEBUG, " EAPOL-Key");
- if (!ap_sta_is_authorized(sta)) {
- wpa_printf(MSG_DEBUG, " Dropped key data from "
- "unauthorized Supplicant");
- break;
- }
- break;
-
- case IEEE802_1X_TYPE_EAPOL_ENCAPSULATED_ASF_ALERT:
- wpa_printf(MSG_DEBUG, " EAPOL-Encapsulated-ASF-Alert");
- /* TODO: implement support for this; show data */
- break;
-
- default:
- wpa_printf(MSG_DEBUG, " unknown IEEE 802.1X packet type");
- sta->eapol_sm->dot1xAuthInvalidEapolFramesRx++;
- break;
- }
-
- eapol_auth_step(sta->eapol_sm);
-}
-
-
-/**
- * ieee802_1x_new_station - Start IEEE 802.1X authentication
- * @hapd: hostapd BSS data
- * @sta: The station
- *
- * This function is called to start IEEE 802.1X authentication when a new
- * station completes IEEE 802.11 association.
- */
-void ieee802_1x_new_station(struct hostapd_data *hapd, struct sta_info *sta)
-{
- struct rsn_pmksa_cache_entry *pmksa;
- int reassoc = 1;
- int force_1x = 0;
- int key_mgmt;
-
-#ifdef CONFIG_WPS
- if (hapd->conf->wps_state && hapd->conf->wpa &&
- (sta->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS))) {
- /*
- * Need to enable IEEE 802.1X/EAPOL state machines for possible
- * WPS handshake even if IEEE 802.1X/EAPOL is not used for
- * authentication in this BSS.
- */
- force_1x = 1;
- }
-#endif /* CONFIG_WPS */
-
- if (!force_1x && !hapd->conf->ieee802_1x) {
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Ignore STA - "
- "802.1X not enabled or forced for WPS");
- return;
- }
-
- key_mgmt = wpa_auth_sta_key_mgmt(sta->wpa_sm);
- if (key_mgmt != -1 && wpa_key_mgmt_wpa_psk(key_mgmt)) {
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Ignore STA - using PSK");
- return;
- }
-
- if (sta->eapol_sm == NULL) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG, "start authentication");
- sta->eapol_sm = ieee802_1x_alloc_eapol_sm(hapd, sta);
- if (sta->eapol_sm == NULL) {
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_INFO,
- "failed to allocate state machine");
- return;
- }
- reassoc = 0;
- }
-
-#ifdef CONFIG_WPS
- sta->eapol_sm->flags &= ~EAPOL_SM_WAIT_START;
- if (!hapd->conf->ieee802_1x && !(sta->flags & WLAN_STA_WPS)) {
- /*
- * Delay EAPOL frame transmission until a possible WPS
- * initiates the handshake with EAPOL-Start.
- */
- sta->eapol_sm->flags |= EAPOL_SM_WAIT_START;
- }
-#endif /* CONFIG_WPS */
-
- sta->eapol_sm->eap_if->portEnabled = TRUE;
-
-#ifdef CONFIG_IEEE80211R
- if (sta->auth_alg == WLAN_AUTH_FT) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG,
- "PMK from FT - skip IEEE 802.1X/EAP");
- /* Setup EAPOL state machines to already authenticated state
- * because of existing FT information from R0KH. */
- sta->eapol_sm->keyRun = TRUE;
- sta->eapol_sm->eap_if->eapKeyAvailable = TRUE;
- sta->eapol_sm->auth_pae_state = AUTH_PAE_AUTHENTICATING;
- sta->eapol_sm->be_auth_state = BE_AUTH_SUCCESS;
- sta->eapol_sm->authSuccess = TRUE;
- if (sta->eapol_sm->eap)
- eap_sm_notify_cached(sta->eapol_sm->eap);
- /* TODO: get vlan_id from R0KH using RRB message */
- return;
- }
-#endif /* CONFIG_IEEE80211R */
-
- pmksa = wpa_auth_sta_get_pmksa(sta->wpa_sm);
- if (pmksa) {
- int old_vlanid;
-
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG,
- "PMK from PMKSA cache - skip IEEE 802.1X/EAP");
- /* Setup EAPOL state machines to already authenticated state
- * because of existing PMKSA information in the cache. */
- sta->eapol_sm->keyRun = TRUE;
- sta->eapol_sm->eap_if->eapKeyAvailable = TRUE;
- sta->eapol_sm->auth_pae_state = AUTH_PAE_AUTHENTICATING;
- sta->eapol_sm->be_auth_state = BE_AUTH_SUCCESS;
- sta->eapol_sm->authSuccess = TRUE;
- if (sta->eapol_sm->eap)
- eap_sm_notify_cached(sta->eapol_sm->eap);
- old_vlanid = sta->vlan_id;
- pmksa_cache_to_eapol_data(pmksa, sta->eapol_sm);
- if (sta->ssid->dynamic_vlan == DYNAMIC_VLAN_DISABLED)
- sta->vlan_id = 0;
- ap_sta_bind_vlan(hapd, sta, old_vlanid);
- } else {
- if (reassoc) {
- /*
- * Force EAPOL state machines to start
- * re-authentication without having to wait for the
- * Supplicant to send EAPOL-Start.
- */
- sta->eapol_sm->reAuthenticate = TRUE;
- }
- eapol_auth_step(sta->eapol_sm);
- }
-}
-
-
-void ieee802_1x_free_station(struct sta_info *sta)
-{
- struct eapol_state_machine *sm = sta->eapol_sm;
-
- if (sm == NULL)
- return;
-
- sta->eapol_sm = NULL;
-
-#ifndef CONFIG_NO_RADIUS
- radius_msg_free(sm->last_recv_radius);
- radius_free_class(&sm->radius_class);
-#endif /* CONFIG_NO_RADIUS */
-
- os_free(sm->identity);
- eapol_auth_free(sm);
-}
-
-
-#ifndef CONFIG_NO_RADIUS
-static void ieee802_1x_decapsulate_radius(struct hostapd_data *hapd,
- struct sta_info *sta)
-{
- u8 *eap;
- size_t len;
- struct eap_hdr *hdr;
- int eap_type = -1;
- char buf[64];
- struct radius_msg *msg;
- struct eapol_state_machine *sm = sta->eapol_sm;
-
- if (sm == NULL || sm->last_recv_radius == NULL) {
- if (sm)
- sm->eap_if->aaaEapNoReq = TRUE;
- return;
- }
-
- msg = sm->last_recv_radius;
-
- eap = radius_msg_get_eap(msg, &len);
- if (eap == NULL) {
- /* RFC 3579, Chap. 2.6.3:
- * RADIUS server SHOULD NOT send Access-Reject/no EAP-Message
- * attribute */
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_WARNING, "could not extract "
- "EAP-Message from RADIUS message");
- sm->eap_if->aaaEapNoReq = TRUE;
- return;
- }
-
- if (len < sizeof(*hdr)) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_WARNING, "too short EAP packet "
- "received from authentication server");
- os_free(eap);
- sm->eap_if->aaaEapNoReq = TRUE;
- return;
- }
-
- if (len > sizeof(*hdr))
- eap_type = eap[sizeof(*hdr)];
-
- hdr = (struct eap_hdr *) eap;
- switch (hdr->code) {
- case EAP_CODE_REQUEST:
- if (eap_type >= 0)
- sm->eap_type_authsrv = eap_type;
- os_snprintf(buf, sizeof(buf), "EAP-Request-%s (%d)",
- eap_type >= 0 ? eap_server_get_name(0, eap_type) :
- "??",
- eap_type);
- break;
- case EAP_CODE_RESPONSE:
- os_snprintf(buf, sizeof(buf), "EAP Response-%s (%d)",
- eap_type >= 0 ? eap_server_get_name(0, eap_type) :
- "??",
- eap_type);
- break;
- case EAP_CODE_SUCCESS:
- os_strlcpy(buf, "EAP Success", sizeof(buf));
- break;
- case EAP_CODE_FAILURE:
- os_strlcpy(buf, "EAP Failure", sizeof(buf));
- break;
- default:
- os_strlcpy(buf, "unknown EAP code", sizeof(buf));
- break;
- }
- buf[sizeof(buf) - 1] = '\0';
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG, "decapsulated EAP packet (code=%d "
- "id=%d len=%d) from RADIUS server: %s",
- hdr->code, hdr->identifier, be_to_host16(hdr->length),
- buf);
- sm->eap_if->aaaEapReq = TRUE;
-
- wpabuf_free(sm->eap_if->aaaEapReqData);
- sm->eap_if->aaaEapReqData = wpabuf_alloc_ext_data(eap, len);
-}
-
-
-static void ieee802_1x_get_keys(struct hostapd_data *hapd,
- struct sta_info *sta, struct radius_msg *msg,
- struct radius_msg *req,
- const u8 *shared_secret,
- size_t shared_secret_len)
-{
- struct radius_ms_mppe_keys *keys;
- struct eapol_state_machine *sm = sta->eapol_sm;
- if (sm == NULL)
- return;
-
- keys = radius_msg_get_ms_keys(msg, req, shared_secret,
- shared_secret_len);
-
- if (keys && keys->send && keys->recv) {
- size_t len = keys->send_len + keys->recv_len;
- wpa_hexdump_key(MSG_DEBUG, "MS-MPPE-Send-Key",
- keys->send, keys->send_len);
- wpa_hexdump_key(MSG_DEBUG, "MS-MPPE-Recv-Key",
- keys->recv, keys->recv_len);
-
- os_free(sm->eap_if->aaaEapKeyData);
- sm->eap_if->aaaEapKeyData = os_malloc(len);
- if (sm->eap_if->aaaEapKeyData) {
- os_memcpy(sm->eap_if->aaaEapKeyData, keys->recv,
- keys->recv_len);
- os_memcpy(sm->eap_if->aaaEapKeyData + keys->recv_len,
- keys->send, keys->send_len);
- sm->eap_if->aaaEapKeyDataLen = len;
- sm->eap_if->aaaEapKeyAvailable = TRUE;
- }
- }
-
- if (keys) {
- os_free(keys->send);
- os_free(keys->recv);
- os_free(keys);
- }
-}
-
-
-static void ieee802_1x_store_radius_class(struct hostapd_data *hapd,
- struct sta_info *sta,
- struct radius_msg *msg)
-{
- u8 *class;
- size_t class_len;
- struct eapol_state_machine *sm = sta->eapol_sm;
- int count, i;
- struct radius_attr_data *nclass;
- size_t nclass_count;
-
- if (!hapd->conf->radius->acct_server || hapd->radius == NULL ||
- sm == NULL)
- return;
-
- radius_free_class(&sm->radius_class);
- count = radius_msg_count_attr(msg, RADIUS_ATTR_CLASS, 1);
- if (count <= 0)
- return;
-
- nclass = os_zalloc(count * sizeof(struct radius_attr_data));
- if (nclass == NULL)
- return;
-
- nclass_count = 0;
-
- class = NULL;
- for (i = 0; i < count; i++) {
- do {
- if (radius_msg_get_attr_ptr(msg, RADIUS_ATTR_CLASS,
- &class, &class_len,
- class) < 0) {
- i = count;
- break;
- }
- } while (class_len < 1);
-
- nclass[nclass_count].data = os_malloc(class_len);
- if (nclass[nclass_count].data == NULL)
- break;
-
- os_memcpy(nclass[nclass_count].data, class, class_len);
- nclass[nclass_count].len = class_len;
- nclass_count++;
- }
-
- sm->radius_class.attr = nclass;
- sm->radius_class.count = nclass_count;
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Stored %lu RADIUS Class "
- "attributes for " MACSTR,
- (unsigned long) sm->radius_class.count,
- MAC2STR(sta->addr));
-}
-
-
-/* Update sta->identity based on User-Name attribute in Access-Accept */
-static void ieee802_1x_update_sta_identity(struct hostapd_data *hapd,
- struct sta_info *sta,
- struct radius_msg *msg)
-{
- u8 *buf, *identity;
- size_t len;
- struct eapol_state_machine *sm = sta->eapol_sm;
-
- if (sm == NULL)
- return;
-
- if (radius_msg_get_attr_ptr(msg, RADIUS_ATTR_USER_NAME, &buf, &len,
- NULL) < 0)
- return;
-
- identity = os_malloc(len + 1);
- if (identity == NULL)
- return;
-
- os_memcpy(identity, buf, len);
- identity[len] = '\0';
-
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG, "old identity '%s' updated with "
- "User-Name from Access-Accept '%s'",
- sm->identity ? (char *) sm->identity : "N/A",
- (char *) identity);
-
- os_free(sm->identity);
- sm->identity = identity;
- sm->identity_len = len;
-}
-
-
-struct sta_id_search {
- u8 identifier;
- struct eapol_state_machine *sm;
-};
-
-
-static int ieee802_1x_select_radius_identifier(struct hostapd_data *hapd,
- struct sta_info *sta,
- void *ctx)
-{
- struct sta_id_search *id_search = ctx;
- struct eapol_state_machine *sm = sta->eapol_sm;
-
- if (sm && sm->radius_identifier >= 0 &&
- sm->radius_identifier == id_search->identifier) {
- id_search->sm = sm;
- return 1;
- }
- return 0;
-}
-
-
-static struct eapol_state_machine *
-ieee802_1x_search_radius_identifier(struct hostapd_data *hapd, u8 identifier)
-{
- struct sta_id_search id_search;
- id_search.identifier = identifier;
- id_search.sm = NULL;
- ap_for_each_sta(hapd, ieee802_1x_select_radius_identifier, &id_search);
- return id_search.sm;
-}
-
-
-/**
- * ieee802_1x_receive_auth - Process RADIUS frames from Authentication Server
- * @msg: RADIUS response message
- * @req: RADIUS request message
- * @shared_secret: RADIUS shared secret
- * @shared_secret_len: Length of shared_secret in octets
- * @data: Context data (struct hostapd_data *)
- * Returns: Processing status
- */
-static RadiusRxResult
-ieee802_1x_receive_auth(struct radius_msg *msg, struct radius_msg *req,
- const u8 *shared_secret, size_t shared_secret_len,
- void *data)
-{
- struct hostapd_data *hapd = data;
- struct sta_info *sta;
- u32 session_timeout = 0, termination_action, acct_interim_interval;
- int session_timeout_set, old_vlanid = 0;
- struct eapol_state_machine *sm;
- int override_eapReq = 0;
- struct radius_hdr *hdr = radius_msg_get_hdr(msg);
-
- sm = ieee802_1x_search_radius_identifier(hapd, hdr->identifier);
- if (sm == NULL) {
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Could not find matching "
- "station for this RADIUS message");
- return RADIUS_RX_UNKNOWN;
- }
- sta = sm->sta;
-
- /* RFC 2869, Ch. 5.13: valid Message-Authenticator attribute MUST be
- * present when packet contains an EAP-Message attribute */
- if (hdr->code == RADIUS_CODE_ACCESS_REJECT &&
- radius_msg_get_attr(msg, RADIUS_ATTR_MESSAGE_AUTHENTICATOR, NULL,
- 0) < 0 &&
- radius_msg_get_attr(msg, RADIUS_ATTR_EAP_MESSAGE, NULL, 0) < 0) {
- wpa_printf(MSG_DEBUG, "Allowing RADIUS Access-Reject without "
- "Message-Authenticator since it does not include "
- "EAP-Message");
- } else if (radius_msg_verify(msg, shared_secret, shared_secret_len,
- req, 1)) {
- printf("Incoming RADIUS packet did not have correct "
- "Message-Authenticator - dropped\n");
- return RADIUS_RX_INVALID_AUTHENTICATOR;
- }
-
- if (hdr->code != RADIUS_CODE_ACCESS_ACCEPT &&
- hdr->code != RADIUS_CODE_ACCESS_REJECT &&
- hdr->code != RADIUS_CODE_ACCESS_CHALLENGE) {
- printf("Unknown RADIUS message code\n");
- return RADIUS_RX_UNKNOWN;
- }
-
- sm->radius_identifier = -1;
- wpa_printf(MSG_DEBUG, "RADIUS packet matching with station " MACSTR,
- MAC2STR(sta->addr));
-
- radius_msg_free(sm->last_recv_radius);
- sm->last_recv_radius = msg;
-
- session_timeout_set =
- !radius_msg_get_attr_int32(msg, RADIUS_ATTR_SESSION_TIMEOUT,
- &session_timeout);
- if (radius_msg_get_attr_int32(msg, RADIUS_ATTR_TERMINATION_ACTION,
- &termination_action))
- termination_action = RADIUS_TERMINATION_ACTION_DEFAULT;
-
- if (hapd->conf->acct_interim_interval == 0 &&
- hdr->code == RADIUS_CODE_ACCESS_ACCEPT &&
- radius_msg_get_attr_int32(msg, RADIUS_ATTR_ACCT_INTERIM_INTERVAL,
- &acct_interim_interval) == 0) {
- if (acct_interim_interval < 60) {
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_INFO,
- "ignored too small "
- "Acct-Interim-Interval %d",
- acct_interim_interval);
- } else
- sta->acct_interim_interval = acct_interim_interval;
- }
-
-
- switch (hdr->code) {
- case RADIUS_CODE_ACCESS_ACCEPT:
- if (sta->ssid->dynamic_vlan == DYNAMIC_VLAN_DISABLED)
- sta->vlan_id = 0;
-#ifndef CONFIG_NO_VLAN
- else {
- old_vlanid = sta->vlan_id;
- sta->vlan_id = radius_msg_get_vlanid(msg);
- }
- if (sta->vlan_id > 0 &&
- hostapd_get_vlan_id_ifname(hapd->conf->vlan,
- sta->vlan_id)) {
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_RADIUS,
- HOSTAPD_LEVEL_INFO,
- "VLAN ID %d", sta->vlan_id);
- } else if (sta->ssid->dynamic_vlan == DYNAMIC_VLAN_REQUIRED) {
- sta->eapol_sm->authFail = TRUE;
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_INFO, "authentication "
- "server did not include required VLAN "
- "ID in Access-Accept");
- break;
- }
-#endif /* CONFIG_NO_VLAN */
-
- if (ap_sta_bind_vlan(hapd, sta, old_vlanid) < 0)
- break;
-
- /* RFC 3580, Ch. 3.17 */
- if (session_timeout_set && termination_action ==
- RADIUS_TERMINATION_ACTION_RADIUS_REQUEST) {
- sm->reAuthPeriod = session_timeout;
- } else if (session_timeout_set)
- ap_sta_session_timeout(hapd, sta, session_timeout);
-
- sm->eap_if->aaaSuccess = TRUE;
- override_eapReq = 1;
- ieee802_1x_get_keys(hapd, sta, msg, req, shared_secret,
- shared_secret_len);
- ieee802_1x_store_radius_class(hapd, sta, msg);
- ieee802_1x_update_sta_identity(hapd, sta, msg);
- if (sm->eap_if->eapKeyAvailable &&
- wpa_auth_pmksa_add(sta->wpa_sm, sm->eapol_key_crypt,
- session_timeout_set ?
- (int) session_timeout : -1, sm) == 0) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA,
- HOSTAPD_LEVEL_DEBUG,
- "Added PMKSA cache entry");
- }
- break;
- case RADIUS_CODE_ACCESS_REJECT:
- sm->eap_if->aaaFail = TRUE;
- override_eapReq = 1;
- break;
- case RADIUS_CODE_ACCESS_CHALLENGE:
- sm->eap_if->aaaEapReq = TRUE;
- if (session_timeout_set) {
- /* RFC 2869, Ch. 2.3.2; RFC 3580, Ch. 3.17 */
- sm->eap_if->aaaMethodTimeout = session_timeout;
- hostapd_logger(hapd, sm->addr,
- HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG,
- "using EAP timeout of %d seconds (from "
- "RADIUS)",
- sm->eap_if->aaaMethodTimeout);
- } else {
- /*
- * Use dynamic retransmission behavior per EAP
- * specification.
- */
- sm->eap_if->aaaMethodTimeout = 0;
- }
- break;
- }
-
- ieee802_1x_decapsulate_radius(hapd, sta);
- if (override_eapReq)
- sm->eap_if->aaaEapReq = FALSE;
-
- eapol_auth_step(sm);
-
- return RADIUS_RX_QUEUED;
-}
-#endif /* CONFIG_NO_RADIUS */
-
-
-void ieee802_1x_abort_auth(struct hostapd_data *hapd, struct sta_info *sta)
-{
- struct eapol_state_machine *sm = sta->eapol_sm;
- if (sm == NULL)
- return;
-
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG, "aborting authentication");
-
-#ifndef CONFIG_NO_RADIUS
- radius_msg_free(sm->last_recv_radius);
- sm->last_recv_radius = NULL;
-#endif /* CONFIG_NO_RADIUS */
-
- if (sm->eap_if->eapTimeout) {
- /*
- * Disconnect the STA since it did not reply to the last EAP
- * request and we cannot continue EAP processing (EAP-Failure
- * could only be sent if the EAP peer actually replied).
- */
- sm->eap_if->portEnabled = FALSE;
- ap_sta_disconnect(hapd, sta, sta->addr,
- WLAN_REASON_PREV_AUTH_NOT_VALID);
- }
-}
-
-
-static int ieee802_1x_rekey_broadcast(struct hostapd_data *hapd)
-{
- struct eapol_authenticator *eapol = hapd->eapol_auth;
-
- if (hapd->conf->default_wep_key_len < 1)
- return 0;
-
- os_free(eapol->default_wep_key);
- eapol->default_wep_key = os_malloc(hapd->conf->default_wep_key_len);
- if (eapol->default_wep_key == NULL ||
- random_get_bytes(eapol->default_wep_key,
- hapd->conf->default_wep_key_len)) {
- printf("Could not generate random WEP key.\n");
- os_free(eapol->default_wep_key);
- eapol->default_wep_key = NULL;
- return -1;
- }
-
- wpa_hexdump_key(MSG_DEBUG, "IEEE 802.1X: New default WEP key",
- eapol->default_wep_key,
- hapd->conf->default_wep_key_len);
-
- return 0;
-}
-
-
-static int ieee802_1x_sta_key_available(struct hostapd_data *hapd,
- struct sta_info *sta, void *ctx)
-{
- if (sta->eapol_sm) {
- sta->eapol_sm->eap_if->eapKeyAvailable = TRUE;
- eapol_auth_step(sta->eapol_sm);
- }
- return 0;
-}
-
-
-static void ieee802_1x_rekey(void *eloop_ctx, void *timeout_ctx)
-{
- struct hostapd_data *hapd = eloop_ctx;
- struct eapol_authenticator *eapol = hapd->eapol_auth;
-
- if (eapol->default_wep_key_idx >= 3)
- eapol->default_wep_key_idx =
- hapd->conf->individual_wep_key_len > 0 ? 1 : 0;
- else
- eapol->default_wep_key_idx++;
-
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: New default WEP key index %d",
- eapol->default_wep_key_idx);
-
- if (ieee802_1x_rekey_broadcast(hapd)) {
- hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_WARNING, "failed to generate a "
- "new broadcast key");
- os_free(eapol->default_wep_key);
- eapol->default_wep_key = NULL;
- return;
- }
-
- /* TODO: Could setup key for RX here, but change default TX keyid only
- * after new broadcast key has been sent to all stations. */
- if (hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_WEP,
- broadcast_ether_addr,
- eapol->default_wep_key_idx, 1, NULL, 0,
- eapol->default_wep_key,
- hapd->conf->default_wep_key_len)) {
- hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_WARNING, "failed to configure a "
- "new broadcast key");
- os_free(eapol->default_wep_key);
- eapol->default_wep_key = NULL;
- return;
- }
-
- ap_for_each_sta(hapd, ieee802_1x_sta_key_available, NULL);
-
- if (hapd->conf->wep_rekeying_period > 0) {
- eloop_register_timeout(hapd->conf->wep_rekeying_period, 0,
- ieee802_1x_rekey, hapd, NULL);
- }
-}
-
-
-static void ieee802_1x_eapol_send(void *ctx, void *sta_ctx, u8 type,
- const u8 *data, size_t datalen)
-{
-#ifdef CONFIG_WPS
- struct sta_info *sta = sta_ctx;
-
- if ((sta->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS)) ==
- WLAN_STA_MAYBE_WPS) {
- const u8 *identity;
- size_t identity_len;
- struct eapol_state_machine *sm = sta->eapol_sm;
-
- identity = eap_get_identity(sm->eap, &identity_len);
- if (identity &&
- ((identity_len == WSC_ID_ENROLLEE_LEN &&
- os_memcmp(identity, WSC_ID_ENROLLEE,
- WSC_ID_ENROLLEE_LEN) == 0) ||
- (identity_len == WSC_ID_REGISTRAR_LEN &&
- os_memcmp(identity, WSC_ID_REGISTRAR,
- WSC_ID_REGISTRAR_LEN) == 0))) {
- wpa_printf(MSG_DEBUG, "WPS: WLAN_STA_MAYBE_WPS -> "
- "WLAN_STA_WPS");
- sta->flags |= WLAN_STA_WPS;
- }
- }
-#endif /* CONFIG_WPS */
-
- ieee802_1x_send(ctx, sta_ctx, type, data, datalen);
-}
-
-
-static void ieee802_1x_aaa_send(void *ctx, void *sta_ctx,
- const u8 *data, size_t datalen)
-{
-#ifndef CONFIG_NO_RADIUS
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta = sta_ctx;
-
- ieee802_1x_encapsulate_radius(hapd, sta, data, datalen);
-#endif /* CONFIG_NO_RADIUS */
-}
-
-
-static void _ieee802_1x_finished(void *ctx, void *sta_ctx, int success,
- int preauth)
-{
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta = sta_ctx;
- if (preauth)
- rsn_preauth_finished(hapd, sta, success);
- else
- ieee802_1x_finished(hapd, sta, success);
-}
-
-
-static int ieee802_1x_get_eap_user(void *ctx, const u8 *identity,
- size_t identity_len, int phase2,
- struct eap_user *user)
-{
- struct hostapd_data *hapd = ctx;
- const struct hostapd_eap_user *eap_user;
- int i, count;
-
- eap_user = hostapd_get_eap_user(hapd->conf, identity,
- identity_len, phase2);
- if (eap_user == NULL)
- return -1;
-
- os_memset(user, 0, sizeof(*user));
- user->phase2 = phase2;
- count = EAP_USER_MAX_METHODS;
- if (count > EAP_MAX_METHODS)
- count = EAP_MAX_METHODS;
- for (i = 0; i < count; i++) {
- user->methods[i].vendor = eap_user->methods[i].vendor;
- user->methods[i].method = eap_user->methods[i].method;
- }
-
- if (eap_user->password) {
- user->password = os_malloc(eap_user->password_len);
- if (user->password == NULL)
- return -1;
- os_memcpy(user->password, eap_user->password,
- eap_user->password_len);
- user->password_len = eap_user->password_len;
- }
- user->force_version = eap_user->force_version;
- user->ttls_auth = eap_user->ttls_auth;
-
- return 0;
-}
-
-
-static int ieee802_1x_sta_entry_alive(void *ctx, const u8 *addr)
-{
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta;
- sta = ap_get_sta(hapd, addr);
- if (sta == NULL || sta->eapol_sm == NULL)
- return 0;
- return 1;
-}
-
-
-static void ieee802_1x_logger(void *ctx, const u8 *addr,
- eapol_logger_level level, const char *txt)
-{
-#ifndef CONFIG_NO_HOSTAPD_LOGGER
- struct hostapd_data *hapd = ctx;
- int hlevel;
-
- switch (level) {
- case EAPOL_LOGGER_WARNING:
- hlevel = HOSTAPD_LEVEL_WARNING;
- break;
- case EAPOL_LOGGER_INFO:
- hlevel = HOSTAPD_LEVEL_INFO;
- break;
- case EAPOL_LOGGER_DEBUG:
- default:
- hlevel = HOSTAPD_LEVEL_DEBUG;
- break;
- }
-
- hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE8021X, hlevel, "%s",
- txt);
-#endif /* CONFIG_NO_HOSTAPD_LOGGER */
-}
-
-
-static void ieee802_1x_set_port_authorized(void *ctx, void *sta_ctx,
- int authorized)
-{
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta = sta_ctx;
- ieee802_1x_set_sta_authorized(hapd, sta, authorized);
-}
-
-
-static void _ieee802_1x_abort_auth(void *ctx, void *sta_ctx)
-{
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta = sta_ctx;
- ieee802_1x_abort_auth(hapd, sta);
-}
-
-
-static void _ieee802_1x_tx_key(void *ctx, void *sta_ctx)
-{
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta = sta_ctx;
- ieee802_1x_tx_key(hapd, sta);
-}
-
-
-static void ieee802_1x_eapol_event(void *ctx, void *sta_ctx,
- enum eapol_event type)
-{
- /* struct hostapd_data *hapd = ctx; */
- struct sta_info *sta = sta_ctx;
- switch (type) {
- case EAPOL_AUTH_SM_CHANGE:
- wpa_auth_sm_notify(sta->wpa_sm);
- break;
- case EAPOL_AUTH_REAUTHENTICATE:
- wpa_auth_sm_event(sta->wpa_sm, WPA_REAUTH_EAPOL);
- break;
- }
-}
-
-
-int ieee802_1x_init(struct hostapd_data *hapd)
-{
- int i;
- struct eapol_auth_config conf;
- struct eapol_auth_cb cb;
-
- os_memset(&conf, 0, sizeof(conf));
- conf.ctx = hapd;
- conf.eap_reauth_period = hapd->conf->eap_reauth_period;
- conf.wpa = hapd->conf->wpa;
- conf.individual_wep_key_len = hapd->conf->individual_wep_key_len;
- conf.eap_server = hapd->conf->eap_server;
- conf.ssl_ctx = hapd->ssl_ctx;
- conf.msg_ctx = hapd->msg_ctx;
- conf.eap_sim_db_priv = hapd->eap_sim_db_priv;
- conf.eap_req_id_text = hapd->conf->eap_req_id_text;
- conf.eap_req_id_text_len = hapd->conf->eap_req_id_text_len;
- conf.pac_opaque_encr_key = hapd->conf->pac_opaque_encr_key;
- conf.eap_fast_a_id = hapd->conf->eap_fast_a_id;
- conf.eap_fast_a_id_len = hapd->conf->eap_fast_a_id_len;
- conf.eap_fast_a_id_info = hapd->conf->eap_fast_a_id_info;
- conf.eap_fast_prov = hapd->conf->eap_fast_prov;
- conf.pac_key_lifetime = hapd->conf->pac_key_lifetime;
- conf.pac_key_refresh_time = hapd->conf->pac_key_refresh_time;
- conf.eap_sim_aka_result_ind = hapd->conf->eap_sim_aka_result_ind;
- conf.tnc = hapd->conf->tnc;
- conf.wps = hapd->wps;
- conf.fragment_size = hapd->conf->fragment_size;
- conf.pwd_group = hapd->conf->pwd_group;
-
- os_memset(&cb, 0, sizeof(cb));
- cb.eapol_send = ieee802_1x_eapol_send;
- cb.aaa_send = ieee802_1x_aaa_send;
- cb.finished = _ieee802_1x_finished;
- cb.get_eap_user = ieee802_1x_get_eap_user;
- cb.sta_entry_alive = ieee802_1x_sta_entry_alive;
- cb.logger = ieee802_1x_logger;
- cb.set_port_authorized = ieee802_1x_set_port_authorized;
- cb.abort_auth = _ieee802_1x_abort_auth;
- cb.tx_key = _ieee802_1x_tx_key;
- cb.eapol_event = ieee802_1x_eapol_event;
-
- hapd->eapol_auth = eapol_auth_init(&conf, &cb);
- if (hapd->eapol_auth == NULL)
- return -1;
-
- if ((hapd->conf->ieee802_1x || hapd->conf->wpa) &&
- hostapd_set_drv_ieee8021x(hapd, hapd->conf->iface, 1))
- return -1;
-
-#ifndef CONFIG_NO_RADIUS
- if (radius_client_register(hapd->radius, RADIUS_AUTH,
- ieee802_1x_receive_auth, hapd))
- return -1;
-#endif /* CONFIG_NO_RADIUS */
-
- if (hapd->conf->default_wep_key_len) {
- for (i = 0; i < 4; i++)
- hostapd_drv_set_key(hapd->conf->iface, hapd,
- WPA_ALG_NONE, NULL, i, 0, NULL, 0,
- NULL, 0);
-
- ieee802_1x_rekey(hapd, NULL);
-
- if (hapd->eapol_auth->default_wep_key == NULL)
- return -1;
- }
-
- return 0;
-}
-
-
-void ieee802_1x_deinit(struct hostapd_data *hapd)
-{
- eloop_cancel_timeout(ieee802_1x_rekey, hapd, NULL);
-
- if (hapd->driver != NULL &&
- (hapd->conf->ieee802_1x || hapd->conf->wpa))
- hostapd_set_drv_ieee8021x(hapd, hapd->conf->iface, 0);
-
- eapol_auth_deinit(hapd->eapol_auth);
- hapd->eapol_auth = NULL;
-}
-
-
-int ieee802_1x_tx_status(struct hostapd_data *hapd, struct sta_info *sta,
- const u8 *buf, size_t len, int ack)
-{
- struct ieee80211_hdr *hdr;
- struct ieee802_1x_hdr *xhdr;
- struct ieee802_1x_eapol_key *key;
- u8 *pos;
- const unsigned char rfc1042_hdr[ETH_ALEN] =
- { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
-
- if (sta == NULL)
- return -1;
- if (len < sizeof(*hdr) + sizeof(rfc1042_hdr) + 2 + sizeof(*xhdr))
- return 0;
-
- hdr = (struct ieee80211_hdr *) buf;
- pos = (u8 *) (hdr + 1);
- if (os_memcmp(pos, rfc1042_hdr, sizeof(rfc1042_hdr)) != 0)
- return 0;
- pos += sizeof(rfc1042_hdr);
- if (WPA_GET_BE16(pos) != ETH_P_PAE)
- return 0;
- pos += 2;
-
- xhdr = (struct ieee802_1x_hdr *) pos;
- pos += sizeof(*xhdr);
-
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: " MACSTR " TX status - version=%d "
- "type=%d length=%d - ack=%d",
- MAC2STR(sta->addr), xhdr->version, xhdr->type,
- be_to_host16(xhdr->length), ack);
-
- if (xhdr->type == IEEE802_1X_TYPE_EAPOL_KEY &&
- pos + sizeof(struct wpa_eapol_key) <= buf + len) {
- const struct wpa_eapol_key *wpa;
- wpa = (const struct wpa_eapol_key *) pos;
- if (wpa->type == EAPOL_KEY_TYPE_RSN ||
- wpa->type == EAPOL_KEY_TYPE_WPA)
- wpa_auth_eapol_key_tx_status(hapd->wpa_auth,
- sta->wpa_sm, ack);
- }
-
- /* EAPOL EAP-Packet packets are eventually re-sent by either Supplicant
- * or Authenticator state machines, but EAPOL-Key packets are not
- * retransmitted in case of failure. Try to re-sent failed EAPOL-Key
- * packets couple of times because otherwise STA keys become
- * unsynchronized with AP. */
- if (xhdr->type == IEEE802_1X_TYPE_EAPOL_KEY && !ack &&
- pos + sizeof(*key) <= buf + len) {
- key = (struct ieee802_1x_eapol_key *) pos;
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
- HOSTAPD_LEVEL_DEBUG, "did not Ack EAPOL-Key "
- "frame (%scast index=%d)",
- key->key_index & BIT(7) ? "uni" : "broad",
- key->key_index & ~BIT(7));
- /* TODO: re-send EAPOL-Key couple of times (with short delay
- * between them?). If all attempt fail, report error and
- * deauthenticate STA so that it will get new keys when
- * authenticating again (e.g., after returning in range).
- * Separate limit/transmit state needed both for unicast and
- * broadcast keys(?) */
- }
- /* TODO: could move unicast key configuration from ieee802_1x_tx_key()
- * to here and change the key only if the EAPOL-Key packet was Acked.
- */
-
- return 1;
-}
-
-
-u8 * ieee802_1x_get_identity(struct eapol_state_machine *sm, size_t *len)
-{
- if (sm == NULL || sm->identity == NULL)
- return NULL;
-
- *len = sm->identity_len;
- return sm->identity;
-}
-
-
-u8 * ieee802_1x_get_radius_class(struct eapol_state_machine *sm, size_t *len,
- int idx)
-{
- if (sm == NULL || sm->radius_class.attr == NULL ||
- idx >= (int) sm->radius_class.count)
- return NULL;
-
- *len = sm->radius_class.attr[idx].len;
- return sm->radius_class.attr[idx].data;
-}
-
-
-const u8 * ieee802_1x_get_key(struct eapol_state_machine *sm, size_t *len)
-{
- if (sm == NULL)
- return NULL;
-
- *len = sm->eap_if->eapKeyDataLen;
- return sm->eap_if->eapKeyData;
-}
-
-
-void ieee802_1x_notify_port_enabled(struct eapol_state_machine *sm,
- int enabled)
-{
- if (sm == NULL)
- return;
- sm->eap_if->portEnabled = enabled ? TRUE : FALSE;
- eapol_auth_step(sm);
-}
-
-
-void ieee802_1x_notify_port_valid(struct eapol_state_machine *sm,
- int valid)
-{
- if (sm == NULL)
- return;
- sm->portValid = valid ? TRUE : FALSE;
- eapol_auth_step(sm);
-}
-
-
-void ieee802_1x_notify_pre_auth(struct eapol_state_machine *sm, int pre_auth)
-{
- if (sm == NULL)
- return;
- if (pre_auth)
- sm->flags |= EAPOL_SM_PREAUTH;
- else
- sm->flags &= ~EAPOL_SM_PREAUTH;
-}
-
-
-static const char * bool_txt(Boolean bool)
-{
- return bool ? "TRUE" : "FALSE";
-}
-
-
-int ieee802_1x_get_mib(struct hostapd_data *hapd, char *buf, size_t buflen)
-{
- /* TODO */
- return 0;
-}
-
-
-int ieee802_1x_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta,
- char *buf, size_t buflen)
-{
- int len = 0, ret;
- struct eapol_state_machine *sm = sta->eapol_sm;
-
- if (sm == NULL)
- return 0;
-
- ret = os_snprintf(buf + len, buflen - len,
- "dot1xPaePortNumber=%d\n"
- "dot1xPaePortProtocolVersion=%d\n"
- "dot1xPaePortCapabilities=1\n"
- "dot1xPaePortInitialize=%d\n"
- "dot1xPaePortReauthenticate=FALSE\n",
- sta->aid,
- EAPOL_VERSION,
- sm->initialize);
- if (ret < 0 || (size_t) ret >= buflen - len)
- return len;
- len += ret;
-
- /* dot1xAuthConfigTable */
- ret = os_snprintf(buf + len, buflen - len,
- "dot1xAuthPaeState=%d\n"
- "dot1xAuthBackendAuthState=%d\n"
- "dot1xAuthAdminControlledDirections=%d\n"
- "dot1xAuthOperControlledDirections=%d\n"
- "dot1xAuthAuthControlledPortStatus=%d\n"
- "dot1xAuthAuthControlledPortControl=%d\n"
- "dot1xAuthQuietPeriod=%u\n"
- "dot1xAuthServerTimeout=%u\n"
- "dot1xAuthReAuthPeriod=%u\n"
- "dot1xAuthReAuthEnabled=%s\n"
- "dot1xAuthKeyTxEnabled=%s\n",
- sm->auth_pae_state + 1,
- sm->be_auth_state + 1,
- sm->adminControlledDirections,
- sm->operControlledDirections,
- sm->authPortStatus,
- sm->portControl,
- sm->quietPeriod,
- sm->serverTimeout,
- sm->reAuthPeriod,
- bool_txt(sm->reAuthEnabled),
- bool_txt(sm->keyTxEnabled));
- if (ret < 0 || (size_t) ret >= buflen - len)
- return len;
- len += ret;
-
- /* dot1xAuthStatsTable */
- ret = os_snprintf(buf + len, buflen - len,
- "dot1xAuthEapolFramesRx=%u\n"
- "dot1xAuthEapolFramesTx=%u\n"
- "dot1xAuthEapolStartFramesRx=%u\n"
- "dot1xAuthEapolLogoffFramesRx=%u\n"
- "dot1xAuthEapolRespIdFramesRx=%u\n"
- "dot1xAuthEapolRespFramesRx=%u\n"
- "dot1xAuthEapolReqIdFramesTx=%u\n"
- "dot1xAuthEapolReqFramesTx=%u\n"
- "dot1xAuthInvalidEapolFramesRx=%u\n"
- "dot1xAuthEapLengthErrorFramesRx=%u\n"
- "dot1xAuthLastEapolFrameVersion=%u\n"
- "dot1xAuthLastEapolFrameSource=" MACSTR "\n",
- sm->dot1xAuthEapolFramesRx,
- sm->dot1xAuthEapolFramesTx,
- sm->dot1xAuthEapolStartFramesRx,
- sm->dot1xAuthEapolLogoffFramesRx,
- sm->dot1xAuthEapolRespIdFramesRx,
- sm->dot1xAuthEapolRespFramesRx,
- sm->dot1xAuthEapolReqIdFramesTx,
- sm->dot1xAuthEapolReqFramesTx,
- sm->dot1xAuthInvalidEapolFramesRx,
- sm->dot1xAuthEapLengthErrorFramesRx,
- sm->dot1xAuthLastEapolFrameVersion,
- MAC2STR(sm->addr));
- if (ret < 0 || (size_t) ret >= buflen - len)
- return len;
- len += ret;
-
- /* dot1xAuthDiagTable */
- ret = os_snprintf(buf + len, buflen - len,
- "dot1xAuthEntersConnecting=%u\n"
- "dot1xAuthEapLogoffsWhileConnecting=%u\n"
- "dot1xAuthEntersAuthenticating=%u\n"
- "dot1xAuthAuthSuccessesWhileAuthenticating=%u\n"
- "dot1xAuthAuthTimeoutsWhileAuthenticating=%u\n"
- "dot1xAuthAuthFailWhileAuthenticating=%u\n"
- "dot1xAuthAuthEapStartsWhileAuthenticating=%u\n"
- "dot1xAuthAuthEapLogoffWhileAuthenticating=%u\n"
- "dot1xAuthAuthReauthsWhileAuthenticated=%u\n"
- "dot1xAuthAuthEapStartsWhileAuthenticated=%u\n"
- "dot1xAuthAuthEapLogoffWhileAuthenticated=%u\n"
- "dot1xAuthBackendResponses=%u\n"
- "dot1xAuthBackendAccessChallenges=%u\n"
- "dot1xAuthBackendOtherRequestsToSupplicant=%u\n"
- "dot1xAuthBackendAuthSuccesses=%u\n"
- "dot1xAuthBackendAuthFails=%u\n",
- sm->authEntersConnecting,
- sm->authEapLogoffsWhileConnecting,
- sm->authEntersAuthenticating,
- sm->authAuthSuccessesWhileAuthenticating,
- sm->authAuthTimeoutsWhileAuthenticating,
- sm->authAuthFailWhileAuthenticating,
- sm->authAuthEapStartsWhileAuthenticating,
- sm->authAuthEapLogoffWhileAuthenticating,
- sm->authAuthReauthsWhileAuthenticated,
- sm->authAuthEapStartsWhileAuthenticated,
- sm->authAuthEapLogoffWhileAuthenticated,
- sm->backendResponses,
- sm->backendAccessChallenges,
- sm->backendOtherRequestsToSupplicant,
- sm->backendAuthSuccesses,
- sm->backendAuthFails);
- if (ret < 0 || (size_t) ret >= buflen - len)
- return len;
- len += ret;
-
- /* dot1xAuthSessionStatsTable */
- ret = os_snprintf(buf + len, buflen - len,
- /* TODO: dot1xAuthSessionOctetsRx */
- /* TODO: dot1xAuthSessionOctetsTx */
- /* TODO: dot1xAuthSessionFramesRx */
- /* TODO: dot1xAuthSessionFramesTx */
- "dot1xAuthSessionId=%08X-%08X\n"
- "dot1xAuthSessionAuthenticMethod=%d\n"
- "dot1xAuthSessionTime=%u\n"
- "dot1xAuthSessionTerminateCause=999\n"
- "dot1xAuthSessionUserName=%s\n",
- sta->acct_session_id_hi, sta->acct_session_id_lo,
- (wpa_key_mgmt_wpa_ieee8021x(
- wpa_auth_sta_key_mgmt(sta->wpa_sm))) ?
- 1 : 2,
- (unsigned int) (time(NULL) -
- sta->acct_session_start),
- sm->identity);
- if (ret < 0 || (size_t) ret >= buflen - len)
- return len;
- len += ret;
-
- return len;
-}
-
-
-static void ieee802_1x_finished(struct hostapd_data *hapd,
- struct sta_info *sta, int success)
-{
- const u8 *key;
- size_t len;
- /* TODO: get PMKLifetime from WPA parameters */
- static const int dot11RSNAConfigPMKLifetime = 43200;
-
- key = ieee802_1x_get_key(sta->eapol_sm, &len);
- if (success && key && len >= PMK_LEN &&
- wpa_auth_pmksa_add(sta->wpa_sm, key, dot11RSNAConfigPMKLifetime,
- sta->eapol_sm) == 0) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA,
- HOSTAPD_LEVEL_DEBUG,
- "Added PMKSA cache entry (IEEE 802.1X)");
- }
-
-#ifdef CONFIG_WPS
- if (!success && (sta->flags & WLAN_STA_WPS)) {
- /*
- * Many devices require deauthentication after WPS provisioning
- * and some may not be be able to do that themselves, so
- * disconnect the client here.
- */
- wpa_printf(MSG_DEBUG, "WPS: Force disconnection after "
- "EAP-Failure");
- /* Add a small sleep to increase likelihood of previously
- * requested EAP-Failure TX getting out before this should the
- * driver reorder operations.
- */
- os_sleep(0, 10000);
- ap_sta_disconnect(hapd, sta, sta->addr,
- WLAN_REASON_PREV_AUTH_NOT_VALID);
- }
-#endif /* CONFIG_WPS */
-}
diff --git a/hostapd-0.8/src/ap/ieee802_1x.h b/hostapd-0.8/src/ap/ieee802_1x.h
deleted file mode 100644
index 1a4d2eb..0000000
--- a/hostapd-0.8/src/ap/ieee802_1x.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * hostapd / IEEE 802.1X-2004 Authenticator
- * Copyright (c) 2002-2007, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef IEEE802_1X_H
-#define IEEE802_1X_H
-
-struct hostapd_data;
-struct sta_info;
-struct eapol_state_machine;
-struct hostapd_config;
-struct hostapd_bss_config;
-
-#ifdef _MSC_VER
-#pragma pack(push, 1)
-#endif /* _MSC_VER */
-
-/* RFC 3580, 4. RC4 EAPOL-Key Frame */
-
-struct ieee802_1x_eapol_key {
- u8 type;
- u16 key_length;
- u8 replay_counter[8]; /* does not repeat within the life of the keying
- * material used to encrypt the Key field;
- * 64-bit NTP timestamp MAY be used here */
- u8 key_iv[16]; /* cryptographically random number */
- u8 key_index; /* key flag in the most significant bit:
- * 0 = broadcast (default key),
- * 1 = unicast (key mapping key); key index is in the
- * 7 least significant bits */
- u8 key_signature[16]; /* HMAC-MD5 message integrity check computed with
- * MS-MPPE-Send-Key as the key */
-
- /* followed by key: if packet body length = 44 + key length, then the
- * key field (of key_length bytes) contains the key in encrypted form;
- * if packet body length = 44, key field is absent and key_length
- * represents the number of least significant octets from
- * MS-MPPE-Send-Key attribute to be used as the keying material;
- * RC4 key used in encryption = Key-IV + MS-MPPE-Recv-Key */
-} STRUCT_PACKED;
-
-#ifdef _MSC_VER
-#pragma pack(pop)
-#endif /* _MSC_VER */
-
-
-void ieee802_1x_receive(struct hostapd_data *hapd, const u8 *sa, const u8 *buf,
- size_t len);
-void ieee802_1x_new_station(struct hostapd_data *hapd, struct sta_info *sta);
-void ieee802_1x_free_station(struct sta_info *sta);
-
-void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta);
-void ieee802_1x_abort_auth(struct hostapd_data *hapd, struct sta_info *sta);
-void ieee802_1x_set_sta_authorized(struct hostapd_data *hapd,
- struct sta_info *sta, int authorized);
-void ieee802_1x_dump_state(FILE *f, const char *prefix, struct sta_info *sta);
-int ieee802_1x_init(struct hostapd_data *hapd);
-void ieee802_1x_deinit(struct hostapd_data *hapd);
-int ieee802_1x_tx_status(struct hostapd_data *hapd, struct sta_info *sta,
- const u8 *buf, size_t len, int ack);
-u8 * ieee802_1x_get_identity(struct eapol_state_machine *sm, size_t *len);
-u8 * ieee802_1x_get_radius_class(struct eapol_state_machine *sm, size_t *len,
- int idx);
-const u8 * ieee802_1x_get_key(struct eapol_state_machine *sm, size_t *len);
-void ieee802_1x_notify_port_enabled(struct eapol_state_machine *sm,
- int enabled);
-void ieee802_1x_notify_port_valid(struct eapol_state_machine *sm,
- int valid);
-void ieee802_1x_notify_pre_auth(struct eapol_state_machine *sm, int pre_auth);
-int ieee802_1x_get_mib(struct hostapd_data *hapd, char *buf, size_t buflen);
-int ieee802_1x_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta,
- char *buf, size_t buflen);
-void hostapd_get_ntp_timestamp(u8 *buf);
-char *eap_type_text(u8 type);
-
-const char *radius_mode_txt(struct hostapd_data *hapd);
-int radius_sta_rate(struct hostapd_data *hapd, struct sta_info *sta);
-
-#endif /* IEEE802_1X_H */
diff --git a/hostapd-0.8/src/ap/p2p_hostapd.c b/hostapd-0.8/src/ap/p2p_hostapd.c
deleted file mode 100644
index 6f8b778..0000000
--- a/hostapd-0.8/src/ap/p2p_hostapd.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * hostapd / P2P integration
- * Copyright (c) 2009-2010, Atheros Communications
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "common/ieee802_11_defs.h"
-#include "p2p/p2p.h"
-#include "hostapd.h"
-#include "ap_config.h"
-#include "ap_drv_ops.h"
-#include "sta_info.h"
-#include "p2p_hostapd.h"
-
-
-#ifdef CONFIG_P2P
-
-int hostapd_p2p_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta,
- char *buf, size_t buflen)
-{
- if (sta->p2p_ie == NULL)
- return 0;
-
- return p2p_ie_text(sta->p2p_ie, buf, buf + buflen);
-}
-
-
-int hostapd_p2p_set_noa(struct hostapd_data *hapd, u8 count, int start,
- int duration)
-{
- wpa_printf(MSG_DEBUG, "P2P: Set NoA parameters: count=%u start=%d "
- "duration=%d", count, start, duration);
-
- if (count == 0) {
- hapd->noa_enabled = 0;
- hapd->noa_start = 0;
- hapd->noa_duration = 0;
- }
-
- if (count != 255) {
- wpa_printf(MSG_DEBUG, "P2P: Non-periodic NoA - set "
- "NoA parameters");
- return hostapd_driver_set_noa(hapd, count, start, duration);
- }
-
- hapd->noa_enabled = 1;
- hapd->noa_start = start;
- hapd->noa_duration = duration;
-
- if (hapd->num_sta_no_p2p == 0) {
- wpa_printf(MSG_DEBUG, "P2P: No legacy STAs connected - update "
- "periodic NoA parameters");
- return hostapd_driver_set_noa(hapd, count, start, duration);
- }
-
- wpa_printf(MSG_DEBUG, "P2P: Legacy STA(s) connected - do not enable "
- "periodic NoA");
-
- return 0;
-}
-
-
-void hostapd_p2p_non_p2p_sta_connected(struct hostapd_data *hapd)
-{
- wpa_printf(MSG_DEBUG, "P2P: First non-P2P device connected");
-
- if (hapd->noa_enabled) {
- wpa_printf(MSG_DEBUG, "P2P: Disable periodic NoA");
- hostapd_driver_set_noa(hapd, 0, 0, 0);
- }
-}
-
-
-void hostapd_p2p_non_p2p_sta_disconnected(struct hostapd_data *hapd)
-{
- wpa_printf(MSG_DEBUG, "P2P: Last non-P2P device disconnected");
-
- if (hapd->noa_enabled) {
- wpa_printf(MSG_DEBUG, "P2P: Enable periodic NoA");
- hostapd_driver_set_noa(hapd, 255, hapd->noa_start,
- hapd->noa_duration);
- }
-}
-
-#endif /* CONFIG_P2P */
-
-
-#ifdef CONFIG_P2P_MANAGER
-u8 * hostapd_eid_p2p_manage(struct hostapd_data *hapd, u8 *eid)
-{
- u8 bitmap;
- *eid++ = WLAN_EID_VENDOR_SPECIFIC;
- *eid++ = 4 + 3 + 1;
- WPA_PUT_BE24(eid, OUI_WFA);
- eid += 3;
- *eid++ = P2P_OUI_TYPE;
-
- *eid++ = P2P_ATTR_MANAGEABILITY;
- WPA_PUT_LE16(eid, 1);
- eid += 2;
- bitmap = P2P_MAN_DEVICE_MANAGEMENT;
- if (hapd->conf->p2p & P2P_ALLOW_CROSS_CONNECTION)
- bitmap |= P2P_MAN_CROSS_CONNECTION_PERMITTED;
- bitmap |= P2P_MAN_COEXISTENCE_OPTIONAL;
- *eid++ = bitmap;
-
- return eid;
-}
-#endif /* CONFIG_P2P_MANAGER */
diff --git a/hostapd-0.8/src/ap/p2p_hostapd.h b/hostapd-0.8/src/ap/p2p_hostapd.h
deleted file mode 100644
index 95b31d9..0000000
--- a/hostapd-0.8/src/ap/p2p_hostapd.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * hostapd / P2P integration
- * Copyright (c) 2009-2010, Atheros Communications
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef P2P_HOSTAPD_H
-#define P2P_HOSTAPD_H
-
-#ifdef CONFIG_P2P
-
-int hostapd_p2p_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta,
- char *buf, size_t buflen);
-int hostapd_p2p_set_noa(struct hostapd_data *hapd, u8 count, int start,
- int duration);
-void hostapd_p2p_non_p2p_sta_connected(struct hostapd_data *hapd);
-void hostapd_p2p_non_p2p_sta_disconnected(struct hostapd_data *hapd);
-
-
-#else /* CONFIG_P2P */
-
-static inline int hostapd_p2p_get_mib_sta(struct hostapd_data *hapd,
- struct sta_info *sta,
- char *buf, size_t buflen)
-{
- return 0;
-}
-
-#endif /* CONFIG_P2P */
-
-u8 * hostapd_eid_p2p_manage(struct hostapd_data *hapd, u8 *eid);
-
-#endif /* P2P_HOSTAPD_H */
diff --git a/hostapd-0.8/src/ap/peerkey_auth.c b/hostapd-0.8/src/ap/peerkey_auth.c
deleted file mode 100644
index b8fa5a9..0000000
--- a/hostapd-0.8/src/ap/peerkey_auth.c
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * hostapd - PeerKey for Direct Link Setup (DLS)
- * Copyright (c) 2006-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "crypto/sha1.h"
-#include "crypto/sha256.h"
-#include "crypto/random.h"
-#include "wpa_auth.h"
-#include "wpa_auth_i.h"
-#include "wpa_auth_ie.h"
-
-#ifdef CONFIG_PEERKEY
-
-static void wpa_stsl_step(void *eloop_ctx, void *timeout_ctx)
-{
-#if 0
- struct wpa_authenticator *wpa_auth = eloop_ctx;
- struct wpa_stsl_negotiation *neg = timeout_ctx;
-#endif
-
- /* TODO: ? */
-}
-
-
-struct wpa_stsl_search {
- const u8 *addr;
- struct wpa_state_machine *sm;
-};
-
-
-static int wpa_stsl_select_sta(struct wpa_state_machine *sm, void *ctx)
-{
- struct wpa_stsl_search *search = ctx;
- if (os_memcmp(search->addr, sm->addr, ETH_ALEN) == 0) {
- search->sm = sm;
- return 1;
- }
- return 0;
-}
-
-
-static void wpa_smk_send_error(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, const u8 *peer,
- u16 mui, u16 error_type)
-{
- u8 kde[2 + RSN_SELECTOR_LEN + ETH_ALEN +
- 2 + RSN_SELECTOR_LEN + sizeof(struct rsn_error_kde)];
- u8 *pos;
- struct rsn_error_kde error;
-
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
- "Sending SMK Error");
-
- pos = kde;
-
- if (peer) {
- pos = wpa_add_kde(pos, RSN_KEY_DATA_MAC_ADDR, peer, ETH_ALEN,
- NULL, 0);
- }
-
- error.mui = host_to_be16(mui);
- error.error_type = host_to_be16(error_type);
- pos = wpa_add_kde(pos, RSN_KEY_DATA_ERROR,
- (u8 *) &error, sizeof(error), NULL, 0);
-
- __wpa_send_eapol(wpa_auth, sm,
- WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC |
- WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_ERROR,
- NULL, NULL, kde, pos - kde, 0, 0, 0);
-}
-
-
-void wpa_smk_m1(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, struct wpa_eapol_key *key)
-{
- struct wpa_eapol_ie_parse kde;
- struct wpa_stsl_search search;
- u8 *buf, *pos;
- size_t buf_len;
-
- if (wpa_parse_kde_ies((const u8 *) (key + 1),
- WPA_GET_BE16(key->key_data_length), &kde) < 0) {
- wpa_printf(MSG_INFO, "RSN: Failed to parse KDEs in SMK M1");
- return;
- }
-
- if (kde.rsn_ie == NULL || kde.mac_addr == NULL ||
- kde.mac_addr_len < ETH_ALEN) {
- wpa_printf(MSG_INFO, "RSN: No RSN IE or MAC address KDE in "
- "SMK M1");
- return;
- }
-
- /* Initiator = sm->addr; Peer = kde.mac_addr */
-
- search.addr = kde.mac_addr;
- search.sm = NULL;
- if (wpa_auth_for_each_sta(wpa_auth, wpa_stsl_select_sta, &search) ==
- 0 || search.sm == NULL) {
- wpa_printf(MSG_DEBUG, "RSN: SMK handshake with " MACSTR
- " aborted - STA not associated anymore",
- MAC2STR(kde.mac_addr));
- wpa_smk_send_error(wpa_auth, sm, kde.mac_addr, STK_MUI_SMK,
- STK_ERR_STA_NR);
- /* FIX: wpa_stsl_remove(wpa_auth, neg); */
- return;
- }
-
- buf_len = kde.rsn_ie_len + 2 + RSN_SELECTOR_LEN + ETH_ALEN;
- buf = os_malloc(buf_len);
- if (buf == NULL)
- return;
- /* Initiator RSN IE */
- os_memcpy(buf, kde.rsn_ie, kde.rsn_ie_len);
- pos = buf + kde.rsn_ie_len;
- /* Initiator MAC Address */
- pos = wpa_add_kde(pos, RSN_KEY_DATA_MAC_ADDR, sm->addr, ETH_ALEN,
- NULL, 0);
-
- /* SMK M2:
- * EAPOL-Key(S=1, M=1, A=1, I=0, K=0, SM=1, KeyRSC=0, Nonce=INonce,
- * MIC=MIC, DataKDs=(RSNIE_I, MAC_I KDE)
- */
-
- wpa_auth_logger(wpa_auth, search.sm->addr, LOGGER_DEBUG,
- "Sending SMK M2");
-
- __wpa_send_eapol(wpa_auth, search.sm,
- WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC |
- WPA_KEY_INFO_ACK | WPA_KEY_INFO_SMK_MESSAGE,
- NULL, key->key_nonce, buf, pos - buf, 0, 0, 0);
-
- os_free(buf);
-}
-
-
-static void wpa_send_smk_m4(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm,
- struct wpa_eapol_key *key,
- struct wpa_eapol_ie_parse *kde,
- const u8 *smk)
-{
- u8 *buf, *pos;
- size_t buf_len;
- u32 lifetime;
-
- /* SMK M4:
- * EAPOL-Key(S=1, M=1, A=0, I=1, K=0, SM=1, KeyRSC=0, Nonce=PNonce,
- * MIC=MIC, DataKDs=(MAC_I KDE, INonce KDE, SMK KDE,
- * Lifetime KDE)
- */
-
- buf_len = 2 + RSN_SELECTOR_LEN + ETH_ALEN +
- 2 + RSN_SELECTOR_LEN + WPA_NONCE_LEN +
- 2 + RSN_SELECTOR_LEN + PMK_LEN + WPA_NONCE_LEN +
- 2 + RSN_SELECTOR_LEN + sizeof(lifetime);
- pos = buf = os_malloc(buf_len);
- if (buf == NULL)
- return;
-
- /* Initiator MAC Address */
- pos = wpa_add_kde(pos, RSN_KEY_DATA_MAC_ADDR, kde->mac_addr, ETH_ALEN,
- NULL, 0);
-
- /* Initiator Nonce */
- pos = wpa_add_kde(pos, RSN_KEY_DATA_NONCE, kde->nonce, WPA_NONCE_LEN,
- NULL, 0);
-
- /* SMK with PNonce */
- pos = wpa_add_kde(pos, RSN_KEY_DATA_SMK, smk, PMK_LEN,
- key->key_nonce, WPA_NONCE_LEN);
-
- /* Lifetime */
- lifetime = htonl(43200); /* dot11RSNAConfigSMKLifetime */
- pos = wpa_add_kde(pos, RSN_KEY_DATA_LIFETIME,
- (u8 *) &lifetime, sizeof(lifetime), NULL, 0);
-
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "Sending SMK M4");
-
- __wpa_send_eapol(wpa_auth, sm,
- WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC |
- WPA_KEY_INFO_INSTALL | WPA_KEY_INFO_SMK_MESSAGE,
- NULL, key->key_nonce, buf, pos - buf, 0, 1, 0);
-
- os_free(buf);
-}
-
-
-static void wpa_send_smk_m5(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm,
- struct wpa_eapol_key *key,
- struct wpa_eapol_ie_parse *kde,
- const u8 *smk, const u8 *peer)
-{
- u8 *buf, *pos;
- size_t buf_len;
- u32 lifetime;
-
- /* SMK M5:
- * EAPOL-Key(S=1, M=1, A=0, I=0, K=0, SM=1, KeyRSC=0, Nonce=INonce,
- * MIC=MIC, DataKDs=(RSNIE_P, MAC_P KDE, PNonce, SMK KDE,
- * Lifetime KDE))
- */
-
- buf_len = kde->rsn_ie_len +
- 2 + RSN_SELECTOR_LEN + ETH_ALEN +
- 2 + RSN_SELECTOR_LEN + WPA_NONCE_LEN +
- 2 + RSN_SELECTOR_LEN + PMK_LEN + WPA_NONCE_LEN +
- 2 + RSN_SELECTOR_LEN + sizeof(lifetime);
- pos = buf = os_malloc(buf_len);
- if (buf == NULL)
- return;
-
- /* Peer RSN IE */
- os_memcpy(buf, kde->rsn_ie, kde->rsn_ie_len);
- pos = buf + kde->rsn_ie_len;
-
- /* Peer MAC Address */
- pos = wpa_add_kde(pos, RSN_KEY_DATA_MAC_ADDR, peer, ETH_ALEN, NULL, 0);
-
- /* PNonce */
- pos = wpa_add_kde(pos, RSN_KEY_DATA_NONCE, key->key_nonce,
- WPA_NONCE_LEN, NULL, 0);
-
- /* SMK and INonce */
- pos = wpa_add_kde(pos, RSN_KEY_DATA_SMK, smk, PMK_LEN,
- kde->nonce, WPA_NONCE_LEN);
-
- /* Lifetime */
- lifetime = htonl(43200); /* dot11RSNAConfigSMKLifetime */
- pos = wpa_add_kde(pos, RSN_KEY_DATA_LIFETIME,
- (u8 *) &lifetime, sizeof(lifetime), NULL, 0);
-
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "Sending SMK M5");
-
- __wpa_send_eapol(wpa_auth, sm,
- WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC |
- WPA_KEY_INFO_SMK_MESSAGE,
- NULL, kde->nonce, buf, pos - buf, 0, 1, 0);
-
- os_free(buf);
-}
-
-
-void wpa_smk_m3(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, struct wpa_eapol_key *key)
-{
- struct wpa_eapol_ie_parse kde;
- struct wpa_stsl_search search;
- u8 smk[32], buf[ETH_ALEN + 8 + 2 * WPA_NONCE_LEN], *pos;
-
- if (wpa_parse_kde_ies((const u8 *) (key + 1),
- WPA_GET_BE16(key->key_data_length), &kde) < 0) {
- wpa_printf(MSG_INFO, "RSN: Failed to parse KDEs in SMK M3");
- return;
- }
-
- if (kde.rsn_ie == NULL ||
- kde.mac_addr == NULL || kde.mac_addr_len < ETH_ALEN ||
- kde.nonce == NULL || kde.nonce_len < WPA_NONCE_LEN) {
- wpa_printf(MSG_INFO, "RSN: No RSN IE, MAC address KDE, or "
- "Nonce KDE in SMK M3");
- return;
- }
-
- /* Peer = sm->addr; Initiator = kde.mac_addr;
- * Peer Nonce = key->key_nonce; Initiator Nonce = kde.nonce */
-
- search.addr = kde.mac_addr;
- search.sm = NULL;
- if (wpa_auth_for_each_sta(wpa_auth, wpa_stsl_select_sta, &search) ==
- 0 || search.sm == NULL) {
- wpa_printf(MSG_DEBUG, "RSN: SMK handshake with " MACSTR
- " aborted - STA not associated anymore",
- MAC2STR(kde.mac_addr));
- wpa_smk_send_error(wpa_auth, sm, kde.mac_addr, STK_MUI_SMK,
- STK_ERR_STA_NR);
- /* FIX: wpa_stsl_remove(wpa_auth, neg); */
- return;
- }
-
- if (random_get_bytes(smk, PMK_LEN)) {
- wpa_printf(MSG_DEBUG, "RSN: Failed to generate SMK");
- return;
- }
-
- /* SMK = PRF-256(Random number, "SMK Derivation",
- * AA || Time || INonce || PNonce)
- */
- os_memcpy(buf, wpa_auth->addr, ETH_ALEN);
- pos = buf + ETH_ALEN;
- wpa_get_ntp_timestamp(pos);
- pos += 8;
- os_memcpy(pos, kde.nonce, WPA_NONCE_LEN);
- pos += WPA_NONCE_LEN;
- os_memcpy(pos, key->key_nonce, WPA_NONCE_LEN);
-#ifdef CONFIG_IEEE80211W
- sha256_prf(smk, PMK_LEN, "SMK Derivation", buf, sizeof(buf),
- smk, PMK_LEN);
-#else /* CONFIG_IEEE80211W */
- sha1_prf(smk, PMK_LEN, "SMK Derivation", buf, sizeof(buf),
- smk, PMK_LEN);
-#endif /* CONFIG_IEEE80211W */
-
- wpa_hexdump_key(MSG_DEBUG, "RSN: SMK", smk, PMK_LEN);
-
- wpa_send_smk_m4(wpa_auth, sm, key, &kde, smk);
- wpa_send_smk_m5(wpa_auth, search.sm, key, &kde, smk, sm->addr);
-
- /* Authenticator does not need SMK anymore and it is required to forget
- * it. */
- os_memset(smk, 0, sizeof(*smk));
-}
-
-
-void wpa_smk_error(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, struct wpa_eapol_key *key)
-{
- struct wpa_eapol_ie_parse kde;
- struct wpa_stsl_search search;
- struct rsn_error_kde error;
- u16 mui, error_type;
-
- if (wpa_parse_kde_ies((const u8 *) (key + 1),
- WPA_GET_BE16(key->key_data_length), &kde) < 0) {
- wpa_printf(MSG_INFO, "RSN: Failed to parse KDEs in SMK Error");
- return;
- }
-
- if (kde.mac_addr == NULL || kde.mac_addr_len < ETH_ALEN ||
- kde.error == NULL || kde.error_len < sizeof(error)) {
- wpa_printf(MSG_INFO, "RSN: No MAC address or Error KDE in "
- "SMK Error");
- return;
- }
-
- search.addr = kde.mac_addr;
- search.sm = NULL;
- if (wpa_auth_for_each_sta(wpa_auth, wpa_stsl_select_sta, &search) ==
- 0 || search.sm == NULL) {
- wpa_printf(MSG_DEBUG, "RSN: Peer STA " MACSTR " not "
- "associated for SMK Error message from " MACSTR,
- MAC2STR(kde.mac_addr), MAC2STR(sm->addr));
- return;
- }
-
- os_memcpy(&error, kde.error, sizeof(error));
- mui = be_to_host16(error.mui);
- error_type = be_to_host16(error.error_type);
- wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
- "STA reported SMK Error: Peer " MACSTR
- " MUI %d Error Type %d",
- MAC2STR(kde.mac_addr), mui, error_type);
-
- wpa_smk_send_error(wpa_auth, search.sm, sm->addr, mui, error_type);
-}
-
-
-int wpa_stsl_remove(struct wpa_authenticator *wpa_auth,
- struct wpa_stsl_negotiation *neg)
-{
- struct wpa_stsl_negotiation *pos, *prev;
-
- if (wpa_auth == NULL)
- return -1;
- pos = wpa_auth->stsl_negotiations;
- prev = NULL;
- while (pos) {
- if (pos == neg) {
- if (prev)
- prev->next = pos->next;
- else
- wpa_auth->stsl_negotiations = pos->next;
-
- eloop_cancel_timeout(wpa_stsl_step, wpa_auth, pos);
- os_free(pos);
- return 0;
- }
- prev = pos;
- pos = pos->next;
- }
-
- return -1;
-}
-
-#endif /* CONFIG_PEERKEY */
diff --git a/hostapd-0.8/src/ap/pmksa_cache_auth.c b/hostapd-0.8/src/ap/pmksa_cache_auth.c
deleted file mode 100644
index 22f44b7..0000000
--- a/hostapd-0.8/src/ap/pmksa_cache_auth.c
+++ /dev/null
@@ -1,425 +0,0 @@
-/*
- * hostapd - PMKSA cache for IEEE 802.11i RSN
- * Copyright (c) 2004-2008, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "eapol_auth/eapol_auth_sm.h"
-#include "eapol_auth/eapol_auth_sm_i.h"
-#include "sta_info.h"
-#include "ap_config.h"
-#include "pmksa_cache_auth.h"
-
-
-static const int pmksa_cache_max_entries = 1024;
-static const int dot11RSNAConfigPMKLifetime = 43200;
-
-struct rsn_pmksa_cache {
-#define PMKID_HASH_SIZE 128
-#define PMKID_HASH(pmkid) (unsigned int) ((pmkid)[0] & 0x7f)
- struct rsn_pmksa_cache_entry *pmkid[PMKID_HASH_SIZE];
- struct rsn_pmksa_cache_entry *pmksa;
- int pmksa_count;
-
- void (*free_cb)(struct rsn_pmksa_cache_entry *entry, void *ctx);
- void *ctx;
-};
-
-
-static void pmksa_cache_set_expiration(struct rsn_pmksa_cache *pmksa);
-
-
-static void _pmksa_cache_free_entry(struct rsn_pmksa_cache_entry *entry)
-{
- if (entry == NULL)
- return;
- os_free(entry->identity);
-#ifndef CONFIG_NO_RADIUS
- radius_free_class(&entry->radius_class);
-#endif /* CONFIG_NO_RADIUS */
- os_free(entry);
-}
-
-
-static void pmksa_cache_free_entry(struct rsn_pmksa_cache *pmksa,
- struct rsn_pmksa_cache_entry *entry)
-{
- struct rsn_pmksa_cache_entry *pos, *prev;
-
- pmksa->pmksa_count--;
- pmksa->free_cb(entry, pmksa->ctx);
- pos = pmksa->pmkid[PMKID_HASH(entry->pmkid)];
- prev = NULL;
- while (pos) {
- if (pos == entry) {
- if (prev != NULL) {
- prev->hnext = pos->hnext;
- } else {
- pmksa->pmkid[PMKID_HASH(entry->pmkid)] =
- pos->hnext;
- }
- break;
- }
- prev = pos;
- pos = pos->hnext;
- }
-
- pos = pmksa->pmksa;
- prev = NULL;
- while (pos) {
- if (pos == entry) {
- if (prev != NULL)
- prev->next = pos->next;
- else
- pmksa->pmksa = pos->next;
- break;
- }
- prev = pos;
- pos = pos->next;
- }
- _pmksa_cache_free_entry(entry);
-}
-
-
-static void pmksa_cache_expire(void *eloop_ctx, void *timeout_ctx)
-{
- struct rsn_pmksa_cache *pmksa = eloop_ctx;
- struct os_time now;
-
- os_get_time(&now);
- while (pmksa->pmksa && pmksa->pmksa->expiration <= now.sec) {
- struct rsn_pmksa_cache_entry *entry = pmksa->pmksa;
- pmksa->pmksa = entry->next;
- wpa_printf(MSG_DEBUG, "RSN: expired PMKSA cache entry for "
- MACSTR, MAC2STR(entry->spa));
- pmksa_cache_free_entry(pmksa, entry);
- }
-
- pmksa_cache_set_expiration(pmksa);
-}
-
-
-static void pmksa_cache_set_expiration(struct rsn_pmksa_cache *pmksa)
-{
- int sec;
- struct os_time now;
-
- eloop_cancel_timeout(pmksa_cache_expire, pmksa, NULL);
- if (pmksa->pmksa == NULL)
- return;
- os_get_time(&now);
- sec = pmksa->pmksa->expiration - now.sec;
- if (sec < 0)
- sec = 0;
- eloop_register_timeout(sec + 1, 0, pmksa_cache_expire, pmksa, NULL);
-}
-
-
-static void pmksa_cache_from_eapol_data(struct rsn_pmksa_cache_entry *entry,
- struct eapol_state_machine *eapol)
-{
- if (eapol == NULL)
- return;
-
- if (eapol->identity) {
- entry->identity = os_malloc(eapol->identity_len);
- if (entry->identity) {
- entry->identity_len = eapol->identity_len;
- os_memcpy(entry->identity, eapol->identity,
- eapol->identity_len);
- }
- }
-
-#ifndef CONFIG_NO_RADIUS
- radius_copy_class(&entry->radius_class, &eapol->radius_class);
-#endif /* CONFIG_NO_RADIUS */
-
- entry->eap_type_authsrv = eapol->eap_type_authsrv;
- entry->vlan_id = ((struct sta_info *) eapol->sta)->vlan_id;
-}
-
-
-void pmksa_cache_to_eapol_data(struct rsn_pmksa_cache_entry *entry,
- struct eapol_state_machine *eapol)
-{
- if (entry == NULL || eapol == NULL)
- return;
-
- if (entry->identity) {
- os_free(eapol->identity);
- eapol->identity = os_malloc(entry->identity_len);
- if (eapol->identity) {
- eapol->identity_len = entry->identity_len;
- os_memcpy(eapol->identity, entry->identity,
- entry->identity_len);
- }
- wpa_hexdump_ascii(MSG_DEBUG, "STA identity from PMKSA",
- eapol->identity, eapol->identity_len);
- }
-
-#ifndef CONFIG_NO_RADIUS
- radius_free_class(&eapol->radius_class);
- radius_copy_class(&eapol->radius_class, &entry->radius_class);
-#endif /* CONFIG_NO_RADIUS */
- if (eapol->radius_class.attr) {
- wpa_printf(MSG_DEBUG, "Copied %lu Class attribute(s) from "
- "PMKSA", (unsigned long) eapol->radius_class.count);
- }
-
- eapol->eap_type_authsrv = entry->eap_type_authsrv;
- ((struct sta_info *) eapol->sta)->vlan_id = entry->vlan_id;
-}
-
-
-static void pmksa_cache_link_entry(struct rsn_pmksa_cache *pmksa,
- struct rsn_pmksa_cache_entry *entry)
-{
- struct rsn_pmksa_cache_entry *pos, *prev;
-
- /* Add the new entry; order by expiration time */
- pos = pmksa->pmksa;
- prev = NULL;
- while (pos) {
- if (pos->expiration > entry->expiration)
- break;
- prev = pos;
- pos = pos->next;
- }
- if (prev == NULL) {
- entry->next = pmksa->pmksa;
- pmksa->pmksa = entry;
- } else {
- entry->next = prev->next;
- prev->next = entry;
- }
- entry->hnext = pmksa->pmkid[PMKID_HASH(entry->pmkid)];
- pmksa->pmkid[PMKID_HASH(entry->pmkid)] = entry;
-
- pmksa->pmksa_count++;
- wpa_printf(MSG_DEBUG, "RSN: added PMKSA cache entry for " MACSTR,
- MAC2STR(entry->spa));
- wpa_hexdump(MSG_DEBUG, "RSN: added PMKID", entry->pmkid, PMKID_LEN);
-}
-
-
-/**
- * pmksa_cache_auth_add - Add a PMKSA cache entry
- * @pmksa: Pointer to PMKSA cache data from pmksa_cache_auth_init()
- * @pmk: The new pairwise master key
- * @pmk_len: PMK length in bytes, usually PMK_LEN (32)
- * @aa: Authenticator address
- * @spa: Supplicant address
- * @session_timeout: Session timeout
- * @eapol: Pointer to EAPOL state machine data
- * @akmp: WPA_KEY_MGMT_* used in key derivation
- * Returns: Pointer to the added PMKSA cache entry or %NULL on error
- *
- * This function create a PMKSA entry for a new PMK and adds it to the PMKSA
- * cache. If an old entry is already in the cache for the same Supplicant,
- * this entry will be replaced with the new entry. PMKID will be calculated
- * based on the PMK.
- */
-struct rsn_pmksa_cache_entry *
-pmksa_cache_auth_add(struct rsn_pmksa_cache *pmksa,
- const u8 *pmk, size_t pmk_len,
- const u8 *aa, const u8 *spa, int session_timeout,
- struct eapol_state_machine *eapol, int akmp)
-{
- struct rsn_pmksa_cache_entry *entry, *pos;
- struct os_time now;
-
- if (pmk_len > PMK_LEN)
- return NULL;
-
- entry = os_zalloc(sizeof(*entry));
- if (entry == NULL)
- return NULL;
- os_memcpy(entry->pmk, pmk, pmk_len);
- entry->pmk_len = pmk_len;
- rsn_pmkid(pmk, pmk_len, aa, spa, entry->pmkid,
- wpa_key_mgmt_sha256(akmp));
- os_get_time(&now);
- entry->expiration = now.sec;
- if (session_timeout > 0)
- entry->expiration += session_timeout;
- else
- entry->expiration += dot11RSNAConfigPMKLifetime;
- entry->akmp = akmp;
- os_memcpy(entry->spa, spa, ETH_ALEN);
- pmksa_cache_from_eapol_data(entry, eapol);
-
- /* Replace an old entry for the same STA (if found) with the new entry
- */
- pos = pmksa_cache_auth_get(pmksa, spa, NULL);
- if (pos)
- pmksa_cache_free_entry(pmksa, pos);
-
- if (pmksa->pmksa_count >= pmksa_cache_max_entries && pmksa->pmksa) {
- /* Remove the oldest entry to make room for the new entry */
- wpa_printf(MSG_DEBUG, "RSN: removed the oldest PMKSA cache "
- "entry (for " MACSTR ") to make room for new one",
- MAC2STR(pmksa->pmksa->spa));
- pmksa_cache_free_entry(pmksa, pmksa->pmksa);
- }
-
- pmksa_cache_link_entry(pmksa, entry);
-
- return entry;
-}
-
-
-struct rsn_pmksa_cache_entry *
-pmksa_cache_add_okc(struct rsn_pmksa_cache *pmksa,
- const struct rsn_pmksa_cache_entry *old_entry,
- const u8 *aa, const u8 *pmkid)
-{
- struct rsn_pmksa_cache_entry *entry;
-
- entry = os_zalloc(sizeof(*entry));
- if (entry == NULL)
- return NULL;
- os_memcpy(entry->pmkid, pmkid, PMKID_LEN);
- os_memcpy(entry->pmk, old_entry->pmk, old_entry->pmk_len);
- entry->pmk_len = old_entry->pmk_len;
- entry->expiration = old_entry->expiration;
- entry->akmp = old_entry->akmp;
- os_memcpy(entry->spa, old_entry->spa, ETH_ALEN);
- entry->opportunistic = 1;
- if (old_entry->identity) {
- entry->identity = os_malloc(old_entry->identity_len);
- if (entry->identity) {
- entry->identity_len = old_entry->identity_len;
- os_memcpy(entry->identity, old_entry->identity,
- old_entry->identity_len);
- }
- }
-#ifndef CONFIG_NO_RADIUS
- radius_copy_class(&entry->radius_class, &old_entry->radius_class);
-#endif /* CONFIG_NO_RADIUS */
- entry->eap_type_authsrv = old_entry->eap_type_authsrv;
- entry->vlan_id = old_entry->vlan_id;
- entry->opportunistic = 1;
-
- pmksa_cache_link_entry(pmksa, entry);
-
- return entry;
-}
-
-
-/**
- * pmksa_cache_auth_deinit - Free all entries in PMKSA cache
- * @pmksa: Pointer to PMKSA cache data from pmksa_cache_auth_init()
- */
-void pmksa_cache_auth_deinit(struct rsn_pmksa_cache *pmksa)
-{
- struct rsn_pmksa_cache_entry *entry, *prev;
- int i;
-
- if (pmksa == NULL)
- return;
-
- entry = pmksa->pmksa;
- while (entry) {
- prev = entry;
- entry = entry->next;
- _pmksa_cache_free_entry(prev);
- }
- eloop_cancel_timeout(pmksa_cache_expire, pmksa, NULL);
- for (i = 0; i < PMKID_HASH_SIZE; i++)
- pmksa->pmkid[i] = NULL;
- os_free(pmksa);
-}
-
-
-/**
- * pmksa_cache_auth_get - Fetch a PMKSA cache entry
- * @pmksa: Pointer to PMKSA cache data from pmksa_cache_auth_init()
- * @spa: Supplicant address or %NULL to match any
- * @pmkid: PMKID or %NULL to match any
- * Returns: Pointer to PMKSA cache entry or %NULL if no match was found
- */
-struct rsn_pmksa_cache_entry *
-pmksa_cache_auth_get(struct rsn_pmksa_cache *pmksa,
- const u8 *spa, const u8 *pmkid)
-{
- struct rsn_pmksa_cache_entry *entry;
-
- if (pmkid)
- entry = pmksa->pmkid[PMKID_HASH(pmkid)];
- else
- entry = pmksa->pmksa;
- while (entry) {
- if ((spa == NULL ||
- os_memcmp(entry->spa, spa, ETH_ALEN) == 0) &&
- (pmkid == NULL ||
- os_memcmp(entry->pmkid, pmkid, PMKID_LEN) == 0))
- return entry;
- entry = pmkid ? entry->hnext : entry->next;
- }
- return NULL;
-}
-
-
-/**
- * pmksa_cache_get_okc - Fetch a PMKSA cache entry using OKC
- * @pmksa: Pointer to PMKSA cache data from pmksa_cache_auth_init()
- * @aa: Authenticator address
- * @spa: Supplicant address
- * @pmkid: PMKID
- * Returns: Pointer to PMKSA cache entry or %NULL if no match was found
- *
- * Use opportunistic key caching (OKC) to find a PMK for a supplicant.
- */
-struct rsn_pmksa_cache_entry * pmksa_cache_get_okc(
- struct rsn_pmksa_cache *pmksa, const u8 *aa, const u8 *spa,
- const u8 *pmkid)
-{
- struct rsn_pmksa_cache_entry *entry;
- u8 new_pmkid[PMKID_LEN];
-
- entry = pmksa->pmksa;
- while (entry) {
- if (os_memcmp(entry->spa, spa, ETH_ALEN) != 0)
- continue;
- rsn_pmkid(entry->pmk, entry->pmk_len, aa, spa, new_pmkid,
- wpa_key_mgmt_sha256(entry->akmp));
- if (os_memcmp(new_pmkid, pmkid, PMKID_LEN) == 0)
- return entry;
- entry = entry->next;
- }
- return NULL;
-}
-
-
-/**
- * pmksa_cache_auth_init - Initialize PMKSA cache
- * @free_cb: Callback function to be called when a PMKSA cache entry is freed
- * @ctx: Context pointer for free_cb function
- * Returns: Pointer to PMKSA cache data or %NULL on failure
- */
-struct rsn_pmksa_cache *
-pmksa_cache_auth_init(void (*free_cb)(struct rsn_pmksa_cache_entry *entry,
- void *ctx), void *ctx)
-{
- struct rsn_pmksa_cache *pmksa;
-
- pmksa = os_zalloc(sizeof(*pmksa));
- if (pmksa) {
- pmksa->free_cb = free_cb;
- pmksa->ctx = ctx;
- }
-
- return pmksa;
-}
diff --git a/hostapd-0.8/src/ap/pmksa_cache_auth.h b/hostapd-0.8/src/ap/pmksa_cache_auth.h
deleted file mode 100644
index 9628b13..0000000
--- a/hostapd-0.8/src/ap/pmksa_cache_auth.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * hostapd - PMKSA cache for IEEE 802.11i RSN
- * Copyright (c) 2004-2008, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef PMKSA_CACHE_H
-#define PMKSA_CACHE_H
-
-#include "radius/radius.h"
-
-/**
- * struct rsn_pmksa_cache_entry - PMKSA cache entry
- */
-struct rsn_pmksa_cache_entry {
- struct rsn_pmksa_cache_entry *next, *hnext;
- u8 pmkid[PMKID_LEN];
- u8 pmk[PMK_LEN];
- size_t pmk_len;
- os_time_t expiration;
- int akmp; /* WPA_KEY_MGMT_* */
- u8 spa[ETH_ALEN];
-
- u8 *identity;
- size_t identity_len;
- struct radius_class_data radius_class;
- u8 eap_type_authsrv;
- int vlan_id;
- int opportunistic;
-};
-
-struct rsn_pmksa_cache;
-
-struct rsn_pmksa_cache *
-pmksa_cache_auth_init(void (*free_cb)(struct rsn_pmksa_cache_entry *entry,
- void *ctx), void *ctx);
-void pmksa_cache_auth_deinit(struct rsn_pmksa_cache *pmksa);
-struct rsn_pmksa_cache_entry *
-pmksa_cache_auth_get(struct rsn_pmksa_cache *pmksa,
- const u8 *spa, const u8 *pmkid);
-struct rsn_pmksa_cache_entry * pmksa_cache_get_okc(
- struct rsn_pmksa_cache *pmksa, const u8 *spa, const u8 *aa,
- const u8 *pmkid);
-struct rsn_pmksa_cache_entry *
-pmksa_cache_auth_add(struct rsn_pmksa_cache *pmksa,
- const u8 *pmk, size_t pmk_len,
- const u8 *aa, const u8 *spa, int session_timeout,
- struct eapol_state_machine *eapol, int akmp);
-struct rsn_pmksa_cache_entry *
-pmksa_cache_add_okc(struct rsn_pmksa_cache *pmksa,
- const struct rsn_pmksa_cache_entry *old_entry,
- const u8 *aa, const u8 *pmkid);
-void pmksa_cache_to_eapol_data(struct rsn_pmksa_cache_entry *entry,
- struct eapol_state_machine *eapol);
-
-#endif /* PMKSA_CACHE_H */
diff --git a/hostapd-0.8/src/ap/preauth_auth.c b/hostapd-0.8/src/ap/preauth_auth.c
deleted file mode 100644
index 8e13315..0000000
--- a/hostapd-0.8/src/ap/preauth_auth.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * hostapd - Authenticator for IEEE 802.11i RSN pre-authentication
- * Copyright (c) 2004-2007, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#ifdef CONFIG_RSN_PREAUTH
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "l2_packet/l2_packet.h"
-#include "common/wpa_common.h"
-#include "eapol_auth/eapol_auth_sm.h"
-#include "eapol_auth/eapol_auth_sm_i.h"
-#include "hostapd.h"
-#include "ap_config.h"
-#include "ieee802_1x.h"
-#include "sta_info.h"
-#include "wpa_auth.h"
-#include "preauth_auth.h"
-
-#ifndef ETH_P_PREAUTH
-#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */
-#endif /* ETH_P_PREAUTH */
-
-static const int dot11RSNAConfigPMKLifetime = 43200;
-
-struct rsn_preauth_interface {
- struct rsn_preauth_interface *next;
- struct hostapd_data *hapd;
- struct l2_packet_data *l2;
- char *ifname;
- int ifindex;
-};
-
-
-static void rsn_preauth_receive(void *ctx, const u8 *src_addr,
- const u8 *buf, size_t len)
-{
- struct rsn_preauth_interface *piface = ctx;
- struct hostapd_data *hapd = piface->hapd;
- struct ieee802_1x_hdr *hdr;
- struct sta_info *sta;
- struct l2_ethhdr *ethhdr;
-
- wpa_printf(MSG_DEBUG, "RSN: receive pre-auth packet "
- "from interface '%s'", piface->ifname);
- if (len < sizeof(*ethhdr) + sizeof(*hdr)) {
- wpa_printf(MSG_DEBUG, "RSN: too short pre-auth packet "
- "(len=%lu)", (unsigned long) len);
- return;
- }
-
- ethhdr = (struct l2_ethhdr *) buf;
- hdr = (struct ieee802_1x_hdr *) (ethhdr + 1);
-
- if (os_memcmp(ethhdr->h_dest, hapd->own_addr, ETH_ALEN) != 0) {
- wpa_printf(MSG_DEBUG, "RSN: pre-auth for foreign address "
- MACSTR, MAC2STR(ethhdr->h_dest));
- return;
- }
-
- sta = ap_get_sta(hapd, ethhdr->h_source);
- if (sta && (sta->flags & WLAN_STA_ASSOC)) {
- wpa_printf(MSG_DEBUG, "RSN: pre-auth for already association "
- "STA " MACSTR, MAC2STR(sta->addr));
- return;
- }
- if (!sta && hdr->type == IEEE802_1X_TYPE_EAPOL_START) {
- sta = ap_sta_add(hapd, ethhdr->h_source);
- if (sta == NULL)
- return;
- sta->flags = WLAN_STA_PREAUTH;
-
- ieee802_1x_new_station(hapd, sta);
- if (sta->eapol_sm == NULL) {
- ap_free_sta(hapd, sta);
- sta = NULL;
- } else {
- sta->eapol_sm->radius_identifier = -1;
- sta->eapol_sm->portValid = TRUE;
- sta->eapol_sm->flags |= EAPOL_SM_PREAUTH;
- }
- }
- if (sta == NULL)
- return;
- sta->preauth_iface = piface;
- ieee802_1x_receive(hapd, ethhdr->h_source, (u8 *) (ethhdr + 1),
- len - sizeof(*ethhdr));
-}
-
-
-static int rsn_preauth_iface_add(struct hostapd_data *hapd, const char *ifname)
-{
- struct rsn_preauth_interface *piface;
-
- wpa_printf(MSG_DEBUG, "RSN pre-auth interface '%s'", ifname);
-
- piface = os_zalloc(sizeof(*piface));
- if (piface == NULL)
- return -1;
- piface->hapd = hapd;
-
- piface->ifname = os_strdup(ifname);
- if (piface->ifname == NULL) {
- goto fail1;
- }
-
- piface->l2 = l2_packet_init(piface->ifname, NULL, ETH_P_PREAUTH,
- rsn_preauth_receive, piface, 1);
- if (piface->l2 == NULL) {
- wpa_printf(MSG_ERROR, "Failed to open register layer 2 access "
- "to ETH_P_PREAUTH");
- goto fail2;
- }
-
- piface->next = hapd->preauth_iface;
- hapd->preauth_iface = piface;
- return 0;
-
-fail2:
- os_free(piface->ifname);
-fail1:
- os_free(piface);
- return -1;
-}
-
-
-void rsn_preauth_iface_deinit(struct hostapd_data *hapd)
-{
- struct rsn_preauth_interface *piface, *prev;
-
- piface = hapd->preauth_iface;
- hapd->preauth_iface = NULL;
- while (piface) {
- prev = piface;
- piface = piface->next;
- l2_packet_deinit(prev->l2);
- os_free(prev->ifname);
- os_free(prev);
- }
-}
-
-
-int rsn_preauth_iface_init(struct hostapd_data *hapd)
-{
- char *tmp, *start, *end;
-
- if (hapd->conf->rsn_preauth_interfaces == NULL)
- return 0;
-
- tmp = os_strdup(hapd->conf->rsn_preauth_interfaces);
- if (tmp == NULL)
- return -1;
- start = tmp;
- for (;;) {
- while (*start == ' ')
- start++;
- if (*start == '\0')
- break;
- end = os_strchr(start, ' ');
- if (end)
- *end = '\0';
-
- if (rsn_preauth_iface_add(hapd, start)) {
- rsn_preauth_iface_deinit(hapd);
- os_free(tmp);
- return -1;
- }
-
- if (end)
- start = end + 1;
- else
- break;
- }
- os_free(tmp);
- return 0;
-}
-
-
-static void rsn_preauth_finished_cb(void *eloop_ctx, void *timeout_ctx)
-{
- struct hostapd_data *hapd = eloop_ctx;
- struct sta_info *sta = timeout_ctx;
- wpa_printf(MSG_DEBUG, "RSN: Removing pre-authentication STA entry for "
- MACSTR, MAC2STR(sta->addr));
- ap_free_sta(hapd, sta);
-}
-
-
-void rsn_preauth_finished(struct hostapd_data *hapd, struct sta_info *sta,
- int success)
-{
- const u8 *key;
- size_t len;
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA,
- HOSTAPD_LEVEL_INFO, "pre-authentication %s",
- success ? "succeeded" : "failed");
-
- key = ieee802_1x_get_key(sta->eapol_sm, &len);
- if (len > PMK_LEN)
- len = PMK_LEN;
- if (success && key) {
- if (wpa_auth_pmksa_add_preauth(hapd->wpa_auth, key, len,
- sta->addr,
- dot11RSNAConfigPMKLifetime,
- sta->eapol_sm) == 0) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA,
- HOSTAPD_LEVEL_DEBUG,
- "added PMKSA cache entry (pre-auth)");
- } else {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA,
- HOSTAPD_LEVEL_DEBUG,
- "failed to add PMKSA cache entry "
- "(pre-auth)");
- }
- }
-
- /*
- * Finish STA entry removal from timeout in order to avoid freeing
- * STA data before the caller has finished processing.
- */
- eloop_register_timeout(0, 0, rsn_preauth_finished_cb, hapd, sta);
-}
-
-
-void rsn_preauth_send(struct hostapd_data *hapd, struct sta_info *sta,
- u8 *buf, size_t len)
-{
- struct rsn_preauth_interface *piface;
- struct l2_ethhdr *ethhdr;
-
- piface = hapd->preauth_iface;
- while (piface) {
- if (piface == sta->preauth_iface)
- break;
- piface = piface->next;
- }
-
- if (piface == NULL) {
- wpa_printf(MSG_DEBUG, "RSN: Could not find pre-authentication "
- "interface for " MACSTR, MAC2STR(sta->addr));
- return;
- }
-
- ethhdr = os_malloc(sizeof(*ethhdr) + len);
- if (ethhdr == NULL)
- return;
-
- os_memcpy(ethhdr->h_dest, sta->addr, ETH_ALEN);
- os_memcpy(ethhdr->h_source, hapd->own_addr, ETH_ALEN);
- ethhdr->h_proto = host_to_be16(ETH_P_PREAUTH);
- os_memcpy(ethhdr + 1, buf, len);
-
- if (l2_packet_send(piface->l2, sta->addr, ETH_P_PREAUTH, (u8 *) ethhdr,
- sizeof(*ethhdr) + len) < 0) {
- wpa_printf(MSG_ERROR, "Failed to send preauth packet using "
- "l2_packet_send\n");
- }
- os_free(ethhdr);
-}
-
-
-void rsn_preauth_free_station(struct hostapd_data *hapd, struct sta_info *sta)
-{
- eloop_cancel_timeout(rsn_preauth_finished_cb, hapd, sta);
-}
-
-#endif /* CONFIG_RSN_PREAUTH */
diff --git a/hostapd-0.8/src/ap/preauth_auth.h b/hostapd-0.8/src/ap/preauth_auth.h
deleted file mode 100644
index 5348bee..0000000
--- a/hostapd-0.8/src/ap/preauth_auth.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * hostapd - Authenticator for IEEE 802.11i RSN pre-authentication
- * Copyright (c) 2004-2005, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef PREAUTH_H
-#define PREAUTH_H
-
-#ifdef CONFIG_RSN_PREAUTH
-
-int rsn_preauth_iface_init(struct hostapd_data *hapd);
-void rsn_preauth_iface_deinit(struct hostapd_data *hapd);
-void rsn_preauth_finished(struct hostapd_data *hapd, struct sta_info *sta,
- int success);
-void rsn_preauth_send(struct hostapd_data *hapd, struct sta_info *sta,
- u8 *buf, size_t len);
-void rsn_preauth_free_station(struct hostapd_data *hapd, struct sta_info *sta);
-
-#else /* CONFIG_RSN_PREAUTH */
-
-static inline int rsn_preauth_iface_init(struct hostapd_data *hapd)
-{
- return 0;
-}
-
-static inline void rsn_preauth_iface_deinit(struct hostapd_data *hapd)
-{
-}
-
-static inline void rsn_preauth_finished(struct hostapd_data *hapd,
- struct sta_info *sta,
- int success)
-{
-}
-
-static inline void rsn_preauth_send(struct hostapd_data *hapd,
- struct sta_info *sta,
- u8 *buf, size_t len)
-{
-}
-
-static inline void rsn_preauth_free_station(struct hostapd_data *hapd,
- struct sta_info *sta)
-{
-}
-
-#endif /* CONFIG_RSN_PREAUTH */
-
-#endif /* PREAUTH_H */
diff --git a/hostapd-0.8/src/ap/sta_info.c b/hostapd-0.8/src/ap/sta_info.c
deleted file mode 100644
index e829447..0000000
--- a/hostapd-0.8/src/ap/sta_info.c
+++ /dev/null
@@ -1,796 +0,0 @@
-/*
- * hostapd / Station table
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "common/ieee802_11_defs.h"
-#include "radius/radius.h"
-#include "radius/radius_client.h"
-#include "drivers/driver.h"
-#include "p2p/p2p.h"
-#include "hostapd.h"
-#include "accounting.h"
-#include "ieee802_1x.h"
-#include "ieee802_11.h"
-#include "wpa_auth.h"
-#include "preauth_auth.h"
-#include "ap_config.h"
-#include "beacon.h"
-#include "ap_mlme.h"
-#include "vlan_init.h"
-#include "p2p_hostapd.h"
-#include "ap_drv_ops.h"
-#include "sta_info.h"
-
-static void ap_sta_remove_in_other_bss(struct hostapd_data *hapd,
- struct sta_info *sta);
-static void ap_handle_session_timer(void *eloop_ctx, void *timeout_ctx);
-#ifdef CONFIG_IEEE80211W
-static void ap_sa_query_timer(void *eloop_ctx, void *timeout_ctx);
-#endif /* CONFIG_IEEE80211W */
-
-int ap_for_each_sta(struct hostapd_data *hapd,
- int (*cb)(struct hostapd_data *hapd, struct sta_info *sta,
- void *ctx),
- void *ctx)
-{
- struct sta_info *sta;
-
- for (sta = hapd->sta_list; sta; sta = sta->next) {
- if (cb(hapd, sta, ctx))
- return 1;
- }
-
- return 0;
-}
-
-
-struct sta_info * ap_get_sta(struct hostapd_data *hapd, const u8 *sta)
-{
- struct sta_info *s;
-
- s = hapd->sta_hash[STA_HASH(sta)];
- while (s != NULL && os_memcmp(s->addr, sta, 6) != 0)
- s = s->hnext;
- return s;
-}
-
-
-static void ap_sta_list_del(struct hostapd_data *hapd, struct sta_info *sta)
-{
- struct sta_info *tmp;
-
- if (hapd->sta_list == sta) {
- hapd->sta_list = sta->next;
- return;
- }
-
- tmp = hapd->sta_list;
- while (tmp != NULL && tmp->next != sta)
- tmp = tmp->next;
- if (tmp == NULL) {
- wpa_printf(MSG_DEBUG, "Could not remove STA " MACSTR " from "
- "list.", MAC2STR(sta->addr));
- } else
- tmp->next = sta->next;
-}
-
-
-void ap_sta_hash_add(struct hostapd_data *hapd, struct sta_info *sta)
-{
- sta->hnext = hapd->sta_hash[STA_HASH(sta->addr)];
- hapd->sta_hash[STA_HASH(sta->addr)] = sta;
-}
-
-
-static void ap_sta_hash_del(struct hostapd_data *hapd, struct sta_info *sta)
-{
- struct sta_info *s;
-
- s = hapd->sta_hash[STA_HASH(sta->addr)];
- if (s == NULL) return;
- if (os_memcmp(s->addr, sta->addr, 6) == 0) {
- hapd->sta_hash[STA_HASH(sta->addr)] = s->hnext;
- return;
- }
-
- while (s->hnext != NULL &&
- os_memcmp(s->hnext->addr, sta->addr, ETH_ALEN) != 0)
- s = s->hnext;
- if (s->hnext != NULL)
- s->hnext = s->hnext->hnext;
- else
- wpa_printf(MSG_DEBUG, "AP: could not remove STA " MACSTR
- " from hash table", MAC2STR(sta->addr));
-}
-
-
-void ap_free_sta(struct hostapd_data *hapd, struct sta_info *sta)
-{
- int set_beacon = 0;
-
- accounting_sta_stop(hapd, sta);
-
- /* just in case */
- ap_sta_set_authorized(hapd, sta, 0);
-
- if (sta->flags & WLAN_STA_WDS)
- hostapd_set_wds_sta(hapd, sta->addr, sta->aid, 0);
-
- if (!(sta->flags & WLAN_STA_PREAUTH))
- hostapd_drv_sta_remove(hapd, sta->addr);
-
- ap_sta_hash_del(hapd, sta);
- ap_sta_list_del(hapd, sta);
-
- if (sta->aid > 0)
- hapd->sta_aid[(sta->aid - 1) / 32] &=
- ~BIT((sta->aid - 1) % 32);
-
- hapd->num_sta--;
- if (sta->nonerp_set) {
- sta->nonerp_set = 0;
- hapd->iface->num_sta_non_erp--;
- if (hapd->iface->num_sta_non_erp == 0)
- set_beacon++;
- }
-
- if (sta->no_short_slot_time_set) {
- sta->no_short_slot_time_set = 0;
- hapd->iface->num_sta_no_short_slot_time--;
- if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G
- && hapd->iface->num_sta_no_short_slot_time == 0)
- set_beacon++;
- }
-
- if (sta->no_short_preamble_set) {
- sta->no_short_preamble_set = 0;
- hapd->iface->num_sta_no_short_preamble--;
- if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G
- && hapd->iface->num_sta_no_short_preamble == 0)
- set_beacon++;
- }
-
- if (sta->no_ht_gf_set) {
- sta->no_ht_gf_set = 0;
- hapd->iface->num_sta_ht_no_gf--;
- }
-
- if (sta->no_ht_set) {
- sta->no_ht_set = 0;
- hapd->iface->num_sta_no_ht--;
- }
-
- if (sta->ht_20mhz_set) {
- sta->ht_20mhz_set = 0;
- hapd->iface->num_sta_ht_20mhz--;
- }
-
-#ifdef CONFIG_P2P
- if (sta->no_p2p_set) {
- sta->no_p2p_set = 0;
- hapd->num_sta_no_p2p--;
- if (hapd->num_sta_no_p2p == 0)
- hostapd_p2p_non_p2p_sta_disconnected(hapd);
- }
-#endif /* CONFIG_P2P */
-
-#if defined(NEED_AP_MLME) && defined(CONFIG_IEEE80211N)
- if (hostapd_ht_operation_update(hapd->iface) > 0)
- set_beacon++;
-#endif /* NEED_AP_MLME && CONFIG_IEEE80211N */
-
- if (set_beacon)
- ieee802_11_set_beacons(hapd->iface);
-
- eloop_cancel_timeout(ap_handle_timer, hapd, sta);
- eloop_cancel_timeout(ap_handle_session_timer, hapd, sta);
-
- ieee802_1x_free_station(sta);
- wpa_auth_sta_deinit(sta->wpa_sm);
- rsn_preauth_free_station(hapd, sta);
-#ifndef CONFIG_NO_RADIUS
- radius_client_flush_auth(hapd->radius, sta->addr);
-#endif /* CONFIG_NO_RADIUS */
-
- os_free(sta->last_assoc_req);
- os_free(sta->challenge);
-
-#ifdef CONFIG_IEEE80211W
- os_free(sta->sa_query_trans_id);
- eloop_cancel_timeout(ap_sa_query_timer, hapd, sta);
-#endif /* CONFIG_IEEE80211W */
-
-#ifdef CONFIG_P2P
- p2p_group_notif_disassoc(hapd->p2p_group, sta->addr);
-#endif /* CONFIG_P2P */
-
- wpabuf_free(sta->wps_ie);
- wpabuf_free(sta->p2p_ie);
-
- os_free(sta->ht_capabilities);
-
- os_free(sta);
-}
-
-
-void hostapd_free_stas(struct hostapd_data *hapd)
-{
- struct sta_info *sta, *prev;
-
- sta = hapd->sta_list;
-
- while (sta) {
- prev = sta;
- if (sta->flags & WLAN_STA_AUTH) {
- mlme_deauthenticate_indication(
- hapd, sta, WLAN_REASON_UNSPECIFIED);
- }
- sta = sta->next;
- wpa_printf(MSG_DEBUG, "Removing station " MACSTR,
- MAC2STR(prev->addr));
- ap_free_sta(hapd, prev);
- }
-}
-
-
-/**
- * ap_handle_timer - Per STA timer handler
- * @eloop_ctx: struct hostapd_data *
- * @timeout_ctx: struct sta_info *
- *
- * This function is called to check station activity and to remove inactive
- * stations.
- */
-void ap_handle_timer(void *eloop_ctx, void *timeout_ctx)
-{
- struct hostapd_data *hapd = eloop_ctx;
- struct sta_info *sta = timeout_ctx;
- unsigned long next_time = 0;
-
- if (sta->timeout_next == STA_REMOVE) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "deauthenticated due to "
- "local deauth request");
- ap_free_sta(hapd, sta);
- return;
- }
-
- if ((sta->flags & WLAN_STA_ASSOC) &&
- (sta->timeout_next == STA_NULLFUNC ||
- sta->timeout_next == STA_DISASSOC)) {
- int inactive_sec;
- inactive_sec = hostapd_drv_get_inact_sec(hapd, sta->addr);
- if (inactive_sec == -1) {
- wpa_msg(hapd, MSG_DEBUG, "Check inactivity: Could not "
- "get station info rom kernel driver for "
- MACSTR, MAC2STR(sta->addr));
- } else if (inactive_sec < hapd->conf->ap_max_inactivity &&
- sta->flags & WLAN_STA_ASSOC) {
- /* station activity detected; reset timeout state */
- wpa_msg(hapd, MSG_DEBUG, "Station " MACSTR " has been "
- "active %is ago",
- MAC2STR(sta->addr), inactive_sec);
- sta->timeout_next = STA_NULLFUNC;
- next_time = hapd->conf->ap_max_inactivity -
- inactive_sec;
- } else {
- wpa_msg(hapd, MSG_DEBUG, "Station " MACSTR " has been "
- "inactive too long: %d sec, max allowed: %d",
- MAC2STR(sta->addr), inactive_sec,
- hapd->conf->ap_max_inactivity);
- }
- }
-
- if ((sta->flags & WLAN_STA_ASSOC) &&
- sta->timeout_next == STA_DISASSOC &&
- !(sta->flags & WLAN_STA_PENDING_POLL)) {
- wpa_msg(hapd, MSG_DEBUG, "Station " MACSTR " has ACKed data "
- "poll", MAC2STR(sta->addr));
- /* data nullfunc frame poll did not produce TX errors; assume
- * station ACKed it */
- sta->timeout_next = STA_NULLFUNC;
- next_time = hapd->conf->ap_max_inactivity;
- }
-
- if (next_time) {
- eloop_register_timeout(next_time, 0, ap_handle_timer, hapd,
- sta);
- return;
- }
-
- if (sta->timeout_next == STA_NULLFUNC &&
- (sta->flags & WLAN_STA_ASSOC)) {
-#ifndef CONFIG_NATIVE_WINDOWS
- /* send data frame to poll STA and check whether this frame
- * is ACKed */
- struct ieee80211_hdr hdr;
-
- wpa_printf(MSG_DEBUG, " Polling STA with data frame");
- sta->flags |= WLAN_STA_PENDING_POLL;
-
- os_memset(&hdr, 0, sizeof(hdr));
- if (hapd->driver &&
- os_strcmp(hapd->driver->name, "hostap") == 0) {
- /*
- * WLAN_FC_STYPE_NULLFUNC would be more appropriate,
- * but it is apparently not retried so TX Exc events
- * are not received for it.
- */
- hdr.frame_control =
- IEEE80211_FC(WLAN_FC_TYPE_DATA,
- WLAN_FC_STYPE_DATA);
- } else {
- hdr.frame_control =
- IEEE80211_FC(WLAN_FC_TYPE_DATA,
- WLAN_FC_STYPE_NULLFUNC);
- }
-
- hdr.frame_control |= host_to_le16(WLAN_FC_FROMDS);
- os_memcpy(hdr.IEEE80211_DA_FROMDS, sta->addr, ETH_ALEN);
- os_memcpy(hdr.IEEE80211_BSSID_FROMDS, hapd->own_addr,
- ETH_ALEN);
- os_memcpy(hdr.IEEE80211_SA_FROMDS, hapd->own_addr, ETH_ALEN);
-
- if (hostapd_drv_send_mlme(hapd, &hdr, sizeof(hdr)) < 0)
- perror("ap_handle_timer: send");
-#endif /* CONFIG_NATIVE_WINDOWS */
- } else if (sta->timeout_next != STA_REMOVE) {
- int deauth = sta->timeout_next == STA_DEAUTH;
-
- wpa_printf(MSG_DEBUG, "Sending %s info to STA " MACSTR,
- deauth ? "deauthentication" : "disassociation",
- MAC2STR(sta->addr));
-
- if (deauth) {
- hostapd_drv_sta_deauth(
- hapd, sta->addr,
- WLAN_REASON_PREV_AUTH_NOT_VALID);
- } else {
- hostapd_drv_sta_disassoc(
- hapd, sta->addr,
- WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY);
- }
- }
-
- switch (sta->timeout_next) {
- case STA_NULLFUNC:
- sta->timeout_next = STA_DISASSOC;
- eloop_register_timeout(AP_DISASSOC_DELAY, 0, ap_handle_timer,
- hapd, sta);
- break;
- case STA_DISASSOC:
- sta->flags &= ~WLAN_STA_ASSOC;
- ieee802_1x_notify_port_enabled(sta->eapol_sm, 0);
- if (!sta->acct_terminate_cause)
- sta->acct_terminate_cause =
- RADIUS_ACCT_TERMINATE_CAUSE_IDLE_TIMEOUT;
- accounting_sta_stop(hapd, sta);
- ieee802_1x_free_station(sta);
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "disassociated due to "
- "inactivity");
- sta->timeout_next = STA_DEAUTH;
- eloop_register_timeout(AP_DEAUTH_DELAY, 0, ap_handle_timer,
- hapd, sta);
- mlme_disassociate_indication(
- hapd, sta, WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY);
- break;
- case STA_DEAUTH:
- case STA_REMOVE:
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "deauthenticated due to "
- "inactivity");
- if (!sta->acct_terminate_cause)
- sta->acct_terminate_cause =
- RADIUS_ACCT_TERMINATE_CAUSE_IDLE_TIMEOUT;
- mlme_deauthenticate_indication(
- hapd, sta,
- WLAN_REASON_PREV_AUTH_NOT_VALID);
- ap_free_sta(hapd, sta);
- break;
- }
-}
-
-
-static void ap_handle_session_timer(void *eloop_ctx, void *timeout_ctx)
-{
- struct hostapd_data *hapd = eloop_ctx;
- struct sta_info *sta = timeout_ctx;
- u8 addr[ETH_ALEN];
-
- if (!(sta->flags & WLAN_STA_AUTH))
- return;
-
- mlme_deauthenticate_indication(hapd, sta,
- WLAN_REASON_PREV_AUTH_NOT_VALID);
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "deauthenticated due to "
- "session timeout");
- sta->acct_terminate_cause =
- RADIUS_ACCT_TERMINATE_CAUSE_SESSION_TIMEOUT;
- os_memcpy(addr, sta->addr, ETH_ALEN);
- ap_free_sta(hapd, sta);
- hostapd_drv_sta_deauth(hapd, addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
-}
-
-
-void ap_sta_session_timeout(struct hostapd_data *hapd, struct sta_info *sta,
- u32 session_timeout)
-{
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG, "setting session timeout to %d "
- "seconds", session_timeout);
- eloop_cancel_timeout(ap_handle_session_timer, hapd, sta);
- eloop_register_timeout(session_timeout, 0, ap_handle_session_timer,
- hapd, sta);
-}
-
-
-void ap_sta_no_session_timeout(struct hostapd_data *hapd, struct sta_info *sta)
-{
- eloop_cancel_timeout(ap_handle_session_timer, hapd, sta);
-}
-
-
-struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr)
-{
- struct sta_info *sta;
-
- sta = ap_get_sta(hapd, addr);
- if (sta)
- return sta;
-
- wpa_printf(MSG_DEBUG, " New STA");
- if (hapd->num_sta >= hapd->conf->max_num_sta) {
- /* FIX: might try to remove some old STAs first? */
- wpa_printf(MSG_DEBUG, "no more room for new STAs (%d/%d)",
- hapd->num_sta, hapd->conf->max_num_sta);
- return NULL;
- }
-
- sta = os_zalloc(sizeof(struct sta_info));
- if (sta == NULL) {
- wpa_printf(MSG_ERROR, "malloc failed");
- return NULL;
- }
- sta->acct_interim_interval = hapd->conf->acct_interim_interval;
-
- /* initialize STA info data */
- eloop_register_timeout(hapd->conf->ap_max_inactivity, 0,
- ap_handle_timer, hapd, sta);
- os_memcpy(sta->addr, addr, ETH_ALEN);
- sta->next = hapd->sta_list;
- hapd->sta_list = sta;
- hapd->num_sta++;
- ap_sta_hash_add(hapd, sta);
- sta->ssid = &hapd->conf->ssid;
- ap_sta_remove_in_other_bss(hapd, sta);
-
- return sta;
-}
-
-
-static int ap_sta_remove(struct hostapd_data *hapd, struct sta_info *sta)
-{
- ieee802_1x_notify_port_enabled(sta->eapol_sm, 0);
-
- wpa_printf(MSG_DEBUG, "Removing STA " MACSTR " from kernel driver",
- MAC2STR(sta->addr));
- if (hostapd_drv_sta_remove(hapd, sta->addr) &&
- sta->flags & WLAN_STA_ASSOC) {
- wpa_printf(MSG_DEBUG, "Could not remove station " MACSTR
- " from kernel driver.", MAC2STR(sta->addr));
- return -1;
- }
- return 0;
-}
-
-
-static void ap_sta_remove_in_other_bss(struct hostapd_data *hapd,
- struct sta_info *sta)
-{
- struct hostapd_iface *iface = hapd->iface;
- size_t i;
-
- for (i = 0; i < iface->num_bss; i++) {
- struct hostapd_data *bss = iface->bss[i];
- struct sta_info *sta2;
- /* bss should always be set during operation, but it may be
- * NULL during reconfiguration. Assume the STA is not
- * associated to another BSS in that case to avoid NULL pointer
- * dereferences. */
- if (bss == hapd || bss == NULL)
- continue;
- sta2 = ap_get_sta(bss, sta->addr);
- if (!sta2)
- continue;
-
- ap_sta_disconnect(bss, sta2, sta2->addr,
- WLAN_REASON_PREV_AUTH_NOT_VALID);
- }
-}
-
-
-void ap_sta_disassociate(struct hostapd_data *hapd, struct sta_info *sta,
- u16 reason)
-{
- wpa_printf(MSG_DEBUG, "%s: disassociate STA " MACSTR,
- hapd->conf->iface, MAC2STR(sta->addr));
- sta->flags &= ~WLAN_STA_ASSOC;
- ap_sta_remove(hapd, sta);
- sta->timeout_next = STA_DEAUTH;
- eloop_cancel_timeout(ap_handle_timer, hapd, sta);
- eloop_register_timeout(AP_MAX_INACTIVITY_AFTER_DISASSOC, 0,
- ap_handle_timer, hapd, sta);
- accounting_sta_stop(hapd, sta);
- ieee802_1x_free_station(sta);
-
- mlme_disassociate_indication(hapd, sta, reason);
-}
-
-
-void ap_sta_deauthenticate(struct hostapd_data *hapd, struct sta_info *sta,
- u16 reason)
-{
- wpa_printf(MSG_DEBUG, "%s: deauthenticate STA " MACSTR,
- hapd->conf->iface, MAC2STR(sta->addr));
- sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC);
- ap_sta_remove(hapd, sta);
- sta->timeout_next = STA_REMOVE;
- eloop_cancel_timeout(ap_handle_timer, hapd, sta);
- eloop_register_timeout(AP_MAX_INACTIVITY_AFTER_DEAUTH, 0,
- ap_handle_timer, hapd, sta);
- accounting_sta_stop(hapd, sta);
- ieee802_1x_free_station(sta);
-
- mlme_deauthenticate_indication(hapd, sta, reason);
-}
-
-
-int ap_sta_bind_vlan(struct hostapd_data *hapd, struct sta_info *sta,
- int old_vlanid)
-{
-#ifndef CONFIG_NO_VLAN
- const char *iface;
- struct hostapd_vlan *vlan = NULL;
- int ret;
-
- /*
- * Do not proceed furthur if the vlan id remains same. We do not want
- * duplicate dynamic vlan entries.
- */
- if (sta->vlan_id == old_vlanid)
- return 0;
-
- /*
- * During 1x reauth, if the vlan id changes, then remove the old id and
- * proceed furthur to add the new one.
- */
- if (old_vlanid > 0)
- vlan_remove_dynamic(hapd, old_vlanid);
-
- iface = hapd->conf->iface;
- if (sta->ssid->vlan[0])
- iface = sta->ssid->vlan;
-
- if (sta->ssid->dynamic_vlan == DYNAMIC_VLAN_DISABLED)
- sta->vlan_id = 0;
- else if (sta->vlan_id > 0) {
- vlan = hapd->conf->vlan;
- while (vlan) {
- if (vlan->vlan_id == sta->vlan_id ||
- vlan->vlan_id == VLAN_ID_WILDCARD) {
- iface = vlan->ifname;
- break;
- }
- vlan = vlan->next;
- }
- }
-
- if (sta->vlan_id > 0 && vlan == NULL) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG, "could not find VLAN for "
- "binding station to (vlan_id=%d)",
- sta->vlan_id);
- return -1;
- } else if (sta->vlan_id > 0 && vlan->vlan_id == VLAN_ID_WILDCARD) {
- vlan = vlan_add_dynamic(hapd, vlan, sta->vlan_id);
- if (vlan == NULL) {
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG, "could not add "
- "dynamic VLAN interface for vlan_id=%d",
- sta->vlan_id);
- return -1;
- }
-
- iface = vlan->ifname;
- if (vlan_setup_encryption_dyn(hapd, sta->ssid, iface) != 0) {
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG, "could not "
- "configure encryption for dynamic VLAN "
- "interface for vlan_id=%d",
- sta->vlan_id);
- }
-
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG, "added new dynamic VLAN "
- "interface '%s'", iface);
- } else if (vlan && vlan->vlan_id == sta->vlan_id) {
- if (sta->vlan_id > 0) {
- vlan->dynamic_vlan++;
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG, "updated existing "
- "dynamic VLAN interface '%s'", iface);
- }
-
- /*
- * Update encryption configuration for statically generated
- * VLAN interface. This is only used for static WEP
- * configuration for the case where hostapd did not yet know
- * which keys are to be used when the interface was added.
- */
- if (vlan_setup_encryption_dyn(hapd, sta->ssid, iface) != 0) {
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG, "could not "
- "configure encryption for VLAN "
- "interface for vlan_id=%d",
- sta->vlan_id);
- }
- }
-
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG, "binding station to interface "
- "'%s'", iface);
-
- if (wpa_auth_sta_set_vlan(sta->wpa_sm, sta->vlan_id) < 0)
- wpa_printf(MSG_INFO, "Failed to update VLAN-ID for WPA");
-
- ret = hostapd_drv_set_sta_vlan(iface, hapd, sta->addr, sta->vlan_id);
- if (ret < 0) {
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG, "could not bind the STA "
- "entry to vlan_id=%d", sta->vlan_id);
- }
- return ret;
-#else /* CONFIG_NO_VLAN */
- return 0;
-#endif /* CONFIG_NO_VLAN */
-}
-
-
-#ifdef CONFIG_IEEE80211W
-
-int ap_check_sa_query_timeout(struct hostapd_data *hapd, struct sta_info *sta)
-{
- u32 tu;
- struct os_time now, passed;
- os_get_time(&now);
- os_time_sub(&now, &sta->sa_query_start, &passed);
- tu = (passed.sec * 1000000 + passed.usec) / 1024;
- if (hapd->conf->assoc_sa_query_max_timeout < tu) {
- hostapd_logger(hapd, sta->addr,
- HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "association SA Query timed out");
- sta->sa_query_timed_out = 1;
- os_free(sta->sa_query_trans_id);
- sta->sa_query_trans_id = NULL;
- sta->sa_query_count = 0;
- eloop_cancel_timeout(ap_sa_query_timer, hapd, sta);
- return 1;
- }
-
- return 0;
-}
-
-
-static void ap_sa_query_timer(void *eloop_ctx, void *timeout_ctx)
-{
- struct hostapd_data *hapd = eloop_ctx;
- struct sta_info *sta = timeout_ctx;
- unsigned int timeout, sec, usec;
- u8 *trans_id, *nbuf;
-
- if (sta->sa_query_count > 0 &&
- ap_check_sa_query_timeout(hapd, sta))
- return;
-
- nbuf = os_realloc(sta->sa_query_trans_id,
- (sta->sa_query_count + 1) * WLAN_SA_QUERY_TR_ID_LEN);
- if (nbuf == NULL)
- return;
- if (sta->sa_query_count == 0) {
- /* Starting a new SA Query procedure */
- os_get_time(&sta->sa_query_start);
- }
- trans_id = nbuf + sta->sa_query_count * WLAN_SA_QUERY_TR_ID_LEN;
- sta->sa_query_trans_id = nbuf;
- sta->sa_query_count++;
-
- os_get_random(trans_id, WLAN_SA_QUERY_TR_ID_LEN);
-
- timeout = hapd->conf->assoc_sa_query_retry_timeout;
- sec = ((timeout / 1000) * 1024) / 1000;
- usec = (timeout % 1000) * 1024;
- eloop_register_timeout(sec, usec, ap_sa_query_timer, hapd, sta);
-
- hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "association SA Query attempt %d", sta->sa_query_count);
-
-#ifdef NEED_AP_MLME
- ieee802_11_send_sa_query_req(hapd, sta->addr, trans_id);
-#endif /* NEED_AP_MLME */
-}
-
-
-void ap_sta_start_sa_query(struct hostapd_data *hapd, struct sta_info *sta)
-{
- ap_sa_query_timer(hapd, sta);
-}
-
-
-void ap_sta_stop_sa_query(struct hostapd_data *hapd, struct sta_info *sta)
-{
- eloop_cancel_timeout(ap_sa_query_timer, hapd, sta);
- os_free(sta->sa_query_trans_id);
- sta->sa_query_trans_id = NULL;
- sta->sa_query_count = 0;
-}
-
-#endif /* CONFIG_IEEE80211W */
-
-
-void ap_sta_set_authorized(struct hostapd_data *hapd, struct sta_info *sta,
- int authorized)
-{
- if (!!authorized == !!(sta->flags & WLAN_STA_AUTHORIZED))
- return;
-
- if (authorized)
- sta->flags |= WLAN_STA_AUTHORIZED;
- else
- sta->flags &= ~WLAN_STA_AUTHORIZED;
-
- if (hapd->sta_authorized_cb)
- hapd->sta_authorized_cb(hapd->sta_authorized_cb_ctx,
- sta->addr, authorized);
-}
-
-
-void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta,
- const u8 *addr, u16 reason)
-{
-
- if (sta == NULL && addr)
- sta = ap_get_sta(hapd, addr);
-
- if (addr)
- hostapd_drv_sta_deauth(hapd, addr, reason);
-
- if (sta == NULL)
- return;
- ap_sta_set_authorized(hapd, sta, 0);
- sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC);
- eloop_cancel_timeout(ap_handle_timer, hapd, sta);
- eloop_register_timeout(0, 0, ap_handle_timer, hapd, sta);
- sta->timeout_next = STA_REMOVE;
-}
diff --git a/hostapd-0.8/src/ap/sta_info.h b/hostapd-0.8/src/ap/sta_info.h
deleted file mode 100644
index 9ec4fe3..0000000
--- a/hostapd-0.8/src/ap/sta_info.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * hostapd / Station table
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef STA_INFO_H
-#define STA_INFO_H
-
-/* STA flags */
-#define WLAN_STA_AUTH BIT(0)
-#define WLAN_STA_ASSOC BIT(1)
-#define WLAN_STA_PS BIT(2)
-#define WLAN_STA_TIM BIT(3)
-#define WLAN_STA_PERM BIT(4)
-#define WLAN_STA_AUTHORIZED BIT(5)
-#define WLAN_STA_PENDING_POLL BIT(6) /* pending activity poll not ACKed */
-#define WLAN_STA_SHORT_PREAMBLE BIT(7)
-#define WLAN_STA_PREAUTH BIT(8)
-#define WLAN_STA_WMM BIT(9)
-#define WLAN_STA_MFP BIT(10)
-#define WLAN_STA_HT BIT(11)
-#define WLAN_STA_WPS BIT(12)
-#define WLAN_STA_MAYBE_WPS BIT(13)
-#define WLAN_STA_WDS BIT(14)
-#define WLAN_STA_ASSOC_REQ_OK BIT(15)
-#define WLAN_STA_NONERP BIT(31)
-
-/* Maximum number of supported rates (from both Supported Rates and Extended
- * Supported Rates IEs). */
-#define WLAN_SUPP_RATES_MAX 32
-
-
-struct sta_info {
- struct sta_info *next; /* next entry in sta list */
- struct sta_info *hnext; /* next entry in hash table list */
- u8 addr[6];
- u16 aid; /* STA's unique AID (1 .. 2007) or 0 if not yet assigned */
- u32 flags; /* Bitfield of WLAN_STA_* */
- u16 capability;
- u16 listen_interval; /* or beacon_int for APs */
- u8 supported_rates[WLAN_SUPP_RATES_MAX];
- int supported_rates_len;
-
- unsigned int nonerp_set:1;
- unsigned int no_short_slot_time_set:1;
- unsigned int no_short_preamble_set:1;
- unsigned int no_ht_gf_set:1;
- unsigned int no_ht_set:1;
- unsigned int ht_20mhz_set:1;
- unsigned int no_p2p_set:1;
-
- u16 auth_alg;
- u8 previous_ap[6];
-
- enum {
- STA_NULLFUNC = 0, STA_DISASSOC, STA_DEAUTH, STA_REMOVE
- } timeout_next;
-
- /* IEEE 802.1X related data */
- struct eapol_state_machine *eapol_sm;
-
- /* IEEE 802.11f (IAPP) related data */
- struct ieee80211_mgmt *last_assoc_req;
-
- u32 acct_session_id_hi;
- u32 acct_session_id_lo;
- time_t acct_session_start;
- int acct_session_started;
- int acct_terminate_cause; /* Acct-Terminate-Cause */
- int acct_interim_interval; /* Acct-Interim-Interval */
-
- unsigned long last_rx_bytes;
- unsigned long last_tx_bytes;
- u32 acct_input_gigawords; /* Acct-Input-Gigawords */
- u32 acct_output_gigawords; /* Acct-Output-Gigawords */
-
- u8 *challenge; /* IEEE 802.11 Shared Key Authentication Challenge */
-
- struct wpa_state_machine *wpa_sm;
- struct rsn_preauth_interface *preauth_iface;
-
- struct hostapd_ssid *ssid; /* SSID selection based on (Re)AssocReq */
- struct hostapd_ssid *ssid_probe; /* SSID selection based on ProbeReq */
-
- int vlan_id;
-
- struct ieee80211_ht_capabilities *ht_capabilities;
-
-#ifdef CONFIG_IEEE80211W
- int sa_query_count; /* number of pending SA Query requests;
- * 0 = no SA Query in progress */
- int sa_query_timed_out;
- u8 *sa_query_trans_id; /* buffer of WLAN_SA_QUERY_TR_ID_LEN *
- * sa_query_count octets of pending SA Query
- * transaction identifiers */
- struct os_time sa_query_start;
-#endif /* CONFIG_IEEE80211W */
-
- struct wpabuf *wps_ie; /* WPS IE from (Re)Association Request */
- struct wpabuf *p2p_ie; /* P2P IE from (Re)Association Request */
-};
-
-
-/* Default value for maximum station inactivity. After AP_MAX_INACTIVITY has
- * passed since last received frame from the station, a nullfunc data frame is
- * sent to the station. If this frame is not acknowledged and no other frames
- * have been received, the station will be disassociated after
- * AP_DISASSOC_DELAY seconds. Similarily, the station will be deauthenticated
- * after AP_DEAUTH_DELAY seconds has passed after disassociation. */
-#define AP_MAX_INACTIVITY (5 * 60)
-#define AP_DISASSOC_DELAY (1)
-#define AP_DEAUTH_DELAY (1)
-/* Number of seconds to keep STA entry with Authenticated flag after it has
- * been disassociated. */
-#define AP_MAX_INACTIVITY_AFTER_DISASSOC (1 * 30)
-/* Number of seconds to keep STA entry after it has been deauthenticated. */
-#define AP_MAX_INACTIVITY_AFTER_DEAUTH (1 * 5)
-
-
-struct hostapd_data;
-
-int ap_for_each_sta(struct hostapd_data *hapd,
- int (*cb)(struct hostapd_data *hapd, struct sta_info *sta,
- void *ctx),
- void *ctx);
-struct sta_info * ap_get_sta(struct hostapd_data *hapd, const u8 *sta);
-void ap_sta_hash_add(struct hostapd_data *hapd, struct sta_info *sta);
-void ap_free_sta(struct hostapd_data *hapd, struct sta_info *sta);
-void ap_free_sta(struct hostapd_data *hapd, struct sta_info *sta);
-void hostapd_free_stas(struct hostapd_data *hapd);
-void ap_handle_timer(void *eloop_ctx, void *timeout_ctx);
-void ap_sta_session_timeout(struct hostapd_data *hapd, struct sta_info *sta,
- u32 session_timeout);
-void ap_sta_no_session_timeout(struct hostapd_data *hapd,
- struct sta_info *sta);
-struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr);
-void ap_sta_disassociate(struct hostapd_data *hapd, struct sta_info *sta,
- u16 reason);
-void ap_sta_deauthenticate(struct hostapd_data *hapd, struct sta_info *sta,
- u16 reason);
-int ap_sta_bind_vlan(struct hostapd_data *hapd, struct sta_info *sta,
- int old_vlanid);
-void ap_sta_start_sa_query(struct hostapd_data *hapd, struct sta_info *sta);
-void ap_sta_stop_sa_query(struct hostapd_data *hapd, struct sta_info *sta);
-int ap_check_sa_query_timeout(struct hostapd_data *hapd, struct sta_info *sta);
-void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta,
- const u8 *addr, u16 reason);
-
-void ap_sta_set_authorized(struct hostapd_data *hapd,
- struct sta_info *sta, int authorized);
-static inline int ap_sta_is_authorized(struct sta_info *sta)
-{
- return sta->flags & WLAN_STA_AUTHORIZED;
-}
-
-#endif /* STA_INFO_H */
diff --git a/hostapd-0.8/src/ap/tkip_countermeasures.c b/hostapd-0.8/src/ap/tkip_countermeasures.c
deleted file mode 100644
index 1925217..0000000
--- a/hostapd-0.8/src/ap/tkip_countermeasures.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * hostapd / TKIP countermeasures
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "common/ieee802_11_defs.h"
-#include "hostapd.h"
-#include "sta_info.h"
-#include "ap_mlme.h"
-#include "wpa_auth.h"
-#include "ap_drv_ops.h"
-#include "tkip_countermeasures.h"
-
-
-static void ieee80211_tkip_countermeasures_stop(void *eloop_ctx,
- void *timeout_ctx)
-{
- struct hostapd_data *hapd = eloop_ctx;
- hapd->tkip_countermeasures = 0;
- hostapd_drv_set_countermeasures(hapd, 0);
- hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "TKIP countermeasures ended");
-}
-
-
-static void ieee80211_tkip_countermeasures_start(struct hostapd_data *hapd)
-{
- struct sta_info *sta;
-
- hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO, "TKIP countermeasures initiated");
-
- wpa_auth_countermeasures_start(hapd->wpa_auth);
- hapd->tkip_countermeasures = 1;
- hostapd_drv_set_countermeasures(hapd, 1);
- wpa_gtk_rekey(hapd->wpa_auth);
- eloop_cancel_timeout(ieee80211_tkip_countermeasures_stop, hapd, NULL);
- eloop_register_timeout(60, 0, ieee80211_tkip_countermeasures_stop,
- hapd, NULL);
- for (sta = hapd->sta_list; sta != NULL; sta = sta->next) {
- hostapd_drv_sta_deauth(hapd, sta->addr,
- WLAN_REASON_MICHAEL_MIC_FAILURE);
- ap_sta_set_authorized(hapd, sta, 0);
- sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC);
- hostapd_drv_sta_remove(hapd, sta->addr);
- }
-}
-
-
-void michael_mic_failure(struct hostapd_data *hapd, const u8 *addr, int local)
-{
- time_t now;
-
- if (addr && local) {
- struct sta_info *sta = ap_get_sta(hapd, addr);
- if (sta != NULL) {
- wpa_auth_sta_local_mic_failure_report(sta->wpa_sm);
- hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_INFO,
- "Michael MIC failure detected in "
- "received frame");
- mlme_michaelmicfailure_indication(hapd, addr);
- } else {
- wpa_printf(MSG_DEBUG,
- "MLME-MICHAELMICFAILURE.indication "
- "for not associated STA (" MACSTR
- ") ignored", MAC2STR(addr));
- return;
- }
- }
-
- time(&now);
- if (now > hapd->michael_mic_failure + 60) {
- hapd->michael_mic_failures = 1;
- } else {
- hapd->michael_mic_failures++;
- if (hapd->michael_mic_failures > 1)
- ieee80211_tkip_countermeasures_start(hapd);
- }
- hapd->michael_mic_failure = now;
-}
diff --git a/hostapd-0.8/src/ap/tkip_countermeasures.h b/hostapd-0.8/src/ap/tkip_countermeasures.h
deleted file mode 100644
index 5a1afce..0000000
--- a/hostapd-0.8/src/ap/tkip_countermeasures.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * hostapd / TKIP countermeasures
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef TKIP_COUNTERMEASURES_H
-#define TKIP_COUNTERMEASURES_H
-
-void michael_mic_failure(struct hostapd_data *hapd, const u8 *addr, int local);
-
-#endif /* TKIP_COUNTERMEASURES_H */
diff --git a/hostapd-0.8/src/ap/utils.c b/hostapd-0.8/src/ap/utils.c
deleted file mode 100644
index 0ff48ae..0000000
--- a/hostapd-0.8/src/ap/utils.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * AP mode helper functions
- * Copyright (c) 2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "includes.h"
-
-#include "common.h"
-#include "common/ieee802_11_defs.h"
-#include "sta_info.h"
-#include "hostapd.h"
-
-
-int hostapd_register_probereq_cb(struct hostapd_data *hapd,
- int (*cb)(void *ctx, const u8 *sa,
- const u8 *ie, size_t ie_len),
- void *ctx)
-{
- struct hostapd_probereq_cb *n;
-
- n = os_realloc(hapd->probereq_cb, (hapd->num_probereq_cb + 1) *
- sizeof(struct hostapd_probereq_cb));
- if (n == NULL)
- return -1;
-
- hapd->probereq_cb = n;
- n = &hapd->probereq_cb[hapd->num_probereq_cb];
- hapd->num_probereq_cb++;
-
- n->cb = cb;
- n->ctx = ctx;
-
- return 0;
-}
-
-
-struct prune_data {
- struct hostapd_data *hapd;
- const u8 *addr;
-};
-
-static int prune_associations(struct hostapd_iface *iface, void *ctx)
-{
- struct prune_data *data = ctx;
- struct sta_info *osta;
- struct hostapd_data *ohapd;
- size_t j;
-
- for (j = 0; j < iface->num_bss; j++) {
- ohapd = iface->bss[j];
- if (ohapd == data->hapd)
- continue;
- osta = ap_get_sta(ohapd, data->addr);
- if (!osta)
- continue;
-
- ap_sta_disassociate(ohapd, osta, WLAN_REASON_UNSPECIFIED);
- }
-
- return 0;
-}
-
-/**
- * hostapd_prune_associations - Remove extraneous associations
- * @hapd: Pointer to BSS data for the most recent association
- * @addr: Associated STA address
- *
- * This function looks through all radios and BSS's for previous
- * (stale) associations of STA. If any are found they are removed.
- */
-void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr)
-{
- struct prune_data data;
- data.hapd = hapd;
- data.addr = addr;
- if (hapd->iface->for_each_interface)
- hapd->iface->for_each_interface(hapd->iface->interfaces,
- prune_associations, &data);
-}
diff --git a/hostapd-0.8/src/ap/vlan_init.c b/hostapd-0.8/src/ap/vlan_init.c
deleted file mode 100644
index f2f766f..0000000
--- a/hostapd-0.8/src/ap/vlan_init.c
+++ /dev/null
@@ -1,905 +0,0 @@
-/*
- * hostapd / VLAN initialization
- * Copyright 2003, Instant802 Networks, Inc.
- * Copyright 2005-2006, Devicescape Software, Inc.
- * Copyright (c) 2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "hostapd.h"
-#include "ap_config.h"
-#include "ap_drv_ops.h"
-#include "vlan_init.h"
-
-
-#ifdef CONFIG_FULL_DYNAMIC_VLAN
-
-#include
-#include
-#include
-#include
-#include
-
-#include "drivers/priv_netlink.h"
-#include "utils/eloop.h"
-
-
-struct full_dynamic_vlan {
- int s; /* socket on which to listen for new/removed interfaces. */
-};
-
-
-static int ifconfig_helper(const char *if_name, int up)
-{
- int fd;
- struct ifreq ifr;
-
- if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: socket(AF_INET,SOCK_STREAM) "
- "failed: %s", __func__, strerror(errno));
- return -1;
- }
-
- os_memset(&ifr, 0, sizeof(ifr));
- os_strlcpy(ifr.ifr_name, if_name, IFNAMSIZ);
-
- if (ioctl(fd, SIOCGIFFLAGS, &ifr) != 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: ioctl(SIOCGIFFLAGS) failed "
- "for interface %s: %s",
- __func__, if_name, strerror(errno));
- close(fd);
- return -1;
- }
-
- if (up)
- ifr.ifr_flags |= IFF_UP;
- else
- ifr.ifr_flags &= ~IFF_UP;
-
- if (ioctl(fd, SIOCSIFFLAGS, &ifr) != 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: ioctl(SIOCSIFFLAGS) failed "
- "for interface %s (up=%d): %s",
- __func__, if_name, up, strerror(errno));
- close(fd);
- return -1;
- }
-
- close(fd);
- return 0;
-}
-
-
-static int ifconfig_up(const char *if_name)
-{
- wpa_printf(MSG_DEBUG, "VLAN: Set interface %s up", if_name);
- return ifconfig_helper(if_name, 1);
-}
-
-
-static int ifconfig_down(const char *if_name)
-{
- wpa_printf(MSG_DEBUG, "VLAN: Set interface %s down", if_name);
- return ifconfig_helper(if_name, 0);
-}
-
-
-/*
- * These are only available in recent linux headers (without the leading
- * underscore).
- */
-#define _GET_VLAN_REALDEV_NAME_CMD 8
-#define _GET_VLAN_VID_CMD 9
-
-/* This value should be 256 ONLY. If it is something else, then hostapd
- * might crash!, as this value has been hard-coded in 2.4.x kernel
- * bridging code.
- */
-#define MAX_BR_PORTS 256
-
-static int br_delif(const char *br_name, const char *if_name)
-{
- int fd;
- struct ifreq ifr;
- unsigned long args[2];
- int if_index;
-
- wpa_printf(MSG_DEBUG, "VLAN: br_delif(%s, %s)", br_name, if_name);
- if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: socket(AF_INET,SOCK_STREAM) "
- "failed: %s", __func__, strerror(errno));
- return -1;
- }
-
- if_index = if_nametoindex(if_name);
-
- if (if_index == 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: Failure determining "
- "interface index for '%s'",
- __func__, if_name);
- close(fd);
- return -1;
- }
-
- args[0] = BRCTL_DEL_IF;
- args[1] = if_index;
-
- os_strlcpy(ifr.ifr_name, br_name, sizeof(ifr.ifr_name));
- ifr.ifr_data = (__caddr_t) args;
-
- if (ioctl(fd, SIOCDEVPRIVATE, &ifr) < 0 && errno != EINVAL) {
- /* No error if interface already removed. */
- wpa_printf(MSG_ERROR, "VLAN: %s: ioctl[SIOCDEVPRIVATE,"
- "BRCTL_DEL_IF] failed for br_name=%s if_name=%s: "
- "%s", __func__, br_name, if_name, strerror(errno));
- close(fd);
- return -1;
- }
-
- close(fd);
- return 0;
-}
-
-
-/*
- Add interface 'if_name' to the bridge 'br_name'
-
- returns -1 on error
- returns 1 if the interface is already part of the bridge
- returns 0 otherwise
-*/
-static int br_addif(const char *br_name, const char *if_name)
-{
- int fd;
- struct ifreq ifr;
- unsigned long args[2];
- int if_index;
-
- wpa_printf(MSG_DEBUG, "VLAN: br_addif(%s, %s)", br_name, if_name);
- if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: socket(AF_INET,SOCK_STREAM) "
- "failed: %s", __func__, strerror(errno));
- return -1;
- }
-
- if_index = if_nametoindex(if_name);
-
- if (if_index == 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: Failure determining "
- "interface index for '%s'",
- __func__, if_name);
- close(fd);
- return -1;
- }
-
- args[0] = BRCTL_ADD_IF;
- args[1] = if_index;
-
- os_strlcpy(ifr.ifr_name, br_name, sizeof(ifr.ifr_name));
- ifr.ifr_data = (__caddr_t) args;
-
- if (ioctl(fd, SIOCDEVPRIVATE, &ifr) < 0) {
- if (errno == EBUSY) {
- /* The interface is already added. */
- close(fd);
- return 1;
- }
-
- wpa_printf(MSG_ERROR, "VLAN: %s: ioctl[SIOCDEVPRIVATE,"
- "BRCTL_ADD_IF] failed for br_name=%s if_name=%s: "
- "%s", __func__, br_name, if_name, strerror(errno));
- close(fd);
- return -1;
- }
-
- close(fd);
- return 0;
-}
-
-
-static int br_delbr(const char *br_name)
-{
- int fd;
- unsigned long arg[2];
-
- wpa_printf(MSG_DEBUG, "VLAN: br_delbr(%s)", br_name);
- if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: socket(AF_INET,SOCK_STREAM) "
- "failed: %s", __func__, strerror(errno));
- return -1;
- }
-
- arg[0] = BRCTL_DEL_BRIDGE;
- arg[1] = (unsigned long) br_name;
-
- if (ioctl(fd, SIOCGIFBR, arg) < 0 && errno != ENXIO) {
- /* No error if bridge already removed. */
- wpa_printf(MSG_ERROR, "VLAN: %s: BRCTL_DEL_BRIDGE failed for "
- "%s: %s", __func__, br_name, strerror(errno));
- close(fd);
- return -1;
- }
-
- close(fd);
- return 0;
-}
-
-
-/*
- Add a bridge with the name 'br_name'.
-
- returns -1 on error
- returns 1 if the bridge already exists
- returns 0 otherwise
-*/
-static int br_addbr(const char *br_name)
-{
- int fd;
- unsigned long arg[4];
- struct ifreq ifr;
-
- wpa_printf(MSG_DEBUG, "VLAN: br_addbr(%s)", br_name);
- if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: socket(AF_INET,SOCK_STREAM) "
- "failed: %s", __func__, strerror(errno));
- return -1;
- }
-
- arg[0] = BRCTL_ADD_BRIDGE;
- arg[1] = (unsigned long) br_name;
-
- if (ioctl(fd, SIOCGIFBR, arg) < 0) {
- if (errno == EEXIST) {
- /* The bridge is already added. */
- close(fd);
- return 1;
- } else {
- wpa_printf(MSG_ERROR, "VLAN: %s: BRCTL_ADD_BRIDGE "
- "failed for %s: %s",
- __func__, br_name, strerror(errno));
- close(fd);
- return -1;
- }
- }
-
- /* Decrease forwarding delay to avoid EAPOL timeouts. */
- os_memset(&ifr, 0, sizeof(ifr));
- os_strlcpy(ifr.ifr_name, br_name, IFNAMSIZ);
- arg[0] = BRCTL_SET_BRIDGE_FORWARD_DELAY;
- arg[1] = 1;
- arg[2] = 0;
- arg[3] = 0;
- ifr.ifr_data = (char *) &arg;
- if (ioctl(fd, SIOCDEVPRIVATE, &ifr) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: "
- "BRCTL_SET_BRIDGE_FORWARD_DELAY (1 sec) failed for "
- "%s: %s", __func__, br_name, strerror(errno));
- /* Continue anyway */
- }
-
- close(fd);
- return 0;
-}
-
-
-static int br_getnumports(const char *br_name)
-{
- int fd;
- int i;
- int port_cnt = 0;
- unsigned long arg[4];
- int ifindices[MAX_BR_PORTS];
- struct ifreq ifr;
-
- if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: socket(AF_INET,SOCK_STREAM) "
- "failed: %s", __func__, strerror(errno));
- return -1;
- }
-
- arg[0] = BRCTL_GET_PORT_LIST;
- arg[1] = (unsigned long) ifindices;
- arg[2] = MAX_BR_PORTS;
- arg[3] = 0;
-
- os_memset(ifindices, 0, sizeof(ifindices));
- os_strlcpy(ifr.ifr_name, br_name, sizeof(ifr.ifr_name));
- ifr.ifr_data = (__caddr_t) arg;
-
- if (ioctl(fd, SIOCDEVPRIVATE, &ifr) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: BRCTL_GET_PORT_LIST "
- "failed for %s: %s",
- __func__, br_name, strerror(errno));
- close(fd);
- return -1;
- }
-
- for (i = 1; i < MAX_BR_PORTS; i++) {
- if (ifindices[i] > 0) {
- port_cnt++;
- }
- }
-
- close(fd);
- return port_cnt;
-}
-
-
-static int vlan_rem(const char *if_name)
-{
- int fd;
- struct vlan_ioctl_args if_request;
-
- wpa_printf(MSG_DEBUG, "VLAN: vlan_rem(%s)", if_name);
- if ((os_strlen(if_name) + 1) > sizeof(if_request.device1)) {
- wpa_printf(MSG_ERROR, "VLAN: Interface name too long: '%s'",
- if_name);
- return -1;
- }
-
- if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: socket(AF_INET,SOCK_STREAM) "
- "failed: %s", __func__, strerror(errno));
- return -1;
- }
-
- os_memset(&if_request, 0, sizeof(if_request));
-
- os_strlcpy(if_request.device1, if_name, sizeof(if_request.device1));
- if_request.cmd = DEL_VLAN_CMD;
-
- if (ioctl(fd, SIOCSIFVLAN, &if_request) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: DEL_VLAN_CMD failed for %s: "
- "%s", __func__, if_name, strerror(errno));
- close(fd);
- return -1;
- }
-
- close(fd);
- return 0;
-}
-
-
-/*
- Add a vlan interface with VLAN ID 'vid' and tagged interface
- 'if_name'.
-
- returns -1 on error
- returns 1 if the interface already exists
- returns 0 otherwise
-*/
-static int vlan_add(const char *if_name, int vid)
-{
- int fd;
- struct vlan_ioctl_args if_request;
-
- wpa_printf(MSG_DEBUG, "VLAN: vlan_add(if_name=%s, vid=%d)",
- if_name, vid);
- ifconfig_up(if_name);
-
- if ((os_strlen(if_name) + 1) > sizeof(if_request.device1)) {
- wpa_printf(MSG_ERROR, "VLAN: Interface name too long: '%s'",
- if_name);
- return -1;
- }
-
- if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: socket(AF_INET,SOCK_STREAM) "
- "failed: %s", __func__, strerror(errno));
- return -1;
- }
-
- os_memset(&if_request, 0, sizeof(if_request));
-
- /* Determine if a suitable vlan device already exists. */
-
- os_snprintf(if_request.device1, sizeof(if_request.device1), "vlan%d",
- vid);
-
- if_request.cmd = _GET_VLAN_VID_CMD;
-
- if (ioctl(fd, SIOCSIFVLAN, &if_request) == 0) {
-
- if (if_request.u.VID == vid) {
- if_request.cmd = _GET_VLAN_REALDEV_NAME_CMD;
-
- if (ioctl(fd, SIOCSIFVLAN, &if_request) == 0 &&
- os_strncmp(if_request.u.device2, if_name,
- sizeof(if_request.u.device2)) == 0) {
- close(fd);
- wpa_printf(MSG_DEBUG, "VLAN: vlan_add: "
- "if_name %s exists already",
- if_request.device1);
- return 1;
- }
- }
- }
-
- /* A suitable vlan device does not already exist, add one. */
-
- os_memset(&if_request, 0, sizeof(if_request));
- os_strlcpy(if_request.device1, if_name, sizeof(if_request.device1));
- if_request.u.VID = vid;
- if_request.cmd = ADD_VLAN_CMD;
-
- if (ioctl(fd, SIOCSIFVLAN, &if_request) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: ADD_VLAN_CMD failed for %s: "
- "%s",
- __func__, if_request.device1, strerror(errno));
- close(fd);
- return -1;
- }
-
- close(fd);
- return 0;
-}
-
-
-static int vlan_set_name_type(unsigned int name_type)
-{
- int fd;
- struct vlan_ioctl_args if_request;
-
- wpa_printf(MSG_DEBUG, "VLAN: vlan_set_name_type(name_type=%u)",
- name_type);
- if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: socket(AF_INET,SOCK_STREAM) "
- "failed: %s", __func__, strerror(errno));
- return -1;
- }
-
- os_memset(&if_request, 0, sizeof(if_request));
-
- if_request.u.name_type = name_type;
- if_request.cmd = SET_VLAN_NAME_TYPE_CMD;
- if (ioctl(fd, SIOCSIFVLAN, &if_request) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: SET_VLAN_NAME_TYPE_CMD "
- "name_type=%u failed: %s",
- __func__, name_type, strerror(errno));
- close(fd);
- return -1;
- }
-
- close(fd);
- return 0;
-}
-
-
-static void vlan_newlink(char *ifname, struct hostapd_data *hapd)
-{
- char vlan_ifname[IFNAMSIZ];
- char br_name[IFNAMSIZ];
- struct hostapd_vlan *vlan = hapd->conf->vlan;
- char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface;
-
- wpa_printf(MSG_DEBUG, "VLAN: vlan_newlink(%s)", ifname);
-
- while (vlan) {
- if (os_strcmp(ifname, vlan->ifname) == 0) {
-
- os_snprintf(br_name, sizeof(br_name), "brvlan%d",
- vlan->vlan_id);
-
- if (!br_addbr(br_name))
- vlan->clean |= DVLAN_CLEAN_BR;
-
- ifconfig_up(br_name);
-
- if (tagged_interface) {
-
- if (!vlan_add(tagged_interface, vlan->vlan_id))
- vlan->clean |= DVLAN_CLEAN_VLAN;
-
- os_snprintf(vlan_ifname, sizeof(vlan_ifname),
- "vlan%d", vlan->vlan_id);
-
- if (!br_addif(br_name, vlan_ifname))
- vlan->clean |= DVLAN_CLEAN_VLAN_PORT;
-
- ifconfig_up(vlan_ifname);
- }
-
- if (!br_addif(br_name, ifname))
- vlan->clean |= DVLAN_CLEAN_WLAN_PORT;
-
- ifconfig_up(ifname);
-
- break;
- }
- vlan = vlan->next;
- }
-}
-
-
-static void vlan_dellink(char *ifname, struct hostapd_data *hapd)
-{
- char vlan_ifname[IFNAMSIZ];
- char br_name[IFNAMSIZ];
- struct hostapd_vlan *first, *prev, *vlan = hapd->conf->vlan;
- char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface;
-
- wpa_printf(MSG_DEBUG, "VLAN: vlan_dellink(%s)", ifname);
-
- first = prev = vlan;
-
- while (vlan) {
- if (os_strcmp(ifname, vlan->ifname) == 0) {
- os_snprintf(br_name, sizeof(br_name), "brvlan%d",
- vlan->vlan_id);
-
- if (vlan->clean & DVLAN_CLEAN_WLAN_PORT)
- br_delif(br_name, vlan->ifname);
-
- if (tagged_interface) {
- os_snprintf(vlan_ifname, sizeof(vlan_ifname),
- "vlan%d", vlan->vlan_id);
- if (vlan->clean & DVLAN_CLEAN_VLAN_PORT)
- br_delif(br_name, vlan_ifname);
- ifconfig_down(vlan_ifname);
-
- if (vlan->clean & DVLAN_CLEAN_VLAN)
- vlan_rem(vlan_ifname);
- }
-
- if ((vlan->clean & DVLAN_CLEAN_BR) &&
- br_getnumports(br_name) == 0) {
- ifconfig_down(br_name);
- br_delbr(br_name);
- }
-
- if (vlan == first) {
- hapd->conf->vlan = vlan->next;
- } else {
- prev->next = vlan->next;
- }
- os_free(vlan);
-
- break;
- }
- prev = vlan;
- vlan = vlan->next;
- }
-}
-
-
-static void
-vlan_read_ifnames(struct nlmsghdr *h, size_t len, int del,
- struct hostapd_data *hapd)
-{
- struct ifinfomsg *ifi;
- int attrlen, nlmsg_len, rta_len;
- struct rtattr *attr;
-
- if (len < sizeof(*ifi))
- return;
-
- ifi = NLMSG_DATA(h);
-
- nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg));
-
- attrlen = h->nlmsg_len - nlmsg_len;
- if (attrlen < 0)
- return;
-
- attr = (struct rtattr *) (((char *) ifi) + nlmsg_len);
-
- rta_len = RTA_ALIGN(sizeof(struct rtattr));
- while (RTA_OK(attr, attrlen)) {
- char ifname[IFNAMSIZ + 1];
-
- if (attr->rta_type == IFLA_IFNAME) {
- int n = attr->rta_len - rta_len;
- if (n < 0)
- break;
-
- os_memset(ifname, 0, sizeof(ifname));
-
- if ((size_t) n > sizeof(ifname))
- n = sizeof(ifname);
- os_memcpy(ifname, ((char *) attr) + rta_len, n);
-
- if (del)
- vlan_dellink(ifname, hapd);
- else
- vlan_newlink(ifname, hapd);
- }
-
- attr = RTA_NEXT(attr, attrlen);
- }
-}
-
-
-static void vlan_event_receive(int sock, void *eloop_ctx, void *sock_ctx)
-{
- char buf[8192];
- int left;
- struct sockaddr_nl from;
- socklen_t fromlen;
- struct nlmsghdr *h;
- struct hostapd_data *hapd = eloop_ctx;
-
- fromlen = sizeof(from);
- left = recvfrom(sock, buf, sizeof(buf), MSG_DONTWAIT,
- (struct sockaddr *) &from, &fromlen);
- if (left < 0) {
- if (errno != EINTR && errno != EAGAIN)
- wpa_printf(MSG_ERROR, "VLAN: %s: recvfrom failed: %s",
- __func__, strerror(errno));
- return;
- }
-
- h = (struct nlmsghdr *) buf;
- while (left >= (int) sizeof(*h)) {
- int len, plen;
-
- len = h->nlmsg_len;
- plen = len - sizeof(*h);
- if (len > left || plen < 0) {
- wpa_printf(MSG_DEBUG, "VLAN: Malformed netlink "
- "message: len=%d left=%d plen=%d",
- len, left, plen);
- break;
- }
-
- switch (h->nlmsg_type) {
- case RTM_NEWLINK:
- vlan_read_ifnames(h, plen, 0, hapd);
- break;
- case RTM_DELLINK:
- vlan_read_ifnames(h, plen, 1, hapd);
- break;
- }
-
- len = NLMSG_ALIGN(len);
- left -= len;
- h = (struct nlmsghdr *) ((char *) h + len);
- }
-
- if (left > 0) {
- wpa_printf(MSG_DEBUG, "VLAN: %s: %d extra bytes in the end of "
- "netlink message", __func__, left);
- }
-}
-
-
-static struct full_dynamic_vlan *
-full_dynamic_vlan_init(struct hostapd_data *hapd)
-{
- struct sockaddr_nl local;
- struct full_dynamic_vlan *priv;
-
- priv = os_zalloc(sizeof(*priv));
- if (priv == NULL)
- return NULL;
-
- vlan_set_name_type(VLAN_NAME_TYPE_PLUS_VID_NO_PAD);
-
- priv->s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
- if (priv->s < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: socket(PF_NETLINK,SOCK_RAW,"
- "NETLINK_ROUTE) failed: %s",
- __func__, strerror(errno));
- os_free(priv);
- return NULL;
- }
-
- os_memset(&local, 0, sizeof(local));
- local.nl_family = AF_NETLINK;
- local.nl_groups = RTMGRP_LINK;
- if (bind(priv->s, (struct sockaddr *) &local, sizeof(local)) < 0) {
- wpa_printf(MSG_ERROR, "VLAN: %s: bind(netlink) failed: %s",
- __func__, strerror(errno));
- close(priv->s);
- os_free(priv);
- return NULL;
- }
-
- if (eloop_register_read_sock(priv->s, vlan_event_receive, hapd, NULL))
- {
- close(priv->s);
- os_free(priv);
- return NULL;
- }
-
- return priv;
-}
-
-
-static void full_dynamic_vlan_deinit(struct full_dynamic_vlan *priv)
-{
- if (priv == NULL)
- return;
- eloop_unregister_read_sock(priv->s);
- close(priv->s);
- os_free(priv);
-}
-#endif /* CONFIG_FULL_DYNAMIC_VLAN */
-
-
-int vlan_setup_encryption_dyn(struct hostapd_data *hapd,
- struct hostapd_ssid *mssid, const char *dyn_vlan)
-{
- int i;
-
- if (dyn_vlan == NULL)
- return 0;
-
- /* Static WEP keys are set here; IEEE 802.1X and WPA uses their own
- * functions for setting up dynamic broadcast keys. */
- for (i = 0; i < 4; i++) {
- if (mssid->wep.key[i] &&
- hostapd_drv_set_key(dyn_vlan, hapd, WPA_ALG_WEP, NULL, i,
- i == mssid->wep.idx, NULL, 0,
- mssid->wep.key[i], mssid->wep.len[i]))
- {
- wpa_printf(MSG_ERROR, "VLAN: Could not set WEP "
- "encryption for dynamic VLAN");
- return -1;
- }
- }
-
- return 0;
-}
-
-
-static int vlan_dynamic_add(struct hostapd_data *hapd,
- struct hostapd_vlan *vlan)
-{
- while (vlan) {
- if (vlan->vlan_id != VLAN_ID_WILDCARD) {
- if (hostapd_vlan_if_add(hapd, vlan->ifname)) {
- if (errno != EEXIST) {
- wpa_printf(MSG_ERROR, "VLAN: Could "
- "not add VLAN %s: %s",
- vlan->ifname,
- strerror(errno));
- return -1;
- }
- }
-#ifdef CONFIG_FULL_DYNAMIC_VLAN
- ifconfig_up(vlan->ifname);
-#endif /* CONFIG_FULL_DYNAMIC_VLAN */
- }
-
- vlan = vlan->next;
- }
-
- return 0;
-}
-
-
-static void vlan_dynamic_remove(struct hostapd_data *hapd,
- struct hostapd_vlan *vlan)
-{
- struct hostapd_vlan *next;
-
- while (vlan) {
- next = vlan->next;
-
- if (vlan->vlan_id != VLAN_ID_WILDCARD &&
- hostapd_vlan_if_remove(hapd, vlan->ifname)) {
- wpa_printf(MSG_ERROR, "VLAN: Could not remove VLAN "
- "iface: %s: %s",
- vlan->ifname, strerror(errno));
- }
-#ifdef CONFIG_FULL_DYNAMIC_VLAN
- if (vlan->clean)
- vlan_dellink(vlan->ifname, hapd);
-#endif /* CONFIG_FULL_DYNAMIC_VLAN */
-
- vlan = next;
- }
-}
-
-
-int vlan_init(struct hostapd_data *hapd)
-{
-#ifdef CONFIG_FULL_DYNAMIC_VLAN
- hapd->full_dynamic_vlan = full_dynamic_vlan_init(hapd);
-#endif /* CONFIG_FULL_DYNAMIC_VLAN */
-
- if (vlan_dynamic_add(hapd, hapd->conf->vlan))
- return -1;
-
- return 0;
-}
-
-
-void vlan_deinit(struct hostapd_data *hapd)
-{
- vlan_dynamic_remove(hapd, hapd->conf->vlan);
-
-#ifdef CONFIG_FULL_DYNAMIC_VLAN
- full_dynamic_vlan_deinit(hapd->full_dynamic_vlan);
-#endif /* CONFIG_FULL_DYNAMIC_VLAN */
-}
-
-
-struct hostapd_vlan * vlan_add_dynamic(struct hostapd_data *hapd,
- struct hostapd_vlan *vlan,
- int vlan_id)
-{
- struct hostapd_vlan *n;
- char *ifname, *pos;
-
- if (vlan == NULL || vlan_id <= 0 || vlan_id > MAX_VLAN_ID ||
- vlan->vlan_id != VLAN_ID_WILDCARD)
- return NULL;
-
- wpa_printf(MSG_DEBUG, "VLAN: %s(vlan_id=%d ifname=%s)",
- __func__, vlan_id, vlan->ifname);
- ifname = os_strdup(vlan->ifname);
- if (ifname == NULL)
- return NULL;
- pos = os_strchr(ifname, '#');
- if (pos == NULL) {
- os_free(ifname);
- return NULL;
- }
- *pos++ = '\0';
-
- n = os_zalloc(sizeof(*n));
- if (n == NULL) {
- os_free(ifname);
- return NULL;
- }
-
- n->vlan_id = vlan_id;
- n->dynamic_vlan = 1;
-
- os_snprintf(n->ifname, sizeof(n->ifname), "%s%d%s", ifname, vlan_id,
- pos);
- os_free(ifname);
-
- if (hostapd_vlan_if_add(hapd, n->ifname)) {
- os_free(n);
- return NULL;
- }
-
- n->next = hapd->conf->vlan;
- hapd->conf->vlan = n;
-
-#ifdef CONFIG_FULL_DYNAMIC_VLAN
- ifconfig_up(n->ifname);
-#endif /* CONFIG_FULL_DYNAMIC_VLAN */
-
- return n;
-}
-
-
-int vlan_remove_dynamic(struct hostapd_data *hapd, int vlan_id)
-{
- struct hostapd_vlan *vlan;
-
- if (vlan_id <= 0 || vlan_id > MAX_VLAN_ID)
- return 1;
-
- wpa_printf(MSG_DEBUG, "VLAN: %s(vlan_id=%d)", __func__, vlan_id);
-
- vlan = hapd->conf->vlan;
- while (vlan) {
- if (vlan->vlan_id == vlan_id && vlan->dynamic_vlan > 0) {
- vlan->dynamic_vlan--;
- break;
- }
- vlan = vlan->next;
- }
-
- if (vlan == NULL)
- return 1;
-
- if (vlan->dynamic_vlan == 0)
- hostapd_vlan_if_remove(hapd, vlan->ifname);
-
- return 0;
-}
diff --git a/hostapd-0.8/src/ap/vlan_init.h b/hostapd-0.8/src/ap/vlan_init.h
deleted file mode 100644
index 382d5de..0000000
--- a/hostapd-0.8/src/ap/vlan_init.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * hostapd / VLAN initialization
- * Copyright 2003, Instant802 Networks, Inc.
- * Copyright 2005, Devicescape Software, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef VLAN_INIT_H
-#define VLAN_INIT_H
-
-#ifndef CONFIG_NO_VLAN
-int vlan_init(struct hostapd_data *hapd);
-void vlan_deinit(struct hostapd_data *hapd);
-struct hostapd_vlan * vlan_add_dynamic(struct hostapd_data *hapd,
- struct hostapd_vlan *vlan,
- int vlan_id);
-int vlan_remove_dynamic(struct hostapd_data *hapd, int vlan_id);
-int vlan_setup_encryption_dyn(struct hostapd_data *hapd,
- struct hostapd_ssid *mssid,
- const char *dyn_vlan);
-#else /* CONFIG_NO_VLAN */
-static inline int vlan_init(struct hostapd_data *hapd)
-{
- return 0;
-}
-
-static inline void vlan_deinit(struct hostapd_data *hapd)
-{
-}
-
-static inline struct hostapd_vlan * vlan_add_dynamic(struct hostapd_data *hapd,
- struct hostapd_vlan *vlan,
- int vlan_id)
-{
- return NULL;
-}
-
-static inline int vlan_remove_dynamic(struct hostapd_data *hapd, int vlan_id)
-{
- return -1;
-}
-
-static inline int vlan_setup_encryption_dyn(struct hostapd_data *hapd,
- struct hostapd_ssid *mssid,
- const char *dyn_vlan)
-{
- return -1;
-}
-#endif /* CONFIG_NO_VLAN */
-
-#endif /* VLAN_INIT_H */
diff --git a/hostapd-0.8/src/ap/wmm.c b/hostapd-0.8/src/ap/wmm.c
deleted file mode 100644
index a6d9b89..0000000
--- a/hostapd-0.8/src/ap/wmm.c
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * hostapd / WMM (Wi-Fi Multimedia)
- * Copyright 2002-2003, Instant802 Networks, Inc.
- * Copyright 2005-2006, Devicescape Software, Inc.
- * Copyright (c) 2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "common/ieee802_11_defs.h"
-#include "common/ieee802_11_common.h"
-#include "hostapd.h"
-#include "ieee802_11.h"
-#include "sta_info.h"
-#include "ap_config.h"
-#include "ap_drv_ops.h"
-#include "wmm.h"
-
-
-/* TODO: maintain separate sequence and fragment numbers for each AC
- * TODO: IGMP snooping to track which multicasts to forward - and use QOS-DATA
- * if only WMM stations are receiving a certain group */
-
-
-static inline u8 wmm_aci_aifsn(int aifsn, int acm, int aci)
-{
- u8 ret;
- ret = (aifsn << WMM_AC_AIFNS_SHIFT) & WMM_AC_AIFSN_MASK;
- if (acm)
- ret |= WMM_AC_ACM;
- ret |= (aci << WMM_AC_ACI_SHIFT) & WMM_AC_ACI_MASK;
- return ret;
-}
-
-
-static inline u8 wmm_ecw(int ecwmin, int ecwmax)
-{
- return ((ecwmin << WMM_AC_ECWMIN_SHIFT) & WMM_AC_ECWMIN_MASK) |
- ((ecwmax << WMM_AC_ECWMAX_SHIFT) & WMM_AC_ECWMAX_MASK);
-}
-
-
-/*
- * Add WMM Parameter Element to Beacon, Probe Response, and (Re)Association
- * Response frames.
- */
-u8 * hostapd_eid_wmm(struct hostapd_data *hapd, u8 *eid)
-{
- u8 *pos = eid;
- struct wmm_parameter_element *wmm =
- (struct wmm_parameter_element *) (pos + 2);
- int e;
-
- if (!hapd->conf->wmm_enabled)
- return eid;
- eid[0] = WLAN_EID_VENDOR_SPECIFIC;
- wmm->oui[0] = 0x00;
- wmm->oui[1] = 0x50;
- wmm->oui[2] = 0xf2;
- wmm->oui_type = WMM_OUI_TYPE;
- wmm->oui_subtype = WMM_OUI_SUBTYPE_PARAMETER_ELEMENT;
- wmm->version = WMM_VERSION;
- wmm->qos_info = hapd->parameter_set_count & 0xf;
-
- if (hapd->conf->wmm_uapsd)
- wmm->qos_info |= 0x80;
-
- wmm->reserved = 0;
-
- /* fill in a parameter set record for each AC */
- for (e = 0; e < 4; e++) {
- struct wmm_ac_parameter *ac = &wmm->ac[e];
- struct hostapd_wmm_ac_params *acp =
- &hapd->iconf->wmm_ac_params[e];
-
- ac->aci_aifsn = wmm_aci_aifsn(acp->aifs,
- acp->admission_control_mandatory,
- e);
- ac->cw = wmm_ecw(acp->cwmin, acp->cwmax);
- ac->txop_limit = host_to_le16(acp->txop_limit);
- }
-
- pos = (u8 *) (wmm + 1);
- eid[1] = pos - eid - 2; /* element length */
-
- return pos;
-}
-
-
-/* This function is called when a station sends an association request with
- * WMM info element. The function returns zero on success or non-zero on any
- * error in WMM element. eid does not include Element ID and Length octets. */
-int hostapd_eid_wmm_valid(struct hostapd_data *hapd, const u8 *eid, size_t len)
-{
- struct wmm_information_element *wmm;
-
- wpa_hexdump(MSG_MSGDUMP, "WMM IE", eid, len);
-
- if (len < sizeof(struct wmm_information_element)) {
- wpa_printf(MSG_DEBUG, "Too short WMM IE (len=%lu)",
- (unsigned long) len);
- return -1;
- }
-
- wmm = (struct wmm_information_element *) eid;
- wpa_printf(MSG_DEBUG, "Validating WMM IE: OUI %02x:%02x:%02x "
- "OUI type %d OUI sub-type %d version %d QoS info 0x%x",
- wmm->oui[0], wmm->oui[1], wmm->oui[2], wmm->oui_type,
- wmm->oui_subtype, wmm->version, wmm->qos_info);
- if (wmm->oui_subtype != WMM_OUI_SUBTYPE_INFORMATION_ELEMENT ||
- wmm->version != WMM_VERSION) {
- wpa_printf(MSG_DEBUG, "Unsupported WMM IE Subtype/Version");
- return -1;
- }
-
- return 0;
-}
-
-
-static void wmm_send_action(struct hostapd_data *hapd, const u8 *addr,
- const struct wmm_tspec_element *tspec,
- u8 action_code, u8 dialogue_token, u8 status_code)
-{
- u8 buf[256];
- struct ieee80211_mgmt *m = (struct ieee80211_mgmt *) buf;
- struct wmm_tspec_element *t = (struct wmm_tspec_element *)
- m->u.action.u.wmm_action.variable;
- int len;
-
- hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "action response - reason %d", status_code);
- os_memset(buf, 0, sizeof(buf));
- m->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
- WLAN_FC_STYPE_ACTION);
- os_memcpy(m->da, addr, ETH_ALEN);
- os_memcpy(m->sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(m->bssid, hapd->own_addr, ETH_ALEN);
- m->u.action.category = WLAN_ACTION_WMM;
- m->u.action.u.wmm_action.action_code = action_code;
- m->u.action.u.wmm_action.dialog_token = dialogue_token;
- m->u.action.u.wmm_action.status_code = status_code;
- os_memcpy(t, tspec, sizeof(struct wmm_tspec_element));
- len = ((u8 *) (t + 1)) - buf;
-
- if (hostapd_drv_send_mlme(hapd, m, len) < 0)
- perror("wmm_send_action: send");
-}
-
-
-int wmm_process_tspec(struct wmm_tspec_element *tspec)
-{
- int medium_time, pps, duration;
- int up, psb, dir, tid;
- u16 val, surplus;
-
- up = (tspec->ts_info[1] >> 3) & 0x07;
- psb = (tspec->ts_info[1] >> 2) & 0x01;
- dir = (tspec->ts_info[0] >> 5) & 0x03;
- tid = (tspec->ts_info[0] >> 1) & 0x0f;
- wpa_printf(MSG_DEBUG, "WMM: TS Info: UP=%d PSB=%d Direction=%d TID=%d",
- up, psb, dir, tid);
- val = le_to_host16(tspec->nominal_msdu_size);
- wpa_printf(MSG_DEBUG, "WMM: Nominal MSDU Size: %d%s",
- val & 0x7fff, val & 0x8000 ? " (fixed)" : "");
- wpa_printf(MSG_DEBUG, "WMM: Mean Data Rate: %u bps",
- le_to_host32(tspec->mean_data_rate));
- wpa_printf(MSG_DEBUG, "WMM: Minimum PHY Rate: %u bps",
- le_to_host32(tspec->minimum_phy_rate));
- val = le_to_host16(tspec->surplus_bandwidth_allowance);
- wpa_printf(MSG_DEBUG, "WMM: Surplus Bandwidth Allowance: %u.%04u",
- val >> 13, 10000 * (val & 0x1fff) / 0x2000);
-
- val = le_to_host16(tspec->nominal_msdu_size);
- if (val == 0) {
- wpa_printf(MSG_DEBUG, "WMM: Invalid Nominal MSDU Size (0)");
- return WMM_ADDTS_STATUS_INVALID_PARAMETERS;
- }
- /* pps = Ceiling((Mean Data Rate / 8) / Nominal MSDU Size) */
- pps = ((le_to_host32(tspec->mean_data_rate) / 8) + val - 1) / val;
- wpa_printf(MSG_DEBUG, "WMM: Packets-per-second estimate for TSPEC: %d",
- pps);
-
- if (le_to_host32(tspec->minimum_phy_rate) < 1000000) {
- wpa_printf(MSG_DEBUG, "WMM: Too small Minimum PHY Rate");
- return WMM_ADDTS_STATUS_INVALID_PARAMETERS;
- }
-
- duration = (le_to_host16(tspec->nominal_msdu_size) & 0x7fff) * 8 /
- (le_to_host32(tspec->minimum_phy_rate) / 1000000) +
- 50 /* FIX: proper SIFS + ACK duration */;
-
- /* unsigned binary number with an implicit binary point after the
- * leftmost 3 bits, i.e., 0x2000 = 1.0 */
- surplus = le_to_host16(tspec->surplus_bandwidth_allowance);
- if (surplus <= 0x2000) {
- wpa_printf(MSG_DEBUG, "WMM: Surplus Bandwidth Allowance not "
- "greater than unity");
- return WMM_ADDTS_STATUS_INVALID_PARAMETERS;
- }
-
- medium_time = surplus * pps * duration / 0x2000;
- wpa_printf(MSG_DEBUG, "WMM: Estimated medium time: %u", medium_time);
-
- /*
- * TODO: store list of granted (and still active) TSPECs and check
- * whether there is available medium time for this request. For now,
- * just refuse requests that would by themselves take very large
- * portion of the available bandwidth.
- */
- if (medium_time > 750000) {
- wpa_printf(MSG_DEBUG, "WMM: Refuse TSPEC request for over "
- "75%% of available bandwidth");
- return WMM_ADDTS_STATUS_REFUSED;
- }
-
- /* Convert to 32 microseconds per second unit */
- tspec->medium_time = host_to_le16(medium_time / 32);
-
- return WMM_ADDTS_STATUS_ADMISSION_ACCEPTED;
-}
-
-
-static void wmm_addts_req(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt,
- struct wmm_tspec_element *tspec, size_t len)
-{
- const u8 *end = ((const u8 *) mgmt) + len;
- int res;
-
- if ((const u8 *) (tspec + 1) > end) {
- wpa_printf(MSG_DEBUG, "WMM: TSPEC overflow in ADDTS Request");
- return;
- }
-
- wpa_printf(MSG_DEBUG, "WMM: ADDTS Request (Dialog Token %d) for TSPEC "
- "from " MACSTR,
- mgmt->u.action.u.wmm_action.dialog_token,
- MAC2STR(mgmt->sa));
-
- res = wmm_process_tspec(tspec);
- wpa_printf(MSG_DEBUG, "WMM: ADDTS processing result: %d", res);
-
- wmm_send_action(hapd, mgmt->sa, tspec, WMM_ACTION_CODE_ADDTS_RESP,
- mgmt->u.action.u.wmm_action.dialog_token, res);
-}
-
-
-void hostapd_wmm_action(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt, size_t len)
-{
- int action_code;
- int left = len - IEEE80211_HDRLEN - 4;
- const u8 *pos = ((const u8 *) mgmt) + IEEE80211_HDRLEN + 4;
- struct ieee802_11_elems elems;
- struct sta_info *sta = ap_get_sta(hapd, mgmt->sa);
-
- /* check that the request comes from a valid station */
- if (!sta ||
- (sta->flags & (WLAN_STA_ASSOC | WLAN_STA_WMM)) !=
- (WLAN_STA_ASSOC | WLAN_STA_WMM)) {
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "wmm action received is not from associated wmm"
- " station");
- /* TODO: respond with action frame refused status code */
- return;
- }
-
- /* extract the tspec info element */
- if (ieee802_11_parse_elems(pos, left, &elems, 1) == ParseFailed) {
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "hostapd_wmm_action - could not parse wmm "
- "action");
- /* TODO: respond with action frame invalid parameters status
- * code */
- return;
- }
-
- if (!elems.wmm_tspec ||
- elems.wmm_tspec_len != (sizeof(struct wmm_tspec_element) - 2)) {
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "hostapd_wmm_action - missing or wrong length "
- "tspec");
- /* TODO: respond with action frame invalid parameters status
- * code */
- return;
- }
-
- /* TODO: check the request is for an AC with ACM set, if not, refuse
- * request */
-
- action_code = mgmt->u.action.u.wmm_action.action_code;
- switch (action_code) {
- case WMM_ACTION_CODE_ADDTS_REQ:
- wmm_addts_req(hapd, mgmt, (struct wmm_tspec_element *)
- (elems.wmm_tspec - 2), len);
- return;
-#if 0
- /* TODO: needed for client implementation */
- case WMM_ACTION_CODE_ADDTS_RESP:
- wmm_setup_request(hapd, mgmt, len);
- return;
- /* TODO: handle station teardown requests */
- case WMM_ACTION_CODE_DELTS:
- wmm_teardown(hapd, mgmt, len);
- return;
-#endif
- }
-
- hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
- HOSTAPD_LEVEL_DEBUG,
- "hostapd_wmm_action - unknown action code %d",
- action_code);
-}
diff --git a/hostapd-0.8/src/ap/wmm.h b/hostapd-0.8/src/ap/wmm.h
deleted file mode 100644
index 96b04e8..0000000
--- a/hostapd-0.8/src/ap/wmm.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * hostapd / WMM (Wi-Fi Multimedia)
- * Copyright 2002-2003, Instant802 Networks, Inc.
- * Copyright 2005-2006, Devicescape Software, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef WME_H
-#define WME_H
-
-struct ieee80211_mgmt;
-struct wmm_tspec_element;
-
-u8 * hostapd_eid_wmm(struct hostapd_data *hapd, u8 *eid);
-int hostapd_eid_wmm_valid(struct hostapd_data *hapd, const u8 *eid,
- size_t len);
-void hostapd_wmm_action(struct hostapd_data *hapd,
- const struct ieee80211_mgmt *mgmt, size_t len);
-int wmm_process_tspec(struct wmm_tspec_element *tspec);
-
-#endif /* WME_H */
diff --git a/hostapd-0.8/src/ap/wpa_auth.c b/hostapd-0.8/src/ap/wpa_auth.c
deleted file mode 100644
index cfb2cad..0000000
--- a/hostapd-0.8/src/ap/wpa_auth.c
+++ /dev/null
@@ -1,2838 +0,0 @@
-/*
- * hostapd - IEEE 802.11i-2004 / WPA Authenticator
- * Copyright (c) 2004-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "utils/state_machine.h"
-#include "common/ieee802_11_defs.h"
-#include "crypto/aes_wrap.h"
-#include "crypto/crypto.h"
-#include "crypto/sha1.h"
-#include "crypto/sha256.h"
-#include "crypto/random.h"
-#include "eapol_auth/eapol_auth_sm.h"
-#include "ap_config.h"
-#include "ieee802_11.h"
-#include "wpa_auth.h"
-#include "pmksa_cache_auth.h"
-#include "wpa_auth_i.h"
-#include "wpa_auth_ie.h"
-
-#define STATE_MACHINE_DATA struct wpa_state_machine
-#define STATE_MACHINE_DEBUG_PREFIX "WPA"
-#define STATE_MACHINE_ADDR sm->addr
-
-
-static void wpa_send_eapol_timeout(void *eloop_ctx, void *timeout_ctx);
-static int wpa_sm_step(struct wpa_state_machine *sm);
-static int wpa_verify_key_mic(struct wpa_ptk *PTK, u8 *data, size_t data_len);
-static void wpa_sm_call_step(void *eloop_ctx, void *timeout_ctx);
-static void wpa_group_sm_step(struct wpa_authenticator *wpa_auth,
- struct wpa_group *group);
-static void wpa_request_new_ptk(struct wpa_state_machine *sm);
-static int wpa_gtk_update(struct wpa_authenticator *wpa_auth,
- struct wpa_group *group);
-static int wpa_group_config_group_keys(struct wpa_authenticator *wpa_auth,
- struct wpa_group *group);
-
-static const u32 dot11RSNAConfigGroupUpdateCount = 4;
-static const u32 dot11RSNAConfigPairwiseUpdateCount = 4;
-static const u32 eapol_key_timeout_first = 100; /* ms */
-static const u32 eapol_key_timeout_subseq = 1000; /* ms */
-
-/* TODO: make these configurable */
-static const int dot11RSNAConfigPMKLifetime = 43200;
-static const int dot11RSNAConfigPMKReauthThreshold = 70;
-static const int dot11RSNAConfigSATimeout = 60;
-
-
-static inline void wpa_auth_mic_failure_report(
- struct wpa_authenticator *wpa_auth, const u8 *addr)
-{
- if (wpa_auth->cb.mic_failure_report)
- wpa_auth->cb.mic_failure_report(wpa_auth->cb.ctx, addr);
-}
-
-
-static inline void wpa_auth_set_eapol(struct wpa_authenticator *wpa_auth,
- const u8 *addr, wpa_eapol_variable var,
- int value)
-{
- if (wpa_auth->cb.set_eapol)
- wpa_auth->cb.set_eapol(wpa_auth->cb.ctx, addr, var, value);
-}
-
-
-static inline int wpa_auth_get_eapol(struct wpa_authenticator *wpa_auth,
- const u8 *addr, wpa_eapol_variable var)
-{
- if (wpa_auth->cb.get_eapol == NULL)
- return -1;
- return wpa_auth->cb.get_eapol(wpa_auth->cb.ctx, addr, var);
-}
-
-
-static inline const u8 * wpa_auth_get_psk(struct wpa_authenticator *wpa_auth,
- const u8 *addr, const u8 *prev_psk)
-{
- if (wpa_auth->cb.get_psk == NULL)
- return NULL;
- return wpa_auth->cb.get_psk(wpa_auth->cb.ctx, addr, prev_psk);
-}
-
-
-static inline int wpa_auth_get_msk(struct wpa_authenticator *wpa_auth,
- const u8 *addr, u8 *msk, size_t *len)
-{
- if (wpa_auth->cb.get_msk == NULL)
- return -1;
- return wpa_auth->cb.get_msk(wpa_auth->cb.ctx, addr, msk, len);
-}
-
-
-static inline int wpa_auth_set_key(struct wpa_authenticator *wpa_auth,
- int vlan_id,
- enum wpa_alg alg, const u8 *addr, int idx,
- u8 *key, size_t key_len)
-{
- if (wpa_auth->cb.set_key == NULL)
- return -1;
- return wpa_auth->cb.set_key(wpa_auth->cb.ctx, vlan_id, alg, addr, idx,
- key, key_len);
-}
-
-
-static inline int wpa_auth_get_seqnum(struct wpa_authenticator *wpa_auth,
- const u8 *addr, int idx, u8 *seq)
-{
- if (wpa_auth->cb.get_seqnum == NULL)
- return -1;
- return wpa_auth->cb.get_seqnum(wpa_auth->cb.ctx, addr, idx, seq);
-}
-
-
-static inline int
-wpa_auth_send_eapol(struct wpa_authenticator *wpa_auth, const u8 *addr,
- const u8 *data, size_t data_len, int encrypt)
-{
- if (wpa_auth->cb.send_eapol == NULL)
- return -1;
- return wpa_auth->cb.send_eapol(wpa_auth->cb.ctx, addr, data, data_len,
- encrypt);
-}
-
-
-int wpa_auth_for_each_sta(struct wpa_authenticator *wpa_auth,
- int (*cb)(struct wpa_state_machine *sm, void *ctx),
- void *cb_ctx)
-{
- if (wpa_auth->cb.for_each_sta == NULL)
- return 0;
- return wpa_auth->cb.for_each_sta(wpa_auth->cb.ctx, cb, cb_ctx);
-}
-
-
-int wpa_auth_for_each_auth(struct wpa_authenticator *wpa_auth,
- int (*cb)(struct wpa_authenticator *a, void *ctx),
- void *cb_ctx)
-{
- if (wpa_auth->cb.for_each_auth == NULL)
- return 0;
- return wpa_auth->cb.for_each_auth(wpa_auth->cb.ctx, cb, cb_ctx);
-}
-
-
-void wpa_auth_logger(struct wpa_authenticator *wpa_auth, const u8 *addr,
- logger_level level, const char *txt)
-{
- if (wpa_auth->cb.logger == NULL)
- return;
- wpa_auth->cb.logger(wpa_auth->cb.ctx, addr, level, txt);
-}
-
-
-void wpa_auth_vlogger(struct wpa_authenticator *wpa_auth, const u8 *addr,
- logger_level level, const char *fmt, ...)
-{
- char *format;
- int maxlen;
- va_list ap;
-
- if (wpa_auth->cb.logger == NULL)
- return;
-
- maxlen = os_strlen(fmt) + 100;
- format = os_malloc(maxlen);
- if (!format)
- return;
-
- va_start(ap, fmt);
- vsnprintf(format, maxlen, fmt, ap);
- va_end(ap);
-
- wpa_auth_logger(wpa_auth, addr, level, format);
-
- os_free(format);
-}
-
-
-static void wpa_sta_disconnect(struct wpa_authenticator *wpa_auth,
- const u8 *addr)
-{
- if (wpa_auth->cb.disconnect == NULL)
- return;
- wpa_auth->cb.disconnect(wpa_auth->cb.ctx, addr,
- WLAN_REASON_PREV_AUTH_NOT_VALID);
-}
-
-
-static int wpa_use_aes_cmac(struct wpa_state_machine *sm)
-{
- int ret = 0;
-#ifdef CONFIG_IEEE80211R
- if (wpa_key_mgmt_ft(sm->wpa_key_mgmt))
- ret = 1;
-#endif /* CONFIG_IEEE80211R */
-#ifdef CONFIG_IEEE80211W
- if (wpa_key_mgmt_sha256(sm->wpa_key_mgmt))
- ret = 1;
-#endif /* CONFIG_IEEE80211W */
- return ret;
-}
-
-
-static void wpa_rekey_gmk(void *eloop_ctx, void *timeout_ctx)
-{
- struct wpa_authenticator *wpa_auth = eloop_ctx;
-
- if (random_get_bytes(wpa_auth->group->GMK, WPA_GMK_LEN)) {
- wpa_printf(MSG_ERROR, "Failed to get random data for WPA "
- "initialization.");
- } else {
- wpa_auth_logger(wpa_auth, NULL, LOGGER_DEBUG, "GMK rekeyd");
- wpa_hexdump_key(MSG_DEBUG, "GMK",
- wpa_auth->group->GMK, WPA_GMK_LEN);
- }
-
- if (wpa_auth->conf.wpa_gmk_rekey) {
- eloop_register_timeout(wpa_auth->conf.wpa_gmk_rekey, 0,
- wpa_rekey_gmk, wpa_auth, NULL);
- }
-}
-
-
-static void wpa_rekey_gtk(void *eloop_ctx, void *timeout_ctx)
-{
- struct wpa_authenticator *wpa_auth = eloop_ctx;
- struct wpa_group *group;
-
- wpa_auth_logger(wpa_auth, NULL, LOGGER_DEBUG, "rekeying GTK");
- for (group = wpa_auth->group; group; group = group->next) {
- group->GTKReKey = TRUE;
- do {
- group->changed = FALSE;
- wpa_group_sm_step(wpa_auth, group);
- } while (group->changed);
- }
-
- if (wpa_auth->conf.wpa_group_rekey) {
- eloop_register_timeout(wpa_auth->conf.wpa_group_rekey,
- 0, wpa_rekey_gtk, wpa_auth, NULL);
- }
-}
-
-
-static void wpa_rekey_ptk(void *eloop_ctx, void *timeout_ctx)
-{
- struct wpa_authenticator *wpa_auth = eloop_ctx;
- struct wpa_state_machine *sm = timeout_ctx;
-
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, "rekeying PTK");
- wpa_request_new_ptk(sm);
- wpa_sm_step(sm);
-}
-
-
-static int wpa_auth_pmksa_clear_cb(struct wpa_state_machine *sm, void *ctx)
-{
- if (sm->pmksa == ctx)
- sm->pmksa = NULL;
- return 0;
-}
-
-
-static void wpa_auth_pmksa_free_cb(struct rsn_pmksa_cache_entry *entry,
- void *ctx)
-{
- struct wpa_authenticator *wpa_auth = ctx;
- wpa_auth_for_each_sta(wpa_auth, wpa_auth_pmksa_clear_cb, entry);
-}
-
-
-static void wpa_group_set_key_len(struct wpa_group *group, int cipher)
-{
- switch (cipher) {
- case WPA_CIPHER_CCMP:
- group->GTK_len = 16;
- break;
- case WPA_CIPHER_TKIP:
- group->GTK_len = 32;
- break;
- case WPA_CIPHER_WEP104:
- group->GTK_len = 13;
- break;
- case WPA_CIPHER_WEP40:
- group->GTK_len = 5;
- break;
- }
-}
-
-
-static int wpa_group_init_gmk_and_counter(struct wpa_authenticator *wpa_auth,
- struct wpa_group *group)
-{
- u8 buf[ETH_ALEN + 8 + sizeof(group)];
- u8 rkey[32];
-
- if (random_get_bytes(group->GMK, WPA_GMK_LEN) < 0)
- return -1;
- wpa_hexdump_key(MSG_DEBUG, "GMK", group->GMK, WPA_GMK_LEN);
-
- /*
- * Counter = PRF-256(Random number, "Init Counter",
- * Local MAC Address || Time)
- */
- os_memcpy(buf, wpa_auth->addr, ETH_ALEN);
- wpa_get_ntp_timestamp(buf + ETH_ALEN);
- os_memcpy(buf + ETH_ALEN + 8, &group, sizeof(group));
- if (random_get_bytes(rkey, sizeof(rkey)) < 0)
- return -1;
-
- if (sha1_prf(rkey, sizeof(rkey), "Init Counter", buf, sizeof(buf),
- group->Counter, WPA_NONCE_LEN) < 0)
- return -1;
- wpa_hexdump_key(MSG_DEBUG, "Key Counter",
- group->Counter, WPA_NONCE_LEN);
-
- return 0;
-}
-
-
-static struct wpa_group * wpa_group_init(struct wpa_authenticator *wpa_auth,
- int vlan_id)
-{
- struct wpa_group *group;
-
- group = os_zalloc(sizeof(struct wpa_group));
- if (group == NULL)
- return NULL;
-
- group->GTKAuthenticator = TRUE;
- group->vlan_id = vlan_id;
-
- wpa_group_set_key_len(group, wpa_auth->conf.wpa_group);
-
- if (random_pool_ready() != 1) {
- wpa_printf(MSG_INFO, "WPA: Not enough entropy in random pool "
- "for secure operations - update keys later when "
- "the first station connects");
- }
-
- /*
- * Set initial GMK/Counter value here. The actual values that will be
- * used in negotiations will be set once the first station tries to
- * connect. This allows more time for collecting additional randomness
- * on embedded devices.
- */
- if (wpa_group_init_gmk_and_counter(wpa_auth, group) < 0) {
- wpa_printf(MSG_ERROR, "Failed to get random data for WPA "
- "initialization.");
- os_free(group);
- return NULL;
- }
-
- group->GInit = TRUE;
- wpa_group_sm_step(wpa_auth, group);
- group->GInit = FALSE;
- wpa_group_sm_step(wpa_auth, group);
-
- return group;
-}
-
-
-/**
- * wpa_init - Initialize WPA authenticator
- * @addr: Authenticator address
- * @conf: Configuration for WPA authenticator
- * @cb: Callback functions for WPA authenticator
- * Returns: Pointer to WPA authenticator data or %NULL on failure
- */
-struct wpa_authenticator * wpa_init(const u8 *addr,
- struct wpa_auth_config *conf,
- struct wpa_auth_callbacks *cb)
-{
- struct wpa_authenticator *wpa_auth;
-
- wpa_auth = os_zalloc(sizeof(struct wpa_authenticator));
- if (wpa_auth == NULL)
- return NULL;
- os_memcpy(wpa_auth->addr, addr, ETH_ALEN);
- os_memcpy(&wpa_auth->conf, conf, sizeof(*conf));
- os_memcpy(&wpa_auth->cb, cb, sizeof(*cb));
-
- if (wpa_auth_gen_wpa_ie(wpa_auth)) {
- wpa_printf(MSG_ERROR, "Could not generate WPA IE.");
- os_free(wpa_auth);
- return NULL;
- }
-
- wpa_auth->group = wpa_group_init(wpa_auth, 0);
- if (wpa_auth->group == NULL) {
- os_free(wpa_auth->wpa_ie);
- os_free(wpa_auth);
- return NULL;
- }
-
- wpa_auth->pmksa = pmksa_cache_auth_init(wpa_auth_pmksa_free_cb,
- wpa_auth);
- if (wpa_auth->pmksa == NULL) {
- wpa_printf(MSG_ERROR, "PMKSA cache initialization failed.");
- os_free(wpa_auth->wpa_ie);
- os_free(wpa_auth);
- return NULL;
- }
-
-#ifdef CONFIG_IEEE80211R
- wpa_auth->ft_pmk_cache = wpa_ft_pmk_cache_init();
- if (wpa_auth->ft_pmk_cache == NULL) {
- wpa_printf(MSG_ERROR, "FT PMK cache initialization failed.");
- os_free(wpa_auth->wpa_ie);
- pmksa_cache_auth_deinit(wpa_auth->pmksa);
- os_free(wpa_auth);
- return NULL;
- }
-#endif /* CONFIG_IEEE80211R */
-
- if (wpa_auth->conf.wpa_gmk_rekey) {
- eloop_register_timeout(wpa_auth->conf.wpa_gmk_rekey, 0,
- wpa_rekey_gmk, wpa_auth, NULL);
- }
-
- if (wpa_auth->conf.wpa_group_rekey) {
- eloop_register_timeout(wpa_auth->conf.wpa_group_rekey, 0,
- wpa_rekey_gtk, wpa_auth, NULL);
- }
-
- return wpa_auth;
-}
-
-
-/**
- * wpa_deinit - Deinitialize WPA authenticator
- * @wpa_auth: Pointer to WPA authenticator data from wpa_init()
- */
-void wpa_deinit(struct wpa_authenticator *wpa_auth)
-{
- struct wpa_group *group, *prev;
-
- eloop_cancel_timeout(wpa_rekey_gmk, wpa_auth, NULL);
- eloop_cancel_timeout(wpa_rekey_gtk, wpa_auth, NULL);
-
-#ifdef CONFIG_PEERKEY
- while (wpa_auth->stsl_negotiations)
- wpa_stsl_remove(wpa_auth, wpa_auth->stsl_negotiations);
-#endif /* CONFIG_PEERKEY */
-
- pmksa_cache_auth_deinit(wpa_auth->pmksa);
-
-#ifdef CONFIG_IEEE80211R
- wpa_ft_pmk_cache_deinit(wpa_auth->ft_pmk_cache);
- wpa_auth->ft_pmk_cache = NULL;
-#endif /* CONFIG_IEEE80211R */
-
- os_free(wpa_auth->wpa_ie);
-
- group = wpa_auth->group;
- while (group) {
- prev = group;
- group = group->next;
- os_free(prev);
- }
-
- os_free(wpa_auth);
-}
-
-
-/**
- * wpa_reconfig - Update WPA authenticator configuration
- * @wpa_auth: Pointer to WPA authenticator data from wpa_init()
- * @conf: Configuration for WPA authenticator
- */
-int wpa_reconfig(struct wpa_authenticator *wpa_auth,
- struct wpa_auth_config *conf)
-{
- struct wpa_group *group;
- if (wpa_auth == NULL)
- return 0;
-
- os_memcpy(&wpa_auth->conf, conf, sizeof(*conf));
- if (wpa_auth_gen_wpa_ie(wpa_auth)) {
- wpa_printf(MSG_ERROR, "Could not generate WPA IE.");
- return -1;
- }
-
- /*
- * Reinitialize GTK to make sure it is suitable for the new
- * configuration.
- */
- group = wpa_auth->group;
- wpa_group_set_key_len(group, wpa_auth->conf.wpa_group);
- group->GInit = TRUE;
- wpa_group_sm_step(wpa_auth, group);
- group->GInit = FALSE;
- wpa_group_sm_step(wpa_auth, group);
-
- return 0;
-}
-
-
-struct wpa_state_machine *
-wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr)
-{
- struct wpa_state_machine *sm;
-
- sm = os_zalloc(sizeof(struct wpa_state_machine));
- if (sm == NULL)
- return NULL;
- os_memcpy(sm->addr, addr, ETH_ALEN);
-
- sm->wpa_auth = wpa_auth;
- sm->group = wpa_auth->group;
-
- return sm;
-}
-
-
-int wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm)
-{
- if (wpa_auth == NULL || !wpa_auth->conf.wpa || sm == NULL)
- return -1;
-
-#ifdef CONFIG_IEEE80211R
- if (sm->ft_completed) {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
- "FT authentication already completed - do not "
- "start 4-way handshake");
- return 0;
- }
-#endif /* CONFIG_IEEE80211R */
-
- if (sm->started) {
- os_memset(&sm->key_replay, 0, sizeof(sm->key_replay));
- sm->ReAuthenticationRequest = TRUE;
- return wpa_sm_step(sm);
- }
-
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
- "start authentication");
- sm->started = 1;
-
- sm->Init = TRUE;
- if (wpa_sm_step(sm) == 1)
- return 1; /* should not really happen */
- sm->Init = FALSE;
- sm->AuthenticationRequest = TRUE;
- return wpa_sm_step(sm);
-}
-
-
-void wpa_auth_sta_no_wpa(struct wpa_state_machine *sm)
-{
- /* WPA/RSN was not used - clear WPA state. This is needed if the STA
- * reassociates back to the same AP while the previous entry for the
- * STA has not yet been removed. */
- if (sm == NULL)
- return;
-
- sm->wpa_key_mgmt = 0;
-}
-
-
-static void wpa_free_sta_sm(struct wpa_state_machine *sm)
-{
- if (sm->GUpdateStationKeys) {
- sm->group->GKeyDoneStations--;
- sm->GUpdateStationKeys = FALSE;
- }
-#ifdef CONFIG_IEEE80211R
- os_free(sm->assoc_resp_ftie);
-#endif /* CONFIG_IEEE80211R */
- os_free(sm->last_rx_eapol_key);
- os_free(sm->wpa_ie);
- os_free(sm);
-}
-
-
-void wpa_auth_sta_deinit(struct wpa_state_machine *sm)
-{
- if (sm == NULL)
- return;
-
- if (sm->wpa_auth->conf.wpa_strict_rekey && sm->has_GTK) {
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "strict rekeying - force GTK rekey since STA "
- "is leaving");
- eloop_cancel_timeout(wpa_rekey_gtk, sm->wpa_auth, NULL);
- eloop_register_timeout(0, 500000, wpa_rekey_gtk, sm->wpa_auth,
- NULL);
- }
-
- eloop_cancel_timeout(wpa_send_eapol_timeout, sm->wpa_auth, sm);
- sm->pending_1_of_4_timeout = 0;
- eloop_cancel_timeout(wpa_sm_call_step, sm, NULL);
- eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
- if (sm->in_step_loop) {
- /* Must not free state machine while wpa_sm_step() is running.
- * Freeing will be completed in the end of wpa_sm_step(). */
- wpa_printf(MSG_DEBUG, "WPA: Registering pending STA state "
- "machine deinit for " MACSTR, MAC2STR(sm->addr));
- sm->pending_deinit = 1;
- } else
- wpa_free_sta_sm(sm);
-}
-
-
-static void wpa_request_new_ptk(struct wpa_state_machine *sm)
-{
- if (sm == NULL)
- return;
-
- sm->PTKRequest = TRUE;
- sm->PTK_valid = 0;
-}
-
-
-static int wpa_replay_counter_valid(struct wpa_state_machine *sm,
- const u8 *replay_counter)
-{
- int i;
- for (i = 0; i < RSNA_MAX_EAPOL_RETRIES; i++) {
- if (!sm->key_replay[i].valid)
- break;
- if (os_memcmp(replay_counter, sm->key_replay[i].counter,
- WPA_REPLAY_COUNTER_LEN) == 0)
- return 1;
- }
- return 0;
-}
-
-
-#ifdef CONFIG_IEEE80211R
-static int ft_check_msg_2_of_4(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm,
- struct wpa_eapol_ie_parse *kde)
-{
- struct wpa_ie_data ie;
- struct rsn_mdie *mdie;
-
- if (wpa_parse_wpa_ie_rsn(kde->rsn_ie, kde->rsn_ie_len, &ie) < 0 ||
- ie.num_pmkid != 1 || ie.pmkid == NULL) {
- wpa_printf(MSG_DEBUG, "FT: No PMKR1Name in "
- "FT 4-way handshake message 2/4");
- return -1;
- }
-
- os_memcpy(sm->sup_pmk_r1_name, ie.pmkid, PMKID_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name from Supplicant",
- sm->sup_pmk_r1_name, PMKID_LEN);
-
- if (!kde->mdie || !kde->ftie) {
- wpa_printf(MSG_DEBUG, "FT: No %s in FT 4-way handshake "
- "message 2/4", kde->mdie ? "FTIE" : "MDIE");
- return -1;
- }
-
- mdie = (struct rsn_mdie *) (kde->mdie + 2);
- if (kde->mdie[1] < sizeof(struct rsn_mdie) ||
- os_memcmp(wpa_auth->conf.mobility_domain, mdie->mobility_domain,
- MOBILITY_DOMAIN_ID_LEN) != 0) {
- wpa_printf(MSG_DEBUG, "FT: MDIE mismatch");
- return -1;
- }
-
- if (sm->assoc_resp_ftie &&
- (kde->ftie[1] != sm->assoc_resp_ftie[1] ||
- os_memcmp(kde->ftie, sm->assoc_resp_ftie,
- 2 + sm->assoc_resp_ftie[1]) != 0)) {
- wpa_printf(MSG_DEBUG, "FT: FTIE mismatch");
- wpa_hexdump(MSG_DEBUG, "FT: FTIE in EAPOL-Key msg 2/4",
- kde->ftie, kde->ftie_len);
- wpa_hexdump(MSG_DEBUG, "FT: FTIE in (Re)AssocResp",
- sm->assoc_resp_ftie, 2 + sm->assoc_resp_ftie[1]);
- return -1;
- }
-
- return 0;
-}
-#endif /* CONFIG_IEEE80211R */
-
-
-void wpa_receive(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm,
- u8 *data, size_t data_len)
-{
- struct ieee802_1x_hdr *hdr;
- struct wpa_eapol_key *key;
- u16 key_info, key_data_length;
- enum { PAIRWISE_2, PAIRWISE_4, GROUP_2, REQUEST,
- SMK_M1, SMK_M3, SMK_ERROR } msg;
- char *msgtxt;
- struct wpa_eapol_ie_parse kde;
- int ft;
- const u8 *eapol_key_ie;
- size_t eapol_key_ie_len;
-
- if (wpa_auth == NULL || !wpa_auth->conf.wpa || sm == NULL)
- return;
-
- if (data_len < sizeof(*hdr) + sizeof(*key))
- return;
-
- hdr = (struct ieee802_1x_hdr *) data;
- key = (struct wpa_eapol_key *) (hdr + 1);
- key_info = WPA_GET_BE16(key->key_info);
- key_data_length = WPA_GET_BE16(key->key_data_length);
- if (key_data_length > data_len - sizeof(*hdr) - sizeof(*key)) {
- wpa_printf(MSG_INFO, "WPA: Invalid EAPOL-Key frame - "
- "key_data overflow (%d > %lu)",
- key_data_length,
- (unsigned long) (data_len - sizeof(*hdr) -
- sizeof(*key)));
- return;
- }
-
- if (sm->wpa == WPA_VERSION_WPA2) {
- if (key->type != EAPOL_KEY_TYPE_RSN) {
- wpa_printf(MSG_DEBUG, "Ignore EAPOL-Key with "
- "unexpected type %d in RSN mode",
- key->type);
- return;
- }
- } else {
- if (key->type != EAPOL_KEY_TYPE_WPA) {
- wpa_printf(MSG_DEBUG, "Ignore EAPOL-Key with "
- "unexpected type %d in WPA mode",
- key->type);
- return;
- }
- }
-
- wpa_hexdump(MSG_DEBUG, "WPA: Received Key Nonce", key->key_nonce,
- WPA_NONCE_LEN);
- wpa_hexdump(MSG_DEBUG, "WPA: Received Replay Counter",
- key->replay_counter, WPA_REPLAY_COUNTER_LEN);
-
- /* FIX: verify that the EAPOL-Key frame was encrypted if pairwise keys
- * are set */
-
- if ((key_info & (WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_REQUEST)) ==
- (WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_REQUEST)) {
- if (key_info & WPA_KEY_INFO_ERROR) {
- msg = SMK_ERROR;
- msgtxt = "SMK Error";
- } else {
- msg = SMK_M1;
- msgtxt = "SMK M1";
- }
- } else if (key_info & WPA_KEY_INFO_SMK_MESSAGE) {
- msg = SMK_M3;
- msgtxt = "SMK M3";
- } else if (key_info & WPA_KEY_INFO_REQUEST) {
- msg = REQUEST;
- msgtxt = "Request";
- } else if (!(key_info & WPA_KEY_INFO_KEY_TYPE)) {
- msg = GROUP_2;
- msgtxt = "2/2 Group";
- } else if (key_data_length == 0) {
- msg = PAIRWISE_4;
- msgtxt = "4/4 Pairwise";
- } else {
- msg = PAIRWISE_2;
- msgtxt = "2/4 Pairwise";
- }
-
- /* TODO: key_info type validation for PeerKey */
- if (msg == REQUEST || msg == PAIRWISE_2 || msg == PAIRWISE_4 ||
- msg == GROUP_2) {
- u16 ver = key_info & WPA_KEY_INFO_TYPE_MASK;
- if (sm->pairwise == WPA_CIPHER_CCMP) {
- if (wpa_use_aes_cmac(sm) &&
- ver != WPA_KEY_INFO_TYPE_AES_128_CMAC) {
- wpa_auth_logger(wpa_auth, sm->addr,
- LOGGER_WARNING,
- "advertised support for "
- "AES-128-CMAC, but did not "
- "use it");
- return;
- }
-
- if (!wpa_use_aes_cmac(sm) &&
- ver != WPA_KEY_INFO_TYPE_HMAC_SHA1_AES) {
- wpa_auth_logger(wpa_auth, sm->addr,
- LOGGER_WARNING,
- "did not use HMAC-SHA1-AES "
- "with CCMP");
- return;
- }
- }
- }
-
- if (key_info & WPA_KEY_INFO_REQUEST) {
- if (sm->req_replay_counter_used &&
- os_memcmp(key->replay_counter, sm->req_replay_counter,
- WPA_REPLAY_COUNTER_LEN) <= 0) {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_WARNING,
- "received EAPOL-Key request with "
- "replayed counter");
- return;
- }
- }
-
- if (!(key_info & WPA_KEY_INFO_REQUEST) &&
- !wpa_replay_counter_valid(sm, key->replay_counter)) {
- int i;
- wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
- "received EAPOL-Key %s with unexpected "
- "replay counter", msgtxt);
- for (i = 0; i < RSNA_MAX_EAPOL_RETRIES; i++) {
- if (!sm->key_replay[i].valid)
- break;
- wpa_hexdump(MSG_DEBUG, "pending replay counter",
- sm->key_replay[i].counter,
- WPA_REPLAY_COUNTER_LEN);
- }
- wpa_hexdump(MSG_DEBUG, "received replay counter",
- key->replay_counter, WPA_REPLAY_COUNTER_LEN);
- return;
- }
-
- switch (msg) {
- case PAIRWISE_2:
- if (sm->wpa_ptk_state != WPA_PTK_PTKSTART &&
- sm->wpa_ptk_state != WPA_PTK_PTKCALCNEGOTIATING) {
- wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
- "received EAPOL-Key msg 2/4 in "
- "invalid state (%d) - dropped",
- sm->wpa_ptk_state);
- return;
- }
- random_add_randomness(key->key_nonce, WPA_NONCE_LEN);
- if (sm->group->reject_4way_hs_for_entropy) {
- /*
- * The system did not have enough entropy to generate
- * strong random numbers. Reject the first 4-way
- * handshake(s) and collect some entropy based on the
- * information from it. Once enough entropy is
- * available, the next atempt will trigger GMK/Key
- * Counter update and the station will be allowed to
- * continue.
- */
- wpa_printf(MSG_DEBUG, "WPA: Reject 4-way handshake to "
- "collect more entropy for random number "
- "generation");
- sm->group->reject_4way_hs_for_entropy = FALSE;
- random_mark_pool_ready();
- sm->group->first_sta_seen = FALSE;
- wpa_sta_disconnect(wpa_auth, sm->addr);
- return;
- }
- if (wpa_parse_kde_ies((u8 *) (key + 1), key_data_length,
- &kde) < 0) {
- wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
- "received EAPOL-Key msg 2/4 with "
- "invalid Key Data contents");
- return;
- }
- if (kde.rsn_ie) {
- eapol_key_ie = kde.rsn_ie;
- eapol_key_ie_len = kde.rsn_ie_len;
- } else {
- eapol_key_ie = kde.wpa_ie;
- eapol_key_ie_len = kde.wpa_ie_len;
- }
- ft = sm->wpa == WPA_VERSION_WPA2 &&
- wpa_key_mgmt_ft(sm->wpa_key_mgmt);
- if (sm->wpa_ie == NULL ||
- wpa_compare_rsn_ie(ft,
- sm->wpa_ie, sm->wpa_ie_len,
- eapol_key_ie, eapol_key_ie_len)) {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
- "WPA IE from (Re)AssocReq did not "
- "match with msg 2/4");
- if (sm->wpa_ie) {
- wpa_hexdump(MSG_DEBUG, "WPA IE in AssocReq",
- sm->wpa_ie, sm->wpa_ie_len);
- }
- wpa_hexdump(MSG_DEBUG, "WPA IE in msg 2/4",
- eapol_key_ie, eapol_key_ie_len);
- /* MLME-DEAUTHENTICATE.request */
- wpa_sta_disconnect(wpa_auth, sm->addr);
- return;
- }
-#ifdef CONFIG_IEEE80211R
- if (ft && ft_check_msg_2_of_4(wpa_auth, sm, &kde) < 0) {
- wpa_sta_disconnect(wpa_auth, sm->addr);
- return;
- }
-#endif /* CONFIG_IEEE80211R */
- break;
- case PAIRWISE_4:
- if (sm->wpa_ptk_state != WPA_PTK_PTKINITNEGOTIATING ||
- !sm->PTK_valid) {
- wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
- "received EAPOL-Key msg 4/4 in "
- "invalid state (%d) - dropped",
- sm->wpa_ptk_state);
- return;
- }
- break;
- case GROUP_2:
- if (sm->wpa_ptk_group_state != WPA_PTK_GROUP_REKEYNEGOTIATING
- || !sm->PTK_valid) {
- wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
- "received EAPOL-Key msg 2/2 in "
- "invalid state (%d) - dropped",
- sm->wpa_ptk_group_state);
- return;
- }
- break;
-#ifdef CONFIG_PEERKEY
- case SMK_M1:
- case SMK_M3:
- case SMK_ERROR:
- if (!wpa_auth->conf.peerkey) {
- wpa_printf(MSG_DEBUG, "RSN: SMK M1/M3/Error, but "
- "PeerKey use disabled - ignoring message");
- return;
- }
- if (!sm->PTK_valid) {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
- "received EAPOL-Key msg SMK in "
- "invalid state - dropped");
- return;
- }
- break;
-#else /* CONFIG_PEERKEY */
- case SMK_M1:
- case SMK_M3:
- case SMK_ERROR:
- return; /* STSL disabled - ignore SMK messages */
-#endif /* CONFIG_PEERKEY */
- case REQUEST:
- break;
- }
-
- wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
- "received EAPOL-Key frame (%s)", msgtxt);
-
- if (key_info & WPA_KEY_INFO_ACK) {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
- "received invalid EAPOL-Key: Key Ack set");
- return;
- }
-
- if (!(key_info & WPA_KEY_INFO_MIC)) {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
- "received invalid EAPOL-Key: Key MIC not set");
- return;
- }
-
- sm->MICVerified = FALSE;
- if (sm->PTK_valid) {
- if (wpa_verify_key_mic(&sm->PTK, data, data_len)) {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
- "received EAPOL-Key with invalid MIC");
- return;
- }
- sm->MICVerified = TRUE;
- eloop_cancel_timeout(wpa_send_eapol_timeout, wpa_auth, sm);
- sm->pending_1_of_4_timeout = 0;
- }
-
- if (key_info & WPA_KEY_INFO_REQUEST) {
- if (sm->MICVerified) {
- sm->req_replay_counter_used = 1;
- os_memcpy(sm->req_replay_counter, key->replay_counter,
- WPA_REPLAY_COUNTER_LEN);
- } else {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
- "received EAPOL-Key request with "
- "invalid MIC");
- return;
- }
-
- /*
- * TODO: should decrypt key data field if encryption was used;
- * even though MAC address KDE is not normally encrypted,
- * supplicant is allowed to encrypt it.
- */
- if (msg == SMK_ERROR) {
-#ifdef CONFIG_PEERKEY
- wpa_smk_error(wpa_auth, sm, key);
-#endif /* CONFIG_PEERKEY */
- return;
- } else if (key_info & WPA_KEY_INFO_ERROR) {
- /* Supplicant reported a Michael MIC error */
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
- "received EAPOL-Key Error Request "
- "(STA detected Michael MIC failure)");
- wpa_auth_mic_failure_report(wpa_auth, sm->addr);
- sm->dot11RSNAStatsTKIPRemoteMICFailures++;
- wpa_auth->dot11RSNAStatsTKIPRemoteMICFailures++;
- /* Error report is not a request for a new key
- * handshake, but since Authenticator may do it, let's
- * change the keys now anyway. */
- wpa_request_new_ptk(sm);
- } else if (key_info & WPA_KEY_INFO_KEY_TYPE) {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
- "received EAPOL-Key Request for new "
- "4-Way Handshake");
- wpa_request_new_ptk(sm);
-#ifdef CONFIG_PEERKEY
- } else if (msg == SMK_M1) {
- wpa_smk_m1(wpa_auth, sm, key);
-#endif /* CONFIG_PEERKEY */
- } else if (key_data_length > 0 &&
- wpa_parse_kde_ies((const u8 *) (key + 1),
- key_data_length, &kde) == 0 &&
- kde.mac_addr) {
- } else {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
- "received EAPOL-Key Request for GTK "
- "rekeying");
- /* FIX: why was this triggering PTK rekeying for the
- * STA that requested Group Key rekeying?? */
- /* wpa_request_new_ptk(sta->wpa_sm); */
- eloop_cancel_timeout(wpa_rekey_gtk, wpa_auth, NULL);
- wpa_rekey_gtk(wpa_auth, NULL);
- }
- } else {
- /* Do not allow the same key replay counter to be reused. This
- * does also invalidate all other pending replay counters if
- * retransmissions were used, i.e., we will only process one of
- * the pending replies and ignore rest if more than one is
- * received. */
- sm->key_replay[0].valid = FALSE;
- }
-
-#ifdef CONFIG_PEERKEY
- if (msg == SMK_M3) {
- wpa_smk_m3(wpa_auth, sm, key);
- return;
- }
-#endif /* CONFIG_PEERKEY */
-
- os_free(sm->last_rx_eapol_key);
- sm->last_rx_eapol_key = os_malloc(data_len);
- if (sm->last_rx_eapol_key == NULL)
- return;
- os_memcpy(sm->last_rx_eapol_key, data, data_len);
- sm->last_rx_eapol_key_len = data_len;
-
- sm->EAPOLKeyReceived = TRUE;
- sm->EAPOLKeyPairwise = !!(key_info & WPA_KEY_INFO_KEY_TYPE);
- sm->EAPOLKeyRequest = !!(key_info & WPA_KEY_INFO_REQUEST);
- os_memcpy(sm->SNonce, key->key_nonce, WPA_NONCE_LEN);
- wpa_sm_step(sm);
-}
-
-
-static int wpa_gmk_to_gtk(const u8 *gmk, const char *label, const u8 *addr,
- const u8 *gnonce, u8 *gtk, size_t gtk_len)
-{
- u8 data[ETH_ALEN + WPA_NONCE_LEN + 8 + 16];
- u8 *pos;
- int ret = 0;
-
- /* GTK = PRF-X(GMK, "Group key expansion",
- * AA || GNonce || Time || random data)
- * The example described in the IEEE 802.11 standard uses only AA and
- * GNonce as inputs here. Add some more entropy since this derivation
- * is done only at the Authenticator and as such, does not need to be
- * exactly same.
- */
- os_memcpy(data, addr, ETH_ALEN);
- os_memcpy(data + ETH_ALEN, gnonce, WPA_NONCE_LEN);
- pos = data + ETH_ALEN + WPA_NONCE_LEN;
- wpa_get_ntp_timestamp(pos);
- pos += 8;
- if (random_get_bytes(pos, 16) < 0)
- ret = -1;
-
-#ifdef CONFIG_IEEE80211W
- sha256_prf(gmk, WPA_GMK_LEN, label, data, sizeof(data), gtk, gtk_len);
-#else /* CONFIG_IEEE80211W */
- if (sha1_prf(gmk, WPA_GMK_LEN, label, data, sizeof(data), gtk, gtk_len)
- < 0)
- ret = -1;
-#endif /* CONFIG_IEEE80211W */
-
- return ret;
-}
-
-
-static void wpa_send_eapol_timeout(void *eloop_ctx, void *timeout_ctx)
-{
- struct wpa_authenticator *wpa_auth = eloop_ctx;
- struct wpa_state_machine *sm = timeout_ctx;
-
- sm->pending_1_of_4_timeout = 0;
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, "EAPOL-Key timeout");
- sm->TimeoutEvt = TRUE;
- wpa_sm_step(sm);
-}
-
-
-void __wpa_send_eapol(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, int key_info,
- const u8 *key_rsc, const u8 *nonce,
- const u8 *kde, size_t kde_len,
- int keyidx, int encr, int force_version)
-{
- struct ieee802_1x_hdr *hdr;
- struct wpa_eapol_key *key;
- size_t len;
- int alg;
- int key_data_len, pad_len = 0;
- u8 *buf, *pos;
- int version, pairwise;
- int i;
-
- len = sizeof(struct ieee802_1x_hdr) + sizeof(struct wpa_eapol_key);
-
- if (force_version)
- version = force_version;
- else if (wpa_use_aes_cmac(sm))
- version = WPA_KEY_INFO_TYPE_AES_128_CMAC;
- else if (sm->pairwise == WPA_CIPHER_CCMP)
- version = WPA_KEY_INFO_TYPE_HMAC_SHA1_AES;
- else
- version = WPA_KEY_INFO_TYPE_HMAC_MD5_RC4;
-
- pairwise = key_info & WPA_KEY_INFO_KEY_TYPE;
-
- wpa_printf(MSG_DEBUG, "WPA: Send EAPOL(version=%d secure=%d mic=%d "
- "ack=%d install=%d pairwise=%d kde_len=%lu keyidx=%d "
- "encr=%d)",
- version,
- (key_info & WPA_KEY_INFO_SECURE) ? 1 : 0,
- (key_info & WPA_KEY_INFO_MIC) ? 1 : 0,
- (key_info & WPA_KEY_INFO_ACK) ? 1 : 0,
- (key_info & WPA_KEY_INFO_INSTALL) ? 1 : 0,
- pairwise, (unsigned long) kde_len, keyidx, encr);
-
- key_data_len = kde_len;
-
- if ((version == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES ||
- version == WPA_KEY_INFO_TYPE_AES_128_CMAC) && encr) {
- pad_len = key_data_len % 8;
- if (pad_len)
- pad_len = 8 - pad_len;
- key_data_len += pad_len + 8;
- }
-
- len += key_data_len;
-
- hdr = os_zalloc(len);
- if (hdr == NULL)
- return;
- hdr->version = wpa_auth->conf.eapol_version;
- hdr->type = IEEE802_1X_TYPE_EAPOL_KEY;
- hdr->length = host_to_be16(len - sizeof(*hdr));
- key = (struct wpa_eapol_key *) (hdr + 1);
-
- key->type = sm->wpa == WPA_VERSION_WPA2 ?
- EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
- key_info |= version;
- if (encr && sm->wpa == WPA_VERSION_WPA2)
- key_info |= WPA_KEY_INFO_ENCR_KEY_DATA;
- if (sm->wpa != WPA_VERSION_WPA2)
- key_info |= keyidx << WPA_KEY_INFO_KEY_INDEX_SHIFT;
- WPA_PUT_BE16(key->key_info, key_info);
-
- alg = pairwise ? sm->pairwise : wpa_auth->conf.wpa_group;
- switch (alg) {
- case WPA_CIPHER_CCMP:
- WPA_PUT_BE16(key->key_length, 16);
- break;
- case WPA_CIPHER_TKIP:
- WPA_PUT_BE16(key->key_length, 32);
- break;
- case WPA_CIPHER_WEP40:
- WPA_PUT_BE16(key->key_length, 5);
- break;
- case WPA_CIPHER_WEP104:
- WPA_PUT_BE16(key->key_length, 13);
- break;
- }
- if (key_info & WPA_KEY_INFO_SMK_MESSAGE)
- WPA_PUT_BE16(key->key_length, 0);
-
- /* FIX: STSL: what to use as key_replay_counter? */
- for (i = RSNA_MAX_EAPOL_RETRIES - 1; i > 0; i--) {
- sm->key_replay[i].valid = sm->key_replay[i - 1].valid;
- os_memcpy(sm->key_replay[i].counter,
- sm->key_replay[i - 1].counter,
- WPA_REPLAY_COUNTER_LEN);
- }
- inc_byte_array(sm->key_replay[0].counter, WPA_REPLAY_COUNTER_LEN);
- os_memcpy(key->replay_counter, sm->key_replay[0].counter,
- WPA_REPLAY_COUNTER_LEN);
- sm->key_replay[0].valid = TRUE;
-
- if (nonce)
- os_memcpy(key->key_nonce, nonce, WPA_NONCE_LEN);
-
- if (key_rsc)
- os_memcpy(key->key_rsc, key_rsc, WPA_KEY_RSC_LEN);
-
- if (kde && !encr) {
- os_memcpy(key + 1, kde, kde_len);
- WPA_PUT_BE16(key->key_data_length, kde_len);
- } else if (encr && kde) {
- buf = os_zalloc(key_data_len);
- if (buf == NULL) {
- os_free(hdr);
- return;
- }
- pos = buf;
- os_memcpy(pos, kde, kde_len);
- pos += kde_len;
-
- if (pad_len)
- *pos++ = 0xdd;
-
- wpa_hexdump_key(MSG_DEBUG, "Plaintext EAPOL-Key Key Data",
- buf, key_data_len);
- if (version == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES ||
- version == WPA_KEY_INFO_TYPE_AES_128_CMAC) {
- if (aes_wrap(sm->PTK.kek, (key_data_len - 8) / 8, buf,
- (u8 *) (key + 1))) {
- os_free(hdr);
- os_free(buf);
- return;
- }
- WPA_PUT_BE16(key->key_data_length, key_data_len);
- } else {
- u8 ek[32];
- os_memcpy(key->key_iv,
- sm->group->Counter + WPA_NONCE_LEN - 16, 16);
- inc_byte_array(sm->group->Counter, WPA_NONCE_LEN);
- os_memcpy(ek, key->key_iv, 16);
- os_memcpy(ek + 16, sm->PTK.kek, 16);
- os_memcpy(key + 1, buf, key_data_len);
- rc4_skip(ek, 32, 256, (u8 *) (key + 1), key_data_len);
- WPA_PUT_BE16(key->key_data_length, key_data_len);
- }
- os_free(buf);
- }
-
- if (key_info & WPA_KEY_INFO_MIC) {
- if (!sm->PTK_valid) {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
- "PTK not valid when sending EAPOL-Key "
- "frame");
- os_free(hdr);
- return;
- }
- wpa_eapol_key_mic(sm->PTK.kck, version, (u8 *) hdr, len,
- key->key_mic);
- }
-
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_inc_EapolFramesTx,
- 1);
- wpa_auth_send_eapol(wpa_auth, sm->addr, (u8 *) hdr, len,
- sm->pairwise_set);
- os_free(hdr);
-}
-
-
-static void wpa_send_eapol(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, int key_info,
- const u8 *key_rsc, const u8 *nonce,
- const u8 *kde, size_t kde_len,
- int keyidx, int encr)
-{
- int timeout_ms;
- int pairwise = key_info & WPA_KEY_INFO_KEY_TYPE;
- int ctr;
-
- if (sm == NULL)
- return;
-
- __wpa_send_eapol(wpa_auth, sm, key_info, key_rsc, nonce, kde, kde_len,
- keyidx, encr, 0);
-
- ctr = pairwise ? sm->TimeoutCtr : sm->GTimeoutCtr;
- if (ctr == 1 && wpa_auth->conf.tx_status)
- timeout_ms = eapol_key_timeout_first;
- else
- timeout_ms = eapol_key_timeout_subseq;
- if (pairwise && ctr == 1 && !(key_info & WPA_KEY_INFO_MIC))
- sm->pending_1_of_4_timeout = 1;
- wpa_printf(MSG_DEBUG, "WPA: Use EAPOL-Key timeout of %u ms (retry "
- "counter %d)", timeout_ms, ctr);
- eloop_register_timeout(timeout_ms / 1000, (timeout_ms % 1000) * 1000,
- wpa_send_eapol_timeout, wpa_auth, sm);
-}
-
-
-static int wpa_verify_key_mic(struct wpa_ptk *PTK, u8 *data, size_t data_len)
-{
- struct ieee802_1x_hdr *hdr;
- struct wpa_eapol_key *key;
- u16 key_info;
- int ret = 0;
- u8 mic[16];
-
- if (data_len < sizeof(*hdr) + sizeof(*key))
- return -1;
-
- hdr = (struct ieee802_1x_hdr *) data;
- key = (struct wpa_eapol_key *) (hdr + 1);
- key_info = WPA_GET_BE16(key->key_info);
- os_memcpy(mic, key->key_mic, 16);
- os_memset(key->key_mic, 0, 16);
- if (wpa_eapol_key_mic(PTK->kck, key_info & WPA_KEY_INFO_TYPE_MASK,
- data, data_len, key->key_mic) ||
- os_memcmp(mic, key->key_mic, 16) != 0)
- ret = -1;
- os_memcpy(key->key_mic, mic, 16);
- return ret;
-}
-
-
-void wpa_remove_ptk(struct wpa_state_machine *sm)
-{
- sm->PTK_valid = FALSE;
- os_memset(&sm->PTK, 0, sizeof(sm->PTK));
- wpa_auth_set_key(sm->wpa_auth, 0, WPA_ALG_NONE, sm->addr, 0, NULL, 0);
- sm->pairwise_set = FALSE;
- eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
-}
-
-
-int wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event)
-{
- int remove_ptk = 1;
-
- if (sm == NULL)
- return -1;
-
- wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "event %d notification", event);
-
- switch (event) {
- case WPA_AUTH:
- case WPA_ASSOC:
- break;
- case WPA_DEAUTH:
- case WPA_DISASSOC:
- sm->DeauthenticationRequest = TRUE;
- break;
- case WPA_REAUTH:
- case WPA_REAUTH_EAPOL:
- if (!sm->started) {
- /*
- * When using WPS, we may end up here if the STA
- * manages to re-associate without the previous STA
- * entry getting removed. Consequently, we need to make
- * sure that the WPA state machines gets initialized
- * properly at this point.
- */
- wpa_printf(MSG_DEBUG, "WPA state machine had not been "
- "started - initialize now");
- sm->started = 1;
- sm->Init = TRUE;
- if (wpa_sm_step(sm) == 1)
- return 1; /* should not really happen */
- sm->Init = FALSE;
- sm->AuthenticationRequest = TRUE;
- break;
- }
- if (sm->GUpdateStationKeys) {
- /*
- * Reauthentication cancels the pending group key
- * update for this STA.
- */
- sm->group->GKeyDoneStations--;
- sm->GUpdateStationKeys = FALSE;
- sm->PtkGroupInit = TRUE;
- }
- sm->ReAuthenticationRequest = TRUE;
- break;
- case WPA_ASSOC_FT:
-#ifdef CONFIG_IEEE80211R
- wpa_printf(MSG_DEBUG, "FT: Retry PTK configuration "
- "after association");
- wpa_ft_install_ptk(sm);
-
- /* Using FT protocol, not WPA auth state machine */
- sm->ft_completed = 1;
- return 0;
-#else /* CONFIG_IEEE80211R */
- break;
-#endif /* CONFIG_IEEE80211R */
- }
-
-#ifdef CONFIG_IEEE80211R
- sm->ft_completed = 0;
-#endif /* CONFIG_IEEE80211R */
-
-#ifdef CONFIG_IEEE80211W
- if (sm->mgmt_frame_prot && event == WPA_AUTH)
- remove_ptk = 0;
-#endif /* CONFIG_IEEE80211W */
-
- if (remove_ptk) {
- sm->PTK_valid = FALSE;
- os_memset(&sm->PTK, 0, sizeof(sm->PTK));
-
- if (event != WPA_REAUTH_EAPOL)
- wpa_remove_ptk(sm);
- }
-
- return wpa_sm_step(sm);
-}
-
-
-static enum wpa_alg wpa_alg_enum(int alg)
-{
- switch (alg) {
- case WPA_CIPHER_CCMP:
- return WPA_ALG_CCMP;
- case WPA_CIPHER_TKIP:
- return WPA_ALG_TKIP;
- case WPA_CIPHER_WEP104:
- case WPA_CIPHER_WEP40:
- return WPA_ALG_WEP;
- default:
- return WPA_ALG_NONE;
- }
-}
-
-
-SM_STATE(WPA_PTK, INITIALIZE)
-{
- SM_ENTRY_MA(WPA_PTK, INITIALIZE, wpa_ptk);
- if (sm->Init) {
- /* Init flag is not cleared here, so avoid busy
- * loop by claiming nothing changed. */
- sm->changed = FALSE;
- }
-
- sm->keycount = 0;
- if (sm->GUpdateStationKeys)
- sm->group->GKeyDoneStations--;
- sm->GUpdateStationKeys = FALSE;
- if (sm->wpa == WPA_VERSION_WPA)
- sm->PInitAKeys = FALSE;
- if (1 /* Unicast cipher supported AND (ESS OR ((IBSS or WDS) and
- * Local AA > Remote AA)) */) {
- sm->Pair = TRUE;
- }
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portEnabled, 0);
- wpa_remove_ptk(sm);
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portValid, 0);
- sm->TimeoutCtr = 0;
- if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
- WPA_EAPOL_authorized, 0);
- }
-}
-
-
-SM_STATE(WPA_PTK, DISCONNECT)
-{
- SM_ENTRY_MA(WPA_PTK, DISCONNECT, wpa_ptk);
- sm->Disconnect = FALSE;
- wpa_sta_disconnect(sm->wpa_auth, sm->addr);
-}
-
-
-SM_STATE(WPA_PTK, DISCONNECTED)
-{
- SM_ENTRY_MA(WPA_PTK, DISCONNECTED, wpa_ptk);
- sm->DeauthenticationRequest = FALSE;
-}
-
-
-SM_STATE(WPA_PTK, AUTHENTICATION)
-{
- SM_ENTRY_MA(WPA_PTK, AUTHENTICATION, wpa_ptk);
- os_memset(&sm->PTK, 0, sizeof(sm->PTK));
- sm->PTK_valid = FALSE;
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portControl_Auto,
- 1);
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portEnabled, 1);
- sm->AuthenticationRequest = FALSE;
-}
-
-
-static void wpa_group_first_station(struct wpa_authenticator *wpa_auth,
- struct wpa_group *group)
-{
- /*
- * System has run bit further than at the time hostapd was started
- * potentially very early during boot up. This provides better chances
- * of collecting more randomness on embedded systems. Re-initialize the
- * GMK and Counter here to improve their strength if there was not
- * enough entropy available immediately after system startup.
- */
- wpa_printf(MSG_DEBUG, "WPA: Re-initialize GMK/Counter on first "
- "station");
- if (random_pool_ready() != 1) {
- wpa_printf(MSG_INFO, "WPA: Not enough entropy in random pool "
- "to proceed - reject first 4-way handshake");
- group->reject_4way_hs_for_entropy = TRUE;
- }
- wpa_group_init_gmk_and_counter(wpa_auth, group);
- wpa_gtk_update(wpa_auth, group);
- wpa_group_config_group_keys(wpa_auth, group);
-}
-
-
-SM_STATE(WPA_PTK, AUTHENTICATION2)
-{
- SM_ENTRY_MA(WPA_PTK, AUTHENTICATION2, wpa_ptk);
-
- if (!sm->group->first_sta_seen) {
- wpa_group_first_station(sm->wpa_auth, sm->group);
- sm->group->first_sta_seen = TRUE;
- }
-
- os_memcpy(sm->ANonce, sm->group->Counter, WPA_NONCE_LEN);
- wpa_hexdump(MSG_DEBUG, "WPA: Assign ANonce", sm->ANonce,
- WPA_NONCE_LEN);
- inc_byte_array(sm->group->Counter, WPA_NONCE_LEN);
- sm->ReAuthenticationRequest = FALSE;
- /* IEEE 802.11i does not clear TimeoutCtr here, but this is more
- * logical place than INITIALIZE since AUTHENTICATION2 can be
- * re-entered on ReAuthenticationRequest without going through
- * INITIALIZE. */
- sm->TimeoutCtr = 0;
-}
-
-
-SM_STATE(WPA_PTK, INITPMK)
-{
- u8 msk[2 * PMK_LEN];
- size_t len = 2 * PMK_LEN;
-
- SM_ENTRY_MA(WPA_PTK, INITPMK, wpa_ptk);
-#ifdef CONFIG_IEEE80211R
- sm->xxkey_len = 0;
-#endif /* CONFIG_IEEE80211R */
- if (sm->pmksa) {
- wpa_printf(MSG_DEBUG, "WPA: PMK from PMKSA cache");
- os_memcpy(sm->PMK, sm->pmksa->pmk, PMK_LEN);
- } else if (wpa_auth_get_msk(sm->wpa_auth, sm->addr, msk, &len) == 0) {
- wpa_printf(MSG_DEBUG, "WPA: PMK from EAPOL state machine "
- "(len=%lu)", (unsigned long) len);
- os_memcpy(sm->PMK, msk, PMK_LEN);
-#ifdef CONFIG_IEEE80211R
- if (len >= 2 * PMK_LEN) {
- os_memcpy(sm->xxkey, msk + PMK_LEN, PMK_LEN);
- sm->xxkey_len = PMK_LEN;
- }
-#endif /* CONFIG_IEEE80211R */
- } else {
- wpa_printf(MSG_DEBUG, "WPA: Could not get PMK");
- }
-
- sm->req_replay_counter_used = 0;
- /* IEEE 802.11i does not set keyRun to FALSE, but not doing this
- * will break reauthentication since EAPOL state machines may not be
- * get into AUTHENTICATING state that clears keyRun before WPA state
- * machine enters AUTHENTICATION2 state and goes immediately to INITPMK
- * state and takes PMK from the previously used AAA Key. This will
- * eventually fail in 4-Way Handshake because Supplicant uses PMK
- * derived from the new AAA Key. Setting keyRun = FALSE here seems to
- * be good workaround for this issue. */
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyRun, 0);
-}
-
-
-SM_STATE(WPA_PTK, INITPSK)
-{
- const u8 *psk;
- SM_ENTRY_MA(WPA_PTK, INITPSK, wpa_ptk);
- psk = wpa_auth_get_psk(sm->wpa_auth, sm->addr, NULL);
- if (psk) {
- os_memcpy(sm->PMK, psk, PMK_LEN);
-#ifdef CONFIG_IEEE80211R
- os_memcpy(sm->xxkey, psk, PMK_LEN);
- sm->xxkey_len = PMK_LEN;
-#endif /* CONFIG_IEEE80211R */
- }
- sm->req_replay_counter_used = 0;
-}
-
-
-SM_STATE(WPA_PTK, PTKSTART)
-{
- u8 buf[2 + RSN_SELECTOR_LEN + PMKID_LEN], *pmkid = NULL;
- size_t pmkid_len = 0;
-
- SM_ENTRY_MA(WPA_PTK, PTKSTART, wpa_ptk);
- sm->PTKRequest = FALSE;
- sm->TimeoutEvt = FALSE;
-
- sm->TimeoutCtr++;
- if (sm->TimeoutCtr > (int) dot11RSNAConfigPairwiseUpdateCount) {
- /* No point in sending the EAPOL-Key - we will disconnect
- * immediately following this. */
- return;
- }
-
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "sending 1/4 msg of 4-Way Handshake");
- /*
- * TODO: Could add PMKID even with WPA2-PSK, but only if there is only
- * one possible PSK for this STA.
- */
- if (sm->wpa == WPA_VERSION_WPA2 &&
- wpa_key_mgmt_wpa_ieee8021x(sm->wpa_key_mgmt)) {
- pmkid = buf;
- pmkid_len = 2 + RSN_SELECTOR_LEN + PMKID_LEN;
- pmkid[0] = WLAN_EID_VENDOR_SPECIFIC;
- pmkid[1] = RSN_SELECTOR_LEN + PMKID_LEN;
- RSN_SELECTOR_PUT(&pmkid[2], RSN_KEY_DATA_PMKID);
- if (sm->pmksa)
- os_memcpy(&pmkid[2 + RSN_SELECTOR_LEN],
- sm->pmksa->pmkid, PMKID_LEN);
- else {
- /*
- * Calculate PMKID since no PMKSA cache entry was
- * available with pre-calculated PMKID.
- */
- rsn_pmkid(sm->PMK, PMK_LEN, sm->wpa_auth->addr,
- sm->addr, &pmkid[2 + RSN_SELECTOR_LEN],
- wpa_key_mgmt_sha256(sm->wpa_key_mgmt));
- }
- }
- wpa_send_eapol(sm->wpa_auth, sm,
- WPA_KEY_INFO_ACK | WPA_KEY_INFO_KEY_TYPE, NULL,
- sm->ANonce, pmkid, pmkid_len, 0, 0);
-}
-
-
-static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *pmk,
- struct wpa_ptk *ptk)
-{
- size_t ptk_len = sm->pairwise == WPA_CIPHER_CCMP ? 48 : 64;
-#ifdef CONFIG_IEEE80211R
- if (wpa_key_mgmt_ft(sm->wpa_key_mgmt))
- return wpa_auth_derive_ptk_ft(sm, pmk, ptk, ptk_len);
-#endif /* CONFIG_IEEE80211R */
-
- wpa_pmk_to_ptk(pmk, PMK_LEN, "Pairwise key expansion",
- sm->wpa_auth->addr, sm->addr, sm->ANonce, sm->SNonce,
- (u8 *) ptk, ptk_len,
- wpa_key_mgmt_sha256(sm->wpa_key_mgmt));
-
- return 0;
-}
-
-
-SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
-{
- struct wpa_ptk PTK;
- int ok = 0;
- const u8 *pmk = NULL;
-
- SM_ENTRY_MA(WPA_PTK, PTKCALCNEGOTIATING, wpa_ptk);
- sm->EAPOLKeyReceived = FALSE;
-
- /* WPA with IEEE 802.1X: use the derived PMK from EAP
- * WPA-PSK: iterate through possible PSKs and select the one matching
- * the packet */
- for (;;) {
- if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
- pmk = wpa_auth_get_psk(sm->wpa_auth, sm->addr, pmk);
- if (pmk == NULL)
- break;
- } else
- pmk = sm->PMK;
-
- wpa_derive_ptk(sm, pmk, &PTK);
-
- if (wpa_verify_key_mic(&PTK, sm->last_rx_eapol_key,
- sm->last_rx_eapol_key_len) == 0) {
- ok = 1;
- break;
- }
-
- if (!wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt))
- break;
- }
-
- if (!ok) {
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "invalid MIC in msg 2/4 of 4-Way Handshake");
- return;
- }
-
-#ifdef CONFIG_IEEE80211R
- if (sm->wpa == WPA_VERSION_WPA2 && wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
- /*
- * Verify that PMKR1Name from EAPOL-Key message 2/4 matches
- * with the value we derived.
- */
- if (os_memcmp(sm->sup_pmk_r1_name, sm->pmk_r1_name,
- WPA_PMK_NAME_LEN) != 0) {
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "PMKR1Name mismatch in FT 4-way "
- "handshake");
- wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name from "
- "Supplicant",
- sm->sup_pmk_r1_name, WPA_PMK_NAME_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: Derived PMKR1Name",
- sm->pmk_r1_name, WPA_PMK_NAME_LEN);
- return;
- }
- }
-#endif /* CONFIG_IEEE80211R */
-
- sm->pending_1_of_4_timeout = 0;
- eloop_cancel_timeout(wpa_send_eapol_timeout, sm->wpa_auth, sm);
-
- if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
- /* PSK may have changed from the previous choice, so update
- * state machine data based on whatever PSK was selected here.
- */
- os_memcpy(sm->PMK, pmk, PMK_LEN);
- }
-
- sm->MICVerified = TRUE;
-
- os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
- sm->PTK_valid = TRUE;
-}
-
-
-SM_STATE(WPA_PTK, PTKCALCNEGOTIATING2)
-{
- SM_ENTRY_MA(WPA_PTK, PTKCALCNEGOTIATING2, wpa_ptk);
- sm->TimeoutCtr = 0;
-}
-
-
-#ifdef CONFIG_IEEE80211W
-
-static int ieee80211w_kde_len(struct wpa_state_machine *sm)
-{
- if (sm->mgmt_frame_prot) {
- return 2 + RSN_SELECTOR_LEN + sizeof(struct wpa_igtk_kde);
- }
-
- return 0;
-}
-
-
-static u8 * ieee80211w_kde_add(struct wpa_state_machine *sm, u8 *pos)
-{
- struct wpa_igtk_kde igtk;
- struct wpa_group *gsm = sm->group;
-
- if (!sm->mgmt_frame_prot)
- return pos;
-
- igtk.keyid[0] = gsm->GN_igtk;
- igtk.keyid[1] = 0;
- if (gsm->wpa_group_state != WPA_GROUP_SETKEYSDONE ||
- wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN_igtk, igtk.pn) < 0)
- os_memset(igtk.pn, 0, sizeof(igtk.pn));
- os_memcpy(igtk.igtk, gsm->IGTK[gsm->GN_igtk - 4], WPA_IGTK_LEN);
- pos = wpa_add_kde(pos, RSN_KEY_DATA_IGTK,
- (const u8 *) &igtk, sizeof(igtk), NULL, 0);
-
- return pos;
-}
-
-#else /* CONFIG_IEEE80211W */
-
-static int ieee80211w_kde_len(struct wpa_state_machine *sm)
-{
- return 0;
-}
-
-
-static u8 * ieee80211w_kde_add(struct wpa_state_machine *sm, u8 *pos)
-{
- return pos;
-}
-
-#endif /* CONFIG_IEEE80211W */
-
-
-SM_STATE(WPA_PTK, PTKINITNEGOTIATING)
-{
- u8 rsc[WPA_KEY_RSC_LEN], *_rsc, *gtk, *kde, *pos;
- size_t gtk_len, kde_len;
- struct wpa_group *gsm = sm->group;
- u8 *wpa_ie;
- int wpa_ie_len, secure, keyidx, encr = 0;
-
- SM_ENTRY_MA(WPA_PTK, PTKINITNEGOTIATING, wpa_ptk);
- sm->TimeoutEvt = FALSE;
-
- sm->TimeoutCtr++;
- if (sm->TimeoutCtr > (int) dot11RSNAConfigPairwiseUpdateCount) {
- /* No point in sending the EAPOL-Key - we will disconnect
- * immediately following this. */
- return;
- }
-
- /* Send EAPOL(1, 1, 1, Pair, P, RSC, ANonce, MIC(PTK), RSNIE, [MDIE],
- GTK[GN], IGTK, [FTIE], [TIE * 2])
- */
- os_memset(rsc, 0, WPA_KEY_RSC_LEN);
- wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, rsc);
- /* If FT is used, wpa_auth->wpa_ie includes both RSNIE and MDIE */
- wpa_ie = sm->wpa_auth->wpa_ie;
- wpa_ie_len = sm->wpa_auth->wpa_ie_len;
- if (sm->wpa == WPA_VERSION_WPA &&
- (sm->wpa_auth->conf.wpa & WPA_PROTO_RSN) &&
- wpa_ie_len > wpa_ie[1] + 2 && wpa_ie[0] == WLAN_EID_RSN) {
- /* WPA-only STA, remove RSN IE */
- wpa_ie = wpa_ie + wpa_ie[1] + 2;
- wpa_ie_len = wpa_ie[1] + 2;
- }
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "sending 3/4 msg of 4-Way Handshake");
- if (sm->wpa == WPA_VERSION_WPA2) {
- /* WPA2 send GTK in the 4-way handshake */
- secure = 1;
- gtk = gsm->GTK[gsm->GN - 1];
- gtk_len = gsm->GTK_len;
- keyidx = gsm->GN;
- _rsc = rsc;
- encr = 1;
- } else {
- /* WPA does not include GTK in msg 3/4 */
- secure = 0;
- gtk = NULL;
- gtk_len = 0;
- keyidx = 0;
- _rsc = NULL;
- }
-
- kde_len = wpa_ie_len + ieee80211w_kde_len(sm);
- if (gtk)
- kde_len += 2 + RSN_SELECTOR_LEN + 2 + gtk_len;
-#ifdef CONFIG_IEEE80211R
- if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
- kde_len += 2 + PMKID_LEN; /* PMKR1Name into RSN IE */
- kde_len += 300; /* FTIE + 2 * TIE */
- }
-#endif /* CONFIG_IEEE80211R */
- kde = os_malloc(kde_len);
- if (kde == NULL)
- return;
-
- pos = kde;
- os_memcpy(pos, wpa_ie, wpa_ie_len);
- pos += wpa_ie_len;
-#ifdef CONFIG_IEEE80211R
- if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
- int res = wpa_insert_pmkid(kde, pos - kde, sm->pmk_r1_name);
- if (res < 0) {
- wpa_printf(MSG_ERROR, "FT: Failed to insert "
- "PMKR1Name into RSN IE in EAPOL-Key data");
- os_free(kde);
- return;
- }
- pos += res;
- }
-#endif /* CONFIG_IEEE80211R */
- if (gtk) {
- u8 hdr[2];
- hdr[0] = keyidx & 0x03;
- hdr[1] = 0;
- pos = wpa_add_kde(pos, RSN_KEY_DATA_GROUPKEY, hdr, 2,
- gtk, gtk_len);
- }
- pos = ieee80211w_kde_add(sm, pos);
-
-#ifdef CONFIG_IEEE80211R
- if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
- int res;
- struct wpa_auth_config *conf;
-
- conf = &sm->wpa_auth->conf;
- res = wpa_write_ftie(conf, conf->r0_key_holder,
- conf->r0_key_holder_len,
- NULL, NULL, pos, kde + kde_len - pos,
- NULL, 0);
- if (res < 0) {
- wpa_printf(MSG_ERROR, "FT: Failed to insert FTIE "
- "into EAPOL-Key Key Data");
- os_free(kde);
- return;
- }
- pos += res;
-
- /* TIE[ReassociationDeadline] (TU) */
- *pos++ = WLAN_EID_TIMEOUT_INTERVAL;
- *pos++ = 5;
- *pos++ = WLAN_TIMEOUT_REASSOC_DEADLINE;
- WPA_PUT_LE32(pos, conf->reassociation_deadline);
- pos += 4;
-
- /* TIE[KeyLifetime] (seconds) */
- *pos++ = WLAN_EID_TIMEOUT_INTERVAL;
- *pos++ = 5;
- *pos++ = WLAN_TIMEOUT_KEY_LIFETIME;
- WPA_PUT_LE32(pos, conf->r0_key_lifetime * 60);
- pos += 4;
- }
-#endif /* CONFIG_IEEE80211R */
-
- wpa_send_eapol(sm->wpa_auth, sm,
- (secure ? WPA_KEY_INFO_SECURE : 0) | WPA_KEY_INFO_MIC |
- WPA_KEY_INFO_ACK | WPA_KEY_INFO_INSTALL |
- WPA_KEY_INFO_KEY_TYPE,
- _rsc, sm->ANonce, kde, pos - kde, keyidx, encr);
- os_free(kde);
-}
-
-
-SM_STATE(WPA_PTK, PTKINITDONE)
-{
- SM_ENTRY_MA(WPA_PTK, PTKINITDONE, wpa_ptk);
- sm->EAPOLKeyReceived = FALSE;
- if (sm->Pair) {
- enum wpa_alg alg;
- int klen;
- if (sm->pairwise == WPA_CIPHER_TKIP) {
- alg = WPA_ALG_TKIP;
- klen = 32;
- } else {
- alg = WPA_ALG_CCMP;
- klen = 16;
- }
- if (wpa_auth_set_key(sm->wpa_auth, 0, alg, sm->addr, 0,
- sm->PTK.tk1, klen)) {
- wpa_sta_disconnect(sm->wpa_auth, sm->addr);
- return;
- }
- /* FIX: MLME-SetProtection.Request(TA, Tx_Rx) */
- sm->pairwise_set = TRUE;
-
- if (sm->wpa_auth->conf.wpa_ptk_rekey) {
- eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
- eloop_register_timeout(sm->wpa_auth->conf.
- wpa_ptk_rekey, 0, wpa_rekey_ptk,
- sm->wpa_auth, sm);
- }
-
- if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
- WPA_EAPOL_authorized, 1);
- }
- }
-
- if (0 /* IBSS == TRUE */) {
- sm->keycount++;
- if (sm->keycount == 2) {
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
- WPA_EAPOL_portValid, 1);
- }
- } else {
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portValid,
- 1);
- }
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyAvailable, 0);
- wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyDone, 1);
- if (sm->wpa == WPA_VERSION_WPA)
- sm->PInitAKeys = TRUE;
- else
- sm->has_GTK = TRUE;
- wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_INFO,
- "pairwise key handshake completed (%s)",
- sm->wpa == WPA_VERSION_WPA ? "WPA" : "RSN");
-
-#ifdef CONFIG_IEEE80211R
- wpa_ft_push_pmk_r1(sm->wpa_auth, sm->addr);
-#endif /* CONFIG_IEEE80211R */
-}
-
-
-SM_STEP(WPA_PTK)
-{
- struct wpa_authenticator *wpa_auth = sm->wpa_auth;
-
- if (sm->Init)
- SM_ENTER(WPA_PTK, INITIALIZE);
- else if (sm->Disconnect
- /* || FIX: dot11RSNAConfigSALifetime timeout */) {
- wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
- "WPA_PTK: sm->Disconnect");
- SM_ENTER(WPA_PTK, DISCONNECT);
- }
- else if (sm->DeauthenticationRequest)
- SM_ENTER(WPA_PTK, DISCONNECTED);
- else if (sm->AuthenticationRequest)
- SM_ENTER(WPA_PTK, AUTHENTICATION);
- else if (sm->ReAuthenticationRequest)
- SM_ENTER(WPA_PTK, AUTHENTICATION2);
- else if (sm->PTKRequest)
- SM_ENTER(WPA_PTK, PTKSTART);
- else switch (sm->wpa_ptk_state) {
- case WPA_PTK_INITIALIZE:
- break;
- case WPA_PTK_DISCONNECT:
- SM_ENTER(WPA_PTK, DISCONNECTED);
- break;
- case WPA_PTK_DISCONNECTED:
- SM_ENTER(WPA_PTK, INITIALIZE);
- break;
- case WPA_PTK_AUTHENTICATION:
- SM_ENTER(WPA_PTK, AUTHENTICATION2);
- break;
- case WPA_PTK_AUTHENTICATION2:
- if (wpa_key_mgmt_wpa_ieee8021x(sm->wpa_key_mgmt) &&
- wpa_auth_get_eapol(sm->wpa_auth, sm->addr,
- WPA_EAPOL_keyRun) > 0)
- SM_ENTER(WPA_PTK, INITPMK);
- else if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)
- /* FIX: && 802.1X::keyRun */)
- SM_ENTER(WPA_PTK, INITPSK);
- break;
- case WPA_PTK_INITPMK:
- if (wpa_auth_get_eapol(sm->wpa_auth, sm->addr,
- WPA_EAPOL_keyAvailable) > 0)
- SM_ENTER(WPA_PTK, PTKSTART);
- else {
- wpa_auth->dot11RSNA4WayHandshakeFailures++;
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_INFO,
- "INITPMK - keyAvailable = false");
- SM_ENTER(WPA_PTK, DISCONNECT);
- }
- break;
- case WPA_PTK_INITPSK:
- if (wpa_auth_get_psk(sm->wpa_auth, sm->addr, NULL))
- SM_ENTER(WPA_PTK, PTKSTART);
- else {
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_INFO,
- "no PSK configured for the STA");
- wpa_auth->dot11RSNA4WayHandshakeFailures++;
- SM_ENTER(WPA_PTK, DISCONNECT);
- }
- break;
- case WPA_PTK_PTKSTART:
- if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
- sm->EAPOLKeyPairwise)
- SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING);
- else if (sm->TimeoutCtr >
- (int) dot11RSNAConfigPairwiseUpdateCount) {
- wpa_auth->dot11RSNA4WayHandshakeFailures++;
- wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "PTKSTART: Retry limit %d reached",
- dot11RSNAConfigPairwiseUpdateCount);
- SM_ENTER(WPA_PTK, DISCONNECT);
- } else if (sm->TimeoutEvt)
- SM_ENTER(WPA_PTK, PTKSTART);
- break;
- case WPA_PTK_PTKCALCNEGOTIATING:
- if (sm->MICVerified)
- SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING2);
- else if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
- sm->EAPOLKeyPairwise)
- SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING);
- else if (sm->TimeoutEvt)
- SM_ENTER(WPA_PTK, PTKSTART);
- break;
- case WPA_PTK_PTKCALCNEGOTIATING2:
- SM_ENTER(WPA_PTK, PTKINITNEGOTIATING);
- break;
- case WPA_PTK_PTKINITNEGOTIATING:
- if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
- sm->EAPOLKeyPairwise && sm->MICVerified)
- SM_ENTER(WPA_PTK, PTKINITDONE);
- else if (sm->TimeoutCtr >
- (int) dot11RSNAConfigPairwiseUpdateCount) {
- wpa_auth->dot11RSNA4WayHandshakeFailures++;
- wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "PTKINITNEGOTIATING: Retry limit %d "
- "reached",
- dot11RSNAConfigPairwiseUpdateCount);
- SM_ENTER(WPA_PTK, DISCONNECT);
- } else if (sm->TimeoutEvt)
- SM_ENTER(WPA_PTK, PTKINITNEGOTIATING);
- break;
- case WPA_PTK_PTKINITDONE:
- break;
- }
-}
-
-
-SM_STATE(WPA_PTK_GROUP, IDLE)
-{
- SM_ENTRY_MA(WPA_PTK_GROUP, IDLE, wpa_ptk_group);
- if (sm->Init) {
- /* Init flag is not cleared here, so avoid busy
- * loop by claiming nothing changed. */
- sm->changed = FALSE;
- }
- sm->GTimeoutCtr = 0;
-}
-
-
-SM_STATE(WPA_PTK_GROUP, REKEYNEGOTIATING)
-{
- u8 rsc[WPA_KEY_RSC_LEN];
- struct wpa_group *gsm = sm->group;
- u8 *kde, *pos, hdr[2];
- size_t kde_len;
-
- SM_ENTRY_MA(WPA_PTK_GROUP, REKEYNEGOTIATING, wpa_ptk_group);
-
- sm->GTimeoutCtr++;
- if (sm->GTimeoutCtr > (int) dot11RSNAConfigGroupUpdateCount) {
- /* No point in sending the EAPOL-Key - we will disconnect
- * immediately following this. */
- return;
- }
-
- if (sm->wpa == WPA_VERSION_WPA)
- sm->PInitAKeys = FALSE;
- sm->TimeoutEvt = FALSE;
- /* Send EAPOL(1, 1, 1, !Pair, G, RSC, GNonce, MIC(PTK), GTK[GN]) */
- os_memset(rsc, 0, WPA_KEY_RSC_LEN);
- if (gsm->wpa_group_state == WPA_GROUP_SETKEYSDONE)
- wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, rsc);
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "sending 1/2 msg of Group Key Handshake");
-
- if (sm->wpa == WPA_VERSION_WPA2) {
- kde_len = 2 + RSN_SELECTOR_LEN + 2 + gsm->GTK_len +
- ieee80211w_kde_len(sm);
- kde = os_malloc(kde_len);
- if (kde == NULL)
- return;
-
- pos = kde;
- hdr[0] = gsm->GN & 0x03;
- hdr[1] = 0;
- pos = wpa_add_kde(pos, RSN_KEY_DATA_GROUPKEY, hdr, 2,
- gsm->GTK[gsm->GN - 1], gsm->GTK_len);
- pos = ieee80211w_kde_add(sm, pos);
- } else {
- kde = gsm->GTK[gsm->GN - 1];
- pos = kde + gsm->GTK_len;
- }
-
- wpa_send_eapol(sm->wpa_auth, sm,
- WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC |
- WPA_KEY_INFO_ACK |
- (!sm->Pair ? WPA_KEY_INFO_INSTALL : 0),
- rsc, gsm->GNonce, kde, pos - kde, gsm->GN, 1);
- if (sm->wpa == WPA_VERSION_WPA2)
- os_free(kde);
-}
-
-
-SM_STATE(WPA_PTK_GROUP, REKEYESTABLISHED)
-{
- SM_ENTRY_MA(WPA_PTK_GROUP, REKEYESTABLISHED, wpa_ptk_group);
- sm->EAPOLKeyReceived = FALSE;
- if (sm->GUpdateStationKeys)
- sm->group->GKeyDoneStations--;
- sm->GUpdateStationKeys = FALSE;
- sm->GTimeoutCtr = 0;
- /* FIX: MLME.SetProtection.Request(TA, Tx_Rx) */
- wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_INFO,
- "group key handshake completed (%s)",
- sm->wpa == WPA_VERSION_WPA ? "WPA" : "RSN");
- sm->has_GTK = TRUE;
-}
-
-
-SM_STATE(WPA_PTK_GROUP, KEYERROR)
-{
- SM_ENTRY_MA(WPA_PTK_GROUP, KEYERROR, wpa_ptk_group);
- if (sm->GUpdateStationKeys)
- sm->group->GKeyDoneStations--;
- sm->GUpdateStationKeys = FALSE;
- sm->Disconnect = TRUE;
-}
-
-
-SM_STEP(WPA_PTK_GROUP)
-{
- if (sm->Init || sm->PtkGroupInit) {
- SM_ENTER(WPA_PTK_GROUP, IDLE);
- sm->PtkGroupInit = FALSE;
- } else switch (sm->wpa_ptk_group_state) {
- case WPA_PTK_GROUP_IDLE:
- if (sm->GUpdateStationKeys ||
- (sm->wpa == WPA_VERSION_WPA && sm->PInitAKeys))
- SM_ENTER(WPA_PTK_GROUP, REKEYNEGOTIATING);
- break;
- case WPA_PTK_GROUP_REKEYNEGOTIATING:
- if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
- !sm->EAPOLKeyPairwise && sm->MICVerified)
- SM_ENTER(WPA_PTK_GROUP, REKEYESTABLISHED);
- else if (sm->GTimeoutCtr >
- (int) dot11RSNAConfigGroupUpdateCount)
- SM_ENTER(WPA_PTK_GROUP, KEYERROR);
- else if (sm->TimeoutEvt)
- SM_ENTER(WPA_PTK_GROUP, REKEYNEGOTIATING);
- break;
- case WPA_PTK_GROUP_KEYERROR:
- SM_ENTER(WPA_PTK_GROUP, IDLE);
- break;
- case WPA_PTK_GROUP_REKEYESTABLISHED:
- SM_ENTER(WPA_PTK_GROUP, IDLE);
- break;
- }
-}
-
-
-static int wpa_gtk_update(struct wpa_authenticator *wpa_auth,
- struct wpa_group *group)
-{
- int ret = 0;
-
- os_memcpy(group->GNonce, group->Counter, WPA_NONCE_LEN);
- inc_byte_array(group->Counter, WPA_NONCE_LEN);
- if (wpa_gmk_to_gtk(group->GMK, "Group key expansion",
- wpa_auth->addr, group->GNonce,
- group->GTK[group->GN - 1], group->GTK_len) < 0)
- ret = -1;
- wpa_hexdump_key(MSG_DEBUG, "GTK",
- group->GTK[group->GN - 1], group->GTK_len);
-
-#ifdef CONFIG_IEEE80211W
- if (wpa_auth->conf.ieee80211w != NO_MGMT_FRAME_PROTECTION) {
- os_memcpy(group->GNonce, group->Counter, WPA_NONCE_LEN);
- inc_byte_array(group->Counter, WPA_NONCE_LEN);
- if (wpa_gmk_to_gtk(group->GMK, "IGTK key expansion",
- wpa_auth->addr, group->GNonce,
- group->IGTK[group->GN_igtk - 4],
- WPA_IGTK_LEN) < 0)
- ret = -1;
- wpa_hexdump_key(MSG_DEBUG, "IGTK",
- group->IGTK[group->GN_igtk - 4], WPA_IGTK_LEN);
- }
-#endif /* CONFIG_IEEE80211W */
-
- return ret;
-}
-
-
-static void wpa_group_gtk_init(struct wpa_authenticator *wpa_auth,
- struct wpa_group *group)
-{
- wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
- "GTK_INIT (VLAN-ID %d)", group->vlan_id);
- group->changed = FALSE; /* GInit is not cleared here; avoid loop */
- group->wpa_group_state = WPA_GROUP_GTK_INIT;
-
- /* GTK[0..N] = 0 */
- os_memset(group->GTK, 0, sizeof(group->GTK));
- group->GN = 1;
- group->GM = 2;
-#ifdef CONFIG_IEEE80211W
- group->GN_igtk = 4;
- group->GM_igtk = 5;
-#endif /* CONFIG_IEEE80211W */
- /* GTK[GN] = CalcGTK() */
- wpa_gtk_update(wpa_auth, group);
-}
-
-
-static int wpa_group_update_sta(struct wpa_state_machine *sm, void *ctx)
-{
- if (sm->wpa_ptk_state != WPA_PTK_PTKINITDONE) {
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "Not in PTKINITDONE; skip Group Key update");
- sm->GUpdateStationKeys = FALSE;
- return 0;
- }
- if (sm->GUpdateStationKeys) {
- /*
- * This should not really happen, so add a debug log entry.
- * Since we clear the GKeyDoneStations before the loop, the
- * station needs to be counted here anyway.
- */
- wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
- "GUpdateStationKeys was already set when "
- "marking station for GTK rekeying");
- }
-
- sm->group->GKeyDoneStations++;
- sm->GUpdateStationKeys = TRUE;
-
- wpa_sm_step(sm);
- return 0;
-}
-
-
-static void wpa_group_setkeys(struct wpa_authenticator *wpa_auth,
- struct wpa_group *group)
-{
- int tmp;
-
- wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
- "SETKEYS (VLAN-ID %d)", group->vlan_id);
- group->changed = TRUE;
- group->wpa_group_state = WPA_GROUP_SETKEYS;
- group->GTKReKey = FALSE;
- tmp = group->GM;
- group->GM = group->GN;
- group->GN = tmp;
-#ifdef CONFIG_IEEE80211W
- tmp = group->GM_igtk;
- group->GM_igtk = group->GN_igtk;
- group->GN_igtk = tmp;
-#endif /* CONFIG_IEEE80211W */
- /* "GKeyDoneStations = GNoStations" is done in more robust way by
- * counting the STAs that are marked with GUpdateStationKeys instead of
- * including all STAs that could be in not-yet-completed state. */
- wpa_gtk_update(wpa_auth, group);
-
- if (group->GKeyDoneStations) {
- wpa_printf(MSG_DEBUG, "wpa_group_setkeys: Unexpected "
- "GKeyDoneStations=%d when starting new GTK rekey",
- group->GKeyDoneStations);
- group->GKeyDoneStations = 0;
- }
- wpa_auth_for_each_sta(wpa_auth, wpa_group_update_sta, NULL);
- wpa_printf(MSG_DEBUG, "wpa_group_setkeys: GKeyDoneStations=%d",
- group->GKeyDoneStations);
-}
-
-
-static int wpa_group_config_group_keys(struct wpa_authenticator *wpa_auth,
- struct wpa_group *group)
-{
- int ret = 0;
-
- if (wpa_auth_set_key(wpa_auth, group->vlan_id,
- wpa_alg_enum(wpa_auth->conf.wpa_group),
- broadcast_ether_addr, group->GN,
- group->GTK[group->GN - 1], group->GTK_len) < 0)
- ret = -1;
-
-#ifdef CONFIG_IEEE80211W
- if (wpa_auth->conf.ieee80211w != NO_MGMT_FRAME_PROTECTION &&
- wpa_auth_set_key(wpa_auth, group->vlan_id, WPA_ALG_IGTK,
- broadcast_ether_addr, group->GN_igtk,
- group->IGTK[group->GN_igtk - 4],
- WPA_IGTK_LEN) < 0)
- ret = -1;
-#endif /* CONFIG_IEEE80211W */
-
- return ret;
-}
-
-
-static int wpa_group_setkeysdone(struct wpa_authenticator *wpa_auth,
- struct wpa_group *group)
-{
- wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
- "SETKEYSDONE (VLAN-ID %d)", group->vlan_id);
- group->changed = TRUE;
- group->wpa_group_state = WPA_GROUP_SETKEYSDONE;
-
- if (wpa_group_config_group_keys(wpa_auth, group) < 0)
- return -1;
-
- return 0;
-}
-
-
-static void wpa_group_sm_step(struct wpa_authenticator *wpa_auth,
- struct wpa_group *group)
-{
- if (group->GInit) {
- wpa_group_gtk_init(wpa_auth, group);
- } else if (group->wpa_group_state == WPA_GROUP_GTK_INIT &&
- group->GTKAuthenticator) {
- wpa_group_setkeysdone(wpa_auth, group);
- } else if (group->wpa_group_state == WPA_GROUP_SETKEYSDONE &&
- group->GTKReKey) {
- wpa_group_setkeys(wpa_auth, group);
- } else if (group->wpa_group_state == WPA_GROUP_SETKEYS) {
- if (group->GKeyDoneStations == 0)
- wpa_group_setkeysdone(wpa_auth, group);
- else if (group->GTKReKey)
- wpa_group_setkeys(wpa_auth, group);
- }
-}
-
-
-static int wpa_sm_step(struct wpa_state_machine *sm)
-{
- if (sm == NULL)
- return 0;
-
- if (sm->in_step_loop) {
- /* This should not happen, but if it does, make sure we do not
- * end up freeing the state machine too early by exiting the
- * recursive call. */
- wpa_printf(MSG_ERROR, "WPA: wpa_sm_step() called recursively");
- return 0;
- }
-
- sm->in_step_loop = 1;
- do {
- if (sm->pending_deinit)
- break;
-
- sm->changed = FALSE;
- sm->wpa_auth->group->changed = FALSE;
-
- SM_STEP_RUN(WPA_PTK);
- if (sm->pending_deinit)
- break;
- SM_STEP_RUN(WPA_PTK_GROUP);
- if (sm->pending_deinit)
- break;
- wpa_group_sm_step(sm->wpa_auth, sm->group);
- } while (sm->changed || sm->wpa_auth->group->changed);
- sm->in_step_loop = 0;
-
- if (sm->pending_deinit) {
- wpa_printf(MSG_DEBUG, "WPA: Completing pending STA state "
- "machine deinit for " MACSTR, MAC2STR(sm->addr));
- wpa_free_sta_sm(sm);
- return 1;
- }
- return 0;
-}
-
-
-static void wpa_sm_call_step(void *eloop_ctx, void *timeout_ctx)
-{
- struct wpa_state_machine *sm = eloop_ctx;
- wpa_sm_step(sm);
-}
-
-
-void wpa_auth_sm_notify(struct wpa_state_machine *sm)
-{
- if (sm == NULL)
- return;
- eloop_register_timeout(0, 0, wpa_sm_call_step, sm, NULL);
-}
-
-
-void wpa_gtk_rekey(struct wpa_authenticator *wpa_auth)
-{
- int tmp, i;
- struct wpa_group *group;
-
- if (wpa_auth == NULL)
- return;
-
- group = wpa_auth->group;
-
- for (i = 0; i < 2; i++) {
- tmp = group->GM;
- group->GM = group->GN;
- group->GN = tmp;
-#ifdef CONFIG_IEEE80211W
- tmp = group->GM_igtk;
- group->GM_igtk = group->GN_igtk;
- group->GN_igtk = tmp;
-#endif /* CONFIG_IEEE80211W */
- wpa_gtk_update(wpa_auth, group);
- }
-}
-
-
-static const char * wpa_bool_txt(int bool)
-{
- return bool ? "TRUE" : "FALSE";
-}
-
-
-static int wpa_cipher_bits(int cipher)
-{
- switch (cipher) {
- case WPA_CIPHER_CCMP:
- return 128;
- case WPA_CIPHER_TKIP:
- return 256;
- case WPA_CIPHER_WEP104:
- return 104;
- case WPA_CIPHER_WEP40:
- return 40;
- default:
- return 0;
- }
-}
-
-
-#define RSN_SUITE "%02x-%02x-%02x-%d"
-#define RSN_SUITE_ARG(s) \
-((s) >> 24) & 0xff, ((s) >> 16) & 0xff, ((s) >> 8) & 0xff, (s) & 0xff
-
-int wpa_get_mib(struct wpa_authenticator *wpa_auth, char *buf, size_t buflen)
-{
- int len = 0, ret;
- char pmkid_txt[PMKID_LEN * 2 + 1];
-#ifdef CONFIG_RSN_PREAUTH
- const int preauth = 1;
-#else /* CONFIG_RSN_PREAUTH */
- const int preauth = 0;
-#endif /* CONFIG_RSN_PREAUTH */
-
- if (wpa_auth == NULL)
- return len;
-
- ret = os_snprintf(buf + len, buflen - len,
- "dot11RSNAOptionImplemented=TRUE\n"
- "dot11RSNAPreauthenticationImplemented=%s\n"
- "dot11RSNAEnabled=%s\n"
- "dot11RSNAPreauthenticationEnabled=%s\n",
- wpa_bool_txt(preauth),
- wpa_bool_txt(wpa_auth->conf.wpa & WPA_PROTO_RSN),
- wpa_bool_txt(wpa_auth->conf.rsn_preauth));
- if (ret < 0 || (size_t) ret >= buflen - len)
- return len;
- len += ret;
-
- wpa_snprintf_hex(pmkid_txt, sizeof(pmkid_txt),
- wpa_auth->dot11RSNAPMKIDUsed, PMKID_LEN);
-
- ret = os_snprintf(
- buf + len, buflen - len,
- "dot11RSNAConfigVersion=%u\n"
- "dot11RSNAConfigPairwiseKeysSupported=9999\n"
- /* FIX: dot11RSNAConfigGroupCipher */
- /* FIX: dot11RSNAConfigGroupRekeyMethod */
- /* FIX: dot11RSNAConfigGroupRekeyTime */
- /* FIX: dot11RSNAConfigGroupRekeyPackets */
- "dot11RSNAConfigGroupRekeyStrict=%u\n"
- "dot11RSNAConfigGroupUpdateCount=%u\n"
- "dot11RSNAConfigPairwiseUpdateCount=%u\n"
- "dot11RSNAConfigGroupCipherSize=%u\n"
- "dot11RSNAConfigPMKLifetime=%u\n"
- "dot11RSNAConfigPMKReauthThreshold=%u\n"
- "dot11RSNAConfigNumberOfPTKSAReplayCounters=0\n"
- "dot11RSNAConfigSATimeout=%u\n"
- "dot11RSNAAuthenticationSuiteSelected=" RSN_SUITE "\n"
- "dot11RSNAPairwiseCipherSelected=" RSN_SUITE "\n"
- "dot11RSNAGroupCipherSelected=" RSN_SUITE "\n"
- "dot11RSNAPMKIDUsed=%s\n"
- "dot11RSNAAuthenticationSuiteRequested=" RSN_SUITE "\n"
- "dot11RSNAPairwiseCipherRequested=" RSN_SUITE "\n"
- "dot11RSNAGroupCipherRequested=" RSN_SUITE "\n"
- "dot11RSNATKIPCounterMeasuresInvoked=%u\n"
- "dot11RSNA4WayHandshakeFailures=%u\n"
- "dot11RSNAConfigNumberOfGTKSAReplayCounters=0\n",
- RSN_VERSION,
- !!wpa_auth->conf.wpa_strict_rekey,
- dot11RSNAConfigGroupUpdateCount,
- dot11RSNAConfigPairwiseUpdateCount,
- wpa_cipher_bits(wpa_auth->conf.wpa_group),
- dot11RSNAConfigPMKLifetime,
- dot11RSNAConfigPMKReauthThreshold,
- dot11RSNAConfigSATimeout,
- RSN_SUITE_ARG(wpa_auth->dot11RSNAAuthenticationSuiteSelected),
- RSN_SUITE_ARG(wpa_auth->dot11RSNAPairwiseCipherSelected),
- RSN_SUITE_ARG(wpa_auth->dot11RSNAGroupCipherSelected),
- pmkid_txt,
- RSN_SUITE_ARG(wpa_auth->dot11RSNAAuthenticationSuiteRequested),
- RSN_SUITE_ARG(wpa_auth->dot11RSNAPairwiseCipherRequested),
- RSN_SUITE_ARG(wpa_auth->dot11RSNAGroupCipherRequested),
- wpa_auth->dot11RSNATKIPCounterMeasuresInvoked,
- wpa_auth->dot11RSNA4WayHandshakeFailures);
- if (ret < 0 || (size_t) ret >= buflen - len)
- return len;
- len += ret;
-
- /* TODO: dot11RSNAConfigPairwiseCiphersTable */
- /* TODO: dot11RSNAConfigAuthenticationSuitesTable */
-
- /* Private MIB */
- ret = os_snprintf(buf + len, buflen - len, "hostapdWPAGroupState=%d\n",
- wpa_auth->group->wpa_group_state);
- if (ret < 0 || (size_t) ret >= buflen - len)
- return len;
- len += ret;
-
- return len;
-}
-
-
-int wpa_get_mib_sta(struct wpa_state_machine *sm, char *buf, size_t buflen)
-{
- int len = 0, ret;
- u32 pairwise = 0;
-
- if (sm == NULL)
- return 0;
-
- /* TODO: FF-FF-FF-FF-FF-FF entry for broadcast/multicast stats */
-
- /* dot11RSNAStatsEntry */
-
- if (sm->wpa == WPA_VERSION_WPA) {
- if (sm->pairwise == WPA_CIPHER_CCMP)
- pairwise = WPA_CIPHER_SUITE_CCMP;
- else if (sm->pairwise == WPA_CIPHER_TKIP)
- pairwise = WPA_CIPHER_SUITE_TKIP;
- else if (sm->pairwise == WPA_CIPHER_WEP104)
- pairwise = WPA_CIPHER_SUITE_WEP104;
- else if (sm->pairwise == WPA_CIPHER_WEP40)
- pairwise = WPA_CIPHER_SUITE_WEP40;
- else if (sm->pairwise == WPA_CIPHER_NONE)
- pairwise = WPA_CIPHER_SUITE_NONE;
- } else if (sm->wpa == WPA_VERSION_WPA2) {
- if (sm->pairwise == WPA_CIPHER_CCMP)
- pairwise = RSN_CIPHER_SUITE_CCMP;
- else if (sm->pairwise == WPA_CIPHER_TKIP)
- pairwise = RSN_CIPHER_SUITE_TKIP;
- else if (sm->pairwise == WPA_CIPHER_WEP104)
- pairwise = RSN_CIPHER_SUITE_WEP104;
- else if (sm->pairwise == WPA_CIPHER_WEP40)
- pairwise = RSN_CIPHER_SUITE_WEP40;
- else if (sm->pairwise == WPA_CIPHER_NONE)
- pairwise = RSN_CIPHER_SUITE_NONE;
- } else
- return 0;
-
- ret = os_snprintf(
- buf + len, buflen - len,
- /* TODO: dot11RSNAStatsIndex */
- "dot11RSNAStatsSTAAddress=" MACSTR "\n"
- "dot11RSNAStatsVersion=1\n"
- "dot11RSNAStatsSelectedPairwiseCipher=" RSN_SUITE "\n"
- /* TODO: dot11RSNAStatsTKIPICVErrors */
- "dot11RSNAStatsTKIPLocalMICFailures=%u\n"
- "dot11RSNAStatsTKIPRemoteMICFailures=%u\n"
- /* TODO: dot11RSNAStatsCCMPReplays */
- /* TODO: dot11RSNAStatsCCMPDecryptErrors */
- /* TODO: dot11RSNAStatsTKIPReplays */,
- MAC2STR(sm->addr),
- RSN_SUITE_ARG(pairwise),
- sm->dot11RSNAStatsTKIPLocalMICFailures,
- sm->dot11RSNAStatsTKIPRemoteMICFailures);
- if (ret < 0 || (size_t) ret >= buflen - len)
- return len;
- len += ret;
-
- /* Private MIB */
- ret = os_snprintf(buf + len, buflen - len,
- "hostapdWPAPTKState=%d\n"
- "hostapdWPAPTKGroupState=%d\n",
- sm->wpa_ptk_state,
- sm->wpa_ptk_group_state);
- if (ret < 0 || (size_t) ret >= buflen - len)
- return len;
- len += ret;
-
- return len;
-}
-
-
-void wpa_auth_countermeasures_start(struct wpa_authenticator *wpa_auth)
-{
- if (wpa_auth)
- wpa_auth->dot11RSNATKIPCounterMeasuresInvoked++;
-}
-
-
-int wpa_auth_pairwise_set(struct wpa_state_machine *sm)
-{
- return sm && sm->pairwise_set;
-}
-
-
-int wpa_auth_get_pairwise(struct wpa_state_machine *sm)
-{
- return sm->pairwise;
-}
-
-
-int wpa_auth_sta_key_mgmt(struct wpa_state_machine *sm)
-{
- if (sm == NULL)
- return -1;
- return sm->wpa_key_mgmt;
-}
-
-
-int wpa_auth_sta_wpa_version(struct wpa_state_machine *sm)
-{
- if (sm == NULL)
- return 0;
- return sm->wpa;
-}
-
-
-int wpa_auth_sta_clear_pmksa(struct wpa_state_machine *sm,
- struct rsn_pmksa_cache_entry *entry)
-{
- if (sm == NULL || sm->pmksa != entry)
- return -1;
- sm->pmksa = NULL;
- return 0;
-}
-
-
-struct rsn_pmksa_cache_entry *
-wpa_auth_sta_get_pmksa(struct wpa_state_machine *sm)
-{
- return sm ? sm->pmksa : NULL;
-}
-
-
-void wpa_auth_sta_local_mic_failure_report(struct wpa_state_machine *sm)
-{
- if (sm)
- sm->dot11RSNAStatsTKIPLocalMICFailures++;
-}
-
-
-const u8 * wpa_auth_get_wpa_ie(struct wpa_authenticator *wpa_auth, size_t *len)
-{
- if (wpa_auth == NULL)
- return NULL;
- *len = wpa_auth->wpa_ie_len;
- return wpa_auth->wpa_ie;
-}
-
-
-int wpa_auth_pmksa_add(struct wpa_state_machine *sm, const u8 *pmk,
- int session_timeout, struct eapol_state_machine *eapol)
-{
- if (sm == NULL || sm->wpa != WPA_VERSION_WPA2)
- return -1;
-
- if (pmksa_cache_auth_add(sm->wpa_auth->pmksa, pmk, PMK_LEN,
- sm->wpa_auth->addr, sm->addr, session_timeout,
- eapol, sm->wpa_key_mgmt))
- return 0;
-
- return -1;
-}
-
-
-int wpa_auth_pmksa_add_preauth(struct wpa_authenticator *wpa_auth,
- const u8 *pmk, size_t len, const u8 *sta_addr,
- int session_timeout,
- struct eapol_state_machine *eapol)
-{
- if (wpa_auth == NULL)
- return -1;
-
- if (pmksa_cache_auth_add(wpa_auth->pmksa, pmk, len, wpa_auth->addr,
- sta_addr, session_timeout, eapol,
- WPA_KEY_MGMT_IEEE8021X))
- return 0;
-
- return -1;
-}
-
-
-static struct wpa_group *
-wpa_auth_add_group(struct wpa_authenticator *wpa_auth, int vlan_id)
-{
- struct wpa_group *group;
-
- if (wpa_auth == NULL || wpa_auth->group == NULL)
- return NULL;
-
- wpa_printf(MSG_DEBUG, "WPA: Add group state machine for VLAN-ID %d",
- vlan_id);
- group = wpa_group_init(wpa_auth, vlan_id);
- if (group == NULL)
- return NULL;
-
- group->next = wpa_auth->group->next;
- wpa_auth->group->next = group;
-
- return group;
-}
-
-
-int wpa_auth_sta_set_vlan(struct wpa_state_machine *sm, int vlan_id)
-{
- struct wpa_group *group;
-
- if (sm == NULL || sm->wpa_auth == NULL)
- return 0;
-
- group = sm->wpa_auth->group;
- while (group) {
- if (group->vlan_id == vlan_id)
- break;
- group = group->next;
- }
-
- if (group == NULL) {
- group = wpa_auth_add_group(sm->wpa_auth, vlan_id);
- if (group == NULL)
- return -1;
- }
-
- if (sm->group == group)
- return 0;
-
- wpa_printf(MSG_DEBUG, "WPA: Moving STA " MACSTR " to use group state "
- "machine for VLAN ID %d", MAC2STR(sm->addr), vlan_id);
-
- sm->group = group;
- return 0;
-}
-
-
-void wpa_auth_eapol_key_tx_status(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, int ack)
-{
- if (wpa_auth == NULL || sm == NULL)
- return;
- wpa_printf(MSG_DEBUG, "WPA: EAPOL-Key TX status for STA " MACSTR
- " ack=%d", MAC2STR(sm->addr), ack);
- if (sm->pending_1_of_4_timeout && ack) {
- /*
- * Some deployed supplicant implementations update their SNonce
- * for each EAPOL-Key 2/4 message even within the same 4-way
- * handshake and then fail to use the first SNonce when
- * deriving the PTK. This results in unsuccessful 4-way
- * handshake whenever the relatively short initial timeout is
- * reached and EAPOL-Key 1/4 is retransmitted. Try to work
- * around this by increasing the timeout now that we know that
- * the station has received the frame.
- */
- int timeout_ms = eapol_key_timeout_subseq;
- wpa_printf(MSG_DEBUG, "WPA: Increase initial EAPOL-Key 1/4 "
- "timeout by %u ms because of acknowledged frame",
- timeout_ms);
- eloop_cancel_timeout(wpa_send_eapol_timeout, wpa_auth, sm);
- eloop_register_timeout(timeout_ms / 1000,
- (timeout_ms % 1000) * 1000,
- wpa_send_eapol_timeout, wpa_auth, sm);
- }
-}
diff --git a/hostapd-0.8/src/ap/wpa_auth.h b/hostapd-0.8/src/ap/wpa_auth.h
deleted file mode 100644
index b3e1ff0..0000000
--- a/hostapd-0.8/src/ap/wpa_auth.h
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * hostapd - IEEE 802.11i-2004 / WPA Authenticator
- * Copyright (c) 2004-2007, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef WPA_AUTH_H
-#define WPA_AUTH_H
-
-#include "common/defs.h"
-#include "common/eapol_common.h"
-#include "common/wpa_common.h"
-
-#ifdef _MSC_VER
-#pragma pack(push, 1)
-#endif /* _MSC_VER */
-
-/* IEEE Std 802.11r-2008, 11A.10.3 - Remote request/response frame definition
- */
-struct ft_rrb_frame {
- u8 frame_type; /* RSN_REMOTE_FRAME_TYPE_FT_RRB */
- u8 packet_type; /* FT_PACKET_REQUEST/FT_PACKET_RESPONSE */
- le16 action_length; /* little endian length of action_frame */
- u8 ap_address[ETH_ALEN];
- /*
- * Followed by action_length bytes of FT Action frame (from Category
- * field to the end of Action Frame body.
- */
-} STRUCT_PACKED;
-
-#define RSN_REMOTE_FRAME_TYPE_FT_RRB 1
-
-#define FT_PACKET_REQUEST 0
-#define FT_PACKET_RESPONSE 1
-/* Vendor-specific types for R0KH-R1KH protocol; not defined in 802.11r */
-#define FT_PACKET_R0KH_R1KH_PULL 200
-#define FT_PACKET_R0KH_R1KH_RESP 201
-#define FT_PACKET_R0KH_R1KH_PUSH 202
-
-#define FT_R0KH_R1KH_PULL_DATA_LEN 44
-#define FT_R0KH_R1KH_RESP_DATA_LEN 76
-#define FT_R0KH_R1KH_PUSH_DATA_LEN 88
-
-struct ft_r0kh_r1kh_pull_frame {
- u8 frame_type; /* RSN_REMOTE_FRAME_TYPE_FT_RRB */
- u8 packet_type; /* FT_PACKET_R0KH_R1KH_PULL */
- le16 data_length; /* little endian length of data (44) */
- u8 ap_address[ETH_ALEN];
-
- u8 nonce[16];
- u8 pmk_r0_name[WPA_PMK_NAME_LEN];
- u8 r1kh_id[FT_R1KH_ID_LEN];
- u8 s1kh_id[ETH_ALEN];
- u8 pad[4]; /* 8-octet boundary for AES key wrap */
- u8 key_wrap_extra[8];
-} STRUCT_PACKED;
-
-struct ft_r0kh_r1kh_resp_frame {
- u8 frame_type; /* RSN_REMOTE_FRAME_TYPE_FT_RRB */
- u8 packet_type; /* FT_PACKET_R0KH_R1KH_RESP */
- le16 data_length; /* little endian length of data (76) */
- u8 ap_address[ETH_ALEN];
-
- u8 nonce[16]; /* copied from pull */
- u8 r1kh_id[FT_R1KH_ID_LEN]; /* copied from pull */
- u8 s1kh_id[ETH_ALEN]; /* copied from pull */
- u8 pmk_r1[PMK_LEN];
- u8 pmk_r1_name[WPA_PMK_NAME_LEN];
- le16 pairwise;
- u8 pad[2]; /* 8-octet boundary for AES key wrap */
- u8 key_wrap_extra[8];
-} STRUCT_PACKED;
-
-struct ft_r0kh_r1kh_push_frame {
- u8 frame_type; /* RSN_REMOTE_FRAME_TYPE_FT_RRB */
- u8 packet_type; /* FT_PACKET_R0KH_R1KH_PUSH */
- le16 data_length; /* little endian length of data (88) */
- u8 ap_address[ETH_ALEN];
-
- /* Encrypted with AES key-wrap */
- u8 timestamp[4]; /* current time in seconds since unix epoch, little
- * endian */
- u8 r1kh_id[FT_R1KH_ID_LEN];
- u8 s1kh_id[ETH_ALEN];
- u8 pmk_r0_name[WPA_PMK_NAME_LEN];
- u8 pmk_r1[PMK_LEN];
- u8 pmk_r1_name[WPA_PMK_NAME_LEN];
- le16 pairwise;
- u8 pad[6]; /* 8-octet boundary for AES key wrap */
- u8 key_wrap_extra[8];
-} STRUCT_PACKED;
-
-#ifdef _MSC_VER
-#pragma pack(pop)
-#endif /* _MSC_VER */
-
-
-/* per STA state machine data */
-
-struct wpa_authenticator;
-struct wpa_state_machine;
-struct rsn_pmksa_cache_entry;
-struct eapol_state_machine;
-
-
-struct ft_remote_r0kh {
- struct ft_remote_r0kh *next;
- u8 addr[ETH_ALEN];
- u8 id[FT_R0KH_ID_MAX_LEN];
- size_t id_len;
- u8 key[16];
-};
-
-
-struct ft_remote_r1kh {
- struct ft_remote_r1kh *next;
- u8 addr[ETH_ALEN];
- u8 id[FT_R1KH_ID_LEN];
- u8 key[16];
-};
-
-
-struct wpa_auth_config {
- int wpa;
- int wpa_key_mgmt;
- int wpa_pairwise;
- int wpa_group;
- int wpa_group_rekey;
- int wpa_strict_rekey;
- int wpa_gmk_rekey;
- int wpa_ptk_rekey;
- int rsn_pairwise;
- int rsn_preauth;
- int eapol_version;
- int peerkey;
- int wmm_enabled;
- int wmm_uapsd;
- int okc;
- int tx_status;
-#ifdef CONFIG_IEEE80211W
- enum mfp_options ieee80211w;
-#endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_IEEE80211R
-#define SSID_LEN 32
- u8 ssid[SSID_LEN];
- size_t ssid_len;
- u8 mobility_domain[MOBILITY_DOMAIN_ID_LEN];
- u8 r0_key_holder[FT_R0KH_ID_MAX_LEN];
- size_t r0_key_holder_len;
- u8 r1_key_holder[FT_R1KH_ID_LEN];
- u32 r0_key_lifetime;
- u32 reassociation_deadline;
- struct ft_remote_r0kh *r0kh_list;
- struct ft_remote_r1kh *r1kh_list;
- int pmk_r1_push;
- int ft_over_ds;
-#endif /* CONFIG_IEEE80211R */
-};
-
-typedef enum {
- LOGGER_DEBUG, LOGGER_INFO, LOGGER_WARNING
-} logger_level;
-
-typedef enum {
- WPA_EAPOL_portEnabled, WPA_EAPOL_portValid, WPA_EAPOL_authorized,
- WPA_EAPOL_portControl_Auto, WPA_EAPOL_keyRun, WPA_EAPOL_keyAvailable,
- WPA_EAPOL_keyDone, WPA_EAPOL_inc_EapolFramesTx
-} wpa_eapol_variable;
-
-struct wpa_auth_callbacks {
- void *ctx;
- void (*logger)(void *ctx, const u8 *addr, logger_level level,
- const char *txt);
- void (*disconnect)(void *ctx, const u8 *addr, u16 reason);
- void (*mic_failure_report)(void *ctx, const u8 *addr);
- void (*set_eapol)(void *ctx, const u8 *addr, wpa_eapol_variable var,
- int value);
- int (*get_eapol)(void *ctx, const u8 *addr, wpa_eapol_variable var);
- const u8 * (*get_psk)(void *ctx, const u8 *addr, const u8 *prev_psk);
- int (*get_msk)(void *ctx, const u8 *addr, u8 *msk, size_t *len);
- int (*set_key)(void *ctx, int vlan_id, enum wpa_alg alg,
- const u8 *addr, int idx, u8 *key, size_t key_len);
- int (*get_seqnum)(void *ctx, const u8 *addr, int idx, u8 *seq);
- int (*send_eapol)(void *ctx, const u8 *addr, const u8 *data,
- size_t data_len, int encrypt);
- int (*for_each_sta)(void *ctx, int (*cb)(struct wpa_state_machine *sm,
- void *ctx), void *cb_ctx);
- int (*for_each_auth)(void *ctx, int (*cb)(struct wpa_authenticator *a,
- void *ctx), void *cb_ctx);
- int (*send_ether)(void *ctx, const u8 *dst, u16 proto, const u8 *data,
- size_t data_len);
-#ifdef CONFIG_IEEE80211R
- struct wpa_state_machine * (*add_sta)(void *ctx, const u8 *sta_addr);
- int (*send_ft_action)(void *ctx, const u8 *dst,
- const u8 *data, size_t data_len);
-#endif /* CONFIG_IEEE80211R */
-};
-
-struct wpa_authenticator * wpa_init(const u8 *addr,
- struct wpa_auth_config *conf,
- struct wpa_auth_callbacks *cb);
-void wpa_deinit(struct wpa_authenticator *wpa_auth);
-int wpa_reconfig(struct wpa_authenticator *wpa_auth,
- struct wpa_auth_config *conf);
-
-enum {
- WPA_IE_OK, WPA_INVALID_IE, WPA_INVALID_GROUP, WPA_INVALID_PAIRWISE,
- WPA_INVALID_AKMP, WPA_NOT_ENABLED, WPA_ALLOC_FAIL,
- WPA_MGMT_FRAME_PROTECTION_VIOLATION, WPA_INVALID_MGMT_GROUP_CIPHER,
- WPA_INVALID_MDIE, WPA_INVALID_PROTO
-};
-
-int wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm,
- const u8 *wpa_ie, size_t wpa_ie_len,
- const u8 *mdie, size_t mdie_len);
-int wpa_auth_uses_mfp(struct wpa_state_machine *sm);
-struct wpa_state_machine *
-wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr);
-int wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm);
-void wpa_auth_sta_no_wpa(struct wpa_state_machine *sm);
-void wpa_auth_sta_deinit(struct wpa_state_machine *sm);
-void wpa_receive(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm,
- u8 *data, size_t data_len);
-typedef enum {
- WPA_AUTH, WPA_ASSOC, WPA_DISASSOC, WPA_DEAUTH, WPA_REAUTH,
- WPA_REAUTH_EAPOL, WPA_ASSOC_FT
-} wpa_event;
-void wpa_remove_ptk(struct wpa_state_machine *sm);
-int wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event);
-void wpa_auth_sm_notify(struct wpa_state_machine *sm);
-void wpa_gtk_rekey(struct wpa_authenticator *wpa_auth);
-int wpa_get_mib(struct wpa_authenticator *wpa_auth, char *buf, size_t buflen);
-int wpa_get_mib_sta(struct wpa_state_machine *sm, char *buf, size_t buflen);
-void wpa_auth_countermeasures_start(struct wpa_authenticator *wpa_auth);
-int wpa_auth_pairwise_set(struct wpa_state_machine *sm);
-int wpa_auth_get_pairwise(struct wpa_state_machine *sm);
-int wpa_auth_sta_key_mgmt(struct wpa_state_machine *sm);
-int wpa_auth_sta_wpa_version(struct wpa_state_machine *sm);
-int wpa_auth_sta_clear_pmksa(struct wpa_state_machine *sm,
- struct rsn_pmksa_cache_entry *entry);
-struct rsn_pmksa_cache_entry *
-wpa_auth_sta_get_pmksa(struct wpa_state_machine *sm);
-void wpa_auth_sta_local_mic_failure_report(struct wpa_state_machine *sm);
-const u8 * wpa_auth_get_wpa_ie(struct wpa_authenticator *wpa_auth,
- size_t *len);
-int wpa_auth_pmksa_add(struct wpa_state_machine *sm, const u8 *pmk,
- int session_timeout, struct eapol_state_machine *eapol);
-int wpa_auth_pmksa_add_preauth(struct wpa_authenticator *wpa_auth,
- const u8 *pmk, size_t len, const u8 *sta_addr,
- int session_timeout,
- struct eapol_state_machine *eapol);
-int wpa_auth_sta_set_vlan(struct wpa_state_machine *sm, int vlan_id);
-void wpa_auth_eapol_key_tx_status(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, int ack);
-
-#ifdef CONFIG_IEEE80211R
-u8 * wpa_sm_write_assoc_resp_ies(struct wpa_state_machine *sm, u8 *pos,
- size_t max_len, int auth_alg,
- const u8 *req_ies, size_t req_ies_len);
-void wpa_ft_process_auth(struct wpa_state_machine *sm, const u8 *bssid,
- u16 auth_transaction, const u8 *ies, size_t ies_len,
- void (*cb)(void *ctx, const u8 *dst, const u8 *bssid,
- u16 auth_transaction, u16 resp,
- const u8 *ies, size_t ies_len),
- void *ctx);
-u16 wpa_ft_validate_reassoc(struct wpa_state_machine *sm, const u8 *ies,
- size_t ies_len);
-int wpa_ft_action_rx(struct wpa_state_machine *sm, const u8 *data, size_t len);
-int wpa_ft_rrb_rx(struct wpa_authenticator *wpa_auth, const u8 *src_addr,
- const u8 *data, size_t data_len);
-void wpa_ft_push_pmk_r1(struct wpa_authenticator *wpa_auth, const u8 *addr);
-#endif /* CONFIG_IEEE80211R */
-
-#endif /* WPA_AUTH_H */
diff --git a/hostapd-0.8/src/ap/wpa_auth_ft.c b/hostapd-0.8/src/ap/wpa_auth_ft.c
deleted file mode 100644
index 65f5f4c..0000000
--- a/hostapd-0.8/src/ap/wpa_auth_ft.c
+++ /dev/null
@@ -1,1779 +0,0 @@
-/*
- * hostapd - IEEE 802.11r - Fast BSS Transition
- * Copyright (c) 2004-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "common/ieee802_11_defs.h"
-#include "common/ieee802_11_common.h"
-#include "crypto/aes_wrap.h"
-#include "crypto/random.h"
-#include "ap_config.h"
-#include "ieee802_11.h"
-#include "wmm.h"
-#include "wpa_auth.h"
-#include "wpa_auth_i.h"
-#include "wpa_auth_ie.h"
-
-
-#ifdef CONFIG_IEEE80211R
-
-struct wpa_ft_ies {
- const u8 *mdie;
- size_t mdie_len;
- const u8 *ftie;
- size_t ftie_len;
- const u8 *r1kh_id;
- const u8 *gtk;
- size_t gtk_len;
- const u8 *r0kh_id;
- size_t r0kh_id_len;
- const u8 *rsn;
- size_t rsn_len;
- const u8 *rsn_pmkid;
- const u8 *ric;
- size_t ric_len;
-};
-
-
-static int wpa_ft_parse_ies(const u8 *ies, size_t ies_len,
- struct wpa_ft_ies *parse);
-
-
-static int wpa_ft_rrb_send(struct wpa_authenticator *wpa_auth, const u8 *dst,
- const u8 *data, size_t data_len)
-{
- if (wpa_auth->cb.send_ether == NULL)
- return -1;
- wpa_printf(MSG_DEBUG, "FT: RRB send to " MACSTR, MAC2STR(dst));
- return wpa_auth->cb.send_ether(wpa_auth->cb.ctx, dst, ETH_P_RRB,
- data, data_len);
-}
-
-
-static int wpa_ft_action_send(struct wpa_authenticator *wpa_auth,
- const u8 *dst, const u8 *data, size_t data_len)
-{
- if (wpa_auth->cb.send_ft_action == NULL)
- return -1;
- return wpa_auth->cb.send_ft_action(wpa_auth->cb.ctx, dst,
- data, data_len);
-}
-
-
-static struct wpa_state_machine *
-wpa_ft_add_sta(struct wpa_authenticator *wpa_auth, const u8 *sta_addr)
-{
- if (wpa_auth->cb.add_sta == NULL)
- return NULL;
- return wpa_auth->cb.add_sta(wpa_auth->cb.ctx, sta_addr);
-}
-
-
-int wpa_write_mdie(struct wpa_auth_config *conf, u8 *buf, size_t len)
-{
- u8 *pos = buf;
- u8 capab;
- if (len < 2 + sizeof(struct rsn_mdie))
- return -1;
-
- *pos++ = WLAN_EID_MOBILITY_DOMAIN;
- *pos++ = MOBILITY_DOMAIN_ID_LEN + 1;
- os_memcpy(pos, conf->mobility_domain, MOBILITY_DOMAIN_ID_LEN);
- pos += MOBILITY_DOMAIN_ID_LEN;
- capab = 0;
- if (conf->ft_over_ds)
- capab |= RSN_FT_CAPAB_FT_OVER_DS;
- *pos++ = capab;
-
- return pos - buf;
-}
-
-
-int wpa_write_ftie(struct wpa_auth_config *conf, const u8 *r0kh_id,
- size_t r0kh_id_len,
- const u8 *anonce, const u8 *snonce,
- u8 *buf, size_t len, const u8 *subelem,
- size_t subelem_len)
-{
- u8 *pos = buf, *ielen;
- struct rsn_ftie *hdr;
-
- if (len < 2 + sizeof(*hdr) + 2 + FT_R1KH_ID_LEN + 2 + r0kh_id_len +
- subelem_len)
- return -1;
-
- *pos++ = WLAN_EID_FAST_BSS_TRANSITION;
- ielen = pos++;
-
- hdr = (struct rsn_ftie *) pos;
- os_memset(hdr, 0, sizeof(*hdr));
- pos += sizeof(*hdr);
- WPA_PUT_LE16(hdr->mic_control, 0);
- if (anonce)
- os_memcpy(hdr->anonce, anonce, WPA_NONCE_LEN);
- if (snonce)
- os_memcpy(hdr->snonce, snonce, WPA_NONCE_LEN);
-
- /* Optional Parameters */
- *pos++ = FTIE_SUBELEM_R1KH_ID;
- *pos++ = FT_R1KH_ID_LEN;
- os_memcpy(pos, conf->r1_key_holder, FT_R1KH_ID_LEN);
- pos += FT_R1KH_ID_LEN;
-
- if (r0kh_id) {
- *pos++ = FTIE_SUBELEM_R0KH_ID;
- *pos++ = r0kh_id_len;
- os_memcpy(pos, r0kh_id, r0kh_id_len);
- pos += r0kh_id_len;
- }
-
- if (subelem) {
- os_memcpy(pos, subelem, subelem_len);
- pos += subelem_len;
- }
-
- *ielen = pos - buf - 2;
-
- return pos - buf;
-}
-
-
-struct wpa_ft_pmk_r0_sa {
- struct wpa_ft_pmk_r0_sa *next;
- u8 pmk_r0[PMK_LEN];
- u8 pmk_r0_name[WPA_PMK_NAME_LEN];
- u8 spa[ETH_ALEN];
- int pairwise; /* Pairwise cipher suite, WPA_CIPHER_* */
- /* TODO: expiration, identity, radius_class, EAP type, VLAN ID */
- int pmk_r1_pushed;
-};
-
-struct wpa_ft_pmk_r1_sa {
- struct wpa_ft_pmk_r1_sa *next;
- u8 pmk_r1[PMK_LEN];
- u8 pmk_r1_name[WPA_PMK_NAME_LEN];
- u8 spa[ETH_ALEN];
- int pairwise; /* Pairwise cipher suite, WPA_CIPHER_* */
- /* TODO: expiration, identity, radius_class, EAP type, VLAN ID */
-};
-
-struct wpa_ft_pmk_cache {
- struct wpa_ft_pmk_r0_sa *pmk_r0;
- struct wpa_ft_pmk_r1_sa *pmk_r1;
-};
-
-struct wpa_ft_pmk_cache * wpa_ft_pmk_cache_init(void)
-{
- struct wpa_ft_pmk_cache *cache;
-
- cache = os_zalloc(sizeof(*cache));
-
- return cache;
-}
-
-
-void wpa_ft_pmk_cache_deinit(struct wpa_ft_pmk_cache *cache)
-{
- struct wpa_ft_pmk_r0_sa *r0, *r0prev;
- struct wpa_ft_pmk_r1_sa *r1, *r1prev;
-
- r0 = cache->pmk_r0;
- while (r0) {
- r0prev = r0;
- r0 = r0->next;
- os_memset(r0prev->pmk_r0, 0, PMK_LEN);
- os_free(r0prev);
- }
-
- r1 = cache->pmk_r1;
- while (r1) {
- r1prev = r1;
- r1 = r1->next;
- os_memset(r1prev->pmk_r1, 0, PMK_LEN);
- os_free(r1prev);
- }
-
- os_free(cache);
-}
-
-
-static int wpa_ft_store_pmk_r0(struct wpa_authenticator *wpa_auth,
- const u8 *spa, const u8 *pmk_r0,
- const u8 *pmk_r0_name, int pairwise)
-{
- struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache;
- struct wpa_ft_pmk_r0_sa *r0;
-
- /* TODO: add expiration and limit on number of entries in cache */
-
- r0 = os_zalloc(sizeof(*r0));
- if (r0 == NULL)
- return -1;
-
- os_memcpy(r0->pmk_r0, pmk_r0, PMK_LEN);
- os_memcpy(r0->pmk_r0_name, pmk_r0_name, WPA_PMK_NAME_LEN);
- os_memcpy(r0->spa, spa, ETH_ALEN);
- r0->pairwise = pairwise;
-
- r0->next = cache->pmk_r0;
- cache->pmk_r0 = r0;
-
- return 0;
-}
-
-
-static int wpa_ft_fetch_pmk_r0(struct wpa_authenticator *wpa_auth,
- const u8 *spa, const u8 *pmk_r0_name,
- u8 *pmk_r0, int *pairwise)
-{
- struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache;
- struct wpa_ft_pmk_r0_sa *r0;
-
- r0 = cache->pmk_r0;
- while (r0) {
- if (os_memcmp(r0->spa, spa, ETH_ALEN) == 0 &&
- os_memcmp(r0->pmk_r0_name, pmk_r0_name, WPA_PMK_NAME_LEN)
- == 0) {
- os_memcpy(pmk_r0, r0->pmk_r0, PMK_LEN);
- if (pairwise)
- *pairwise = r0->pairwise;
- return 0;
- }
-
- r0 = r0->next;
- }
-
- return -1;
-}
-
-
-static int wpa_ft_store_pmk_r1(struct wpa_authenticator *wpa_auth,
- const u8 *spa, const u8 *pmk_r1,
- const u8 *pmk_r1_name, int pairwise)
-{
- struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache;
- struct wpa_ft_pmk_r1_sa *r1;
-
- /* TODO: add expiration and limit on number of entries in cache */
-
- r1 = os_zalloc(sizeof(*r1));
- if (r1 == NULL)
- return -1;
-
- os_memcpy(r1->pmk_r1, pmk_r1, PMK_LEN);
- os_memcpy(r1->pmk_r1_name, pmk_r1_name, WPA_PMK_NAME_LEN);
- os_memcpy(r1->spa, spa, ETH_ALEN);
- r1->pairwise = pairwise;
-
- r1->next = cache->pmk_r1;
- cache->pmk_r1 = r1;
-
- return 0;
-}
-
-
-static int wpa_ft_fetch_pmk_r1(struct wpa_authenticator *wpa_auth,
- const u8 *spa, const u8 *pmk_r1_name,
- u8 *pmk_r1, int *pairwise)
-{
- struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache;
- struct wpa_ft_pmk_r1_sa *r1;
-
- r1 = cache->pmk_r1;
- while (r1) {
- if (os_memcmp(r1->spa, spa, ETH_ALEN) == 0 &&
- os_memcmp(r1->pmk_r1_name, pmk_r1_name, WPA_PMK_NAME_LEN)
- == 0) {
- os_memcpy(pmk_r1, r1->pmk_r1, PMK_LEN);
- if (pairwise)
- *pairwise = r1->pairwise;
- return 0;
- }
-
- r1 = r1->next;
- }
-
- return -1;
-}
-
-
-static int wpa_ft_pull_pmk_r1(struct wpa_authenticator *wpa_auth,
- const u8 *s1kh_id, const u8 *r0kh_id,
- size_t r0kh_id_len, const u8 *pmk_r0_name)
-{
- struct ft_remote_r0kh *r0kh;
- struct ft_r0kh_r1kh_pull_frame frame, f;
-
- r0kh = wpa_auth->conf.r0kh_list;
- while (r0kh) {
- if (r0kh->id_len == r0kh_id_len &&
- os_memcmp(r0kh->id, r0kh_id, r0kh_id_len) == 0)
- break;
- r0kh = r0kh->next;
- }
- if (r0kh == NULL)
- return -1;
-
- wpa_printf(MSG_DEBUG, "FT: Send PMK-R1 pull request to remote R0KH "
- "address " MACSTR, MAC2STR(r0kh->addr));
-
- os_memset(&frame, 0, sizeof(frame));
- frame.frame_type = RSN_REMOTE_FRAME_TYPE_FT_RRB;
- frame.packet_type = FT_PACKET_R0KH_R1KH_PULL;
- frame.data_length = host_to_le16(FT_R0KH_R1KH_PULL_DATA_LEN);
- os_memcpy(frame.ap_address, wpa_auth->addr, ETH_ALEN);
-
- /* aes_wrap() does not support inplace encryption, so use a temporary
- * buffer for the data. */
- if (random_get_bytes(f.nonce, sizeof(f.nonce))) {
- wpa_printf(MSG_DEBUG, "FT: Failed to get random data for "
- "nonce");
- return -1;
- }
- os_memcpy(f.pmk_r0_name, pmk_r0_name, WPA_PMK_NAME_LEN);
- os_memcpy(f.r1kh_id, wpa_auth->conf.r1_key_holder, FT_R1KH_ID_LEN);
- os_memcpy(f.s1kh_id, s1kh_id, ETH_ALEN);
-
- if (aes_wrap(r0kh->key, (FT_R0KH_R1KH_PULL_DATA_LEN + 7) / 8,
- f.nonce, frame.nonce) < 0)
- return -1;
-
- wpa_ft_rrb_send(wpa_auth, r0kh->addr, (u8 *) &frame, sizeof(frame));
-
- return 0;
-}
-
-
-int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, const u8 *pmk,
- struct wpa_ptk *ptk, size_t ptk_len)
-{
- u8 pmk_r0[PMK_LEN], pmk_r0_name[WPA_PMK_NAME_LEN];
- u8 pmk_r1[PMK_LEN];
- u8 ptk_name[WPA_PMK_NAME_LEN];
- const u8 *mdid = sm->wpa_auth->conf.mobility_domain;
- const u8 *r0kh = sm->wpa_auth->conf.r0_key_holder;
- size_t r0kh_len = sm->wpa_auth->conf.r0_key_holder_len;
- const u8 *r1kh = sm->wpa_auth->conf.r1_key_holder;
- const u8 *ssid = sm->wpa_auth->conf.ssid;
- size_t ssid_len = sm->wpa_auth->conf.ssid_len;
-
-
- if (sm->xxkey_len == 0) {
- wpa_printf(MSG_DEBUG, "FT: XXKey not available for key "
- "derivation");
- return -1;
- }
-
- wpa_derive_pmk_r0(sm->xxkey, sm->xxkey_len, ssid, ssid_len, mdid,
- r0kh, r0kh_len, sm->addr, pmk_r0, pmk_r0_name);
- wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R0", pmk_r0, PMK_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: PMKR0Name", pmk_r0_name, WPA_PMK_NAME_LEN);
- wpa_ft_store_pmk_r0(sm->wpa_auth, sm->addr, pmk_r0, pmk_r0_name,
- sm->pairwise);
-
- wpa_derive_pmk_r1(pmk_r0, pmk_r0_name, r1kh, sm->addr,
- pmk_r1, sm->pmk_r1_name);
- wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R1", pmk_r1, PMK_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name", sm->pmk_r1_name,
- WPA_PMK_NAME_LEN);
- wpa_ft_store_pmk_r1(sm->wpa_auth, sm->addr, pmk_r1, sm->pmk_r1_name,
- sm->pairwise);
-
- wpa_pmk_r1_to_ptk(pmk_r1, sm->SNonce, sm->ANonce, sm->addr,
- sm->wpa_auth->addr, sm->pmk_r1_name,
- (u8 *) ptk, ptk_len, ptk_name);
- wpa_hexdump_key(MSG_DEBUG, "FT: PTK", (u8 *) ptk, ptk_len);
- wpa_hexdump(MSG_DEBUG, "FT: PTKName", ptk_name, WPA_PMK_NAME_LEN);
-
- return 0;
-}
-
-
-static inline int wpa_auth_get_seqnum(struct wpa_authenticator *wpa_auth,
- const u8 *addr, int idx, u8 *seq)
-{
- if (wpa_auth->cb.get_seqnum == NULL)
- return -1;
- return wpa_auth->cb.get_seqnum(wpa_auth->cb.ctx, addr, idx, seq);
-}
-
-
-static u8 * wpa_ft_gtk_subelem(struct wpa_state_machine *sm, size_t *len)
-{
- u8 *subelem;
- struct wpa_group *gsm = sm->group;
- size_t subelem_len, pad_len;
- const u8 *key;
- size_t key_len;
- u8 keybuf[32];
-
- key_len = gsm->GTK_len;
- if (key_len > sizeof(keybuf))
- return NULL;
-
- /*
- * Pad key for AES Key Wrap if it is not multiple of 8 bytes or is less
- * than 16 bytes.
- */
- pad_len = key_len % 8;
- if (pad_len)
- pad_len = 8 - pad_len;
- if (key_len + pad_len < 16)
- pad_len += 8;
- if (pad_len) {
- os_memcpy(keybuf, gsm->GTK[gsm->GN - 1], key_len);
- os_memset(keybuf + key_len, 0, pad_len);
- keybuf[key_len] = 0xdd;
- key_len += pad_len;
- key = keybuf;
- } else
- key = gsm->GTK[gsm->GN - 1];
-
- /*
- * Sub-elem ID[1] | Length[1] | Key Info[2] | Key Length[1] | RSC[8] |
- * Key[5..32].
- */
- subelem_len = 13 + key_len + 8;
- subelem = os_zalloc(subelem_len);
- if (subelem == NULL)
- return NULL;
-
- subelem[0] = FTIE_SUBELEM_GTK;
- subelem[1] = 11 + key_len + 8;
- /* Key ID in B0-B1 of Key Info */
- WPA_PUT_LE16(&subelem[2], gsm->GN & 0x03);
- subelem[4] = gsm->GTK_len;
- wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, subelem + 5);
- if (aes_wrap(sm->PTK.kek, key_len / 8, key, subelem + 13)) {
- os_free(subelem);
- return NULL;
- }
-
- *len = subelem_len;
- return subelem;
-}
-
-
-#ifdef CONFIG_IEEE80211W
-static u8 * wpa_ft_igtk_subelem(struct wpa_state_machine *sm, size_t *len)
-{
- u8 *subelem, *pos;
- struct wpa_group *gsm = sm->group;
- size_t subelem_len;
-
- /* Sub-elem ID[1] | Length[1] | KeyID[2] | IPN[6] | Key Length[1] |
- * Key[16+8] */
- subelem_len = 1 + 1 + 2 + 6 + 1 + WPA_IGTK_LEN + 8;
- subelem = os_zalloc(subelem_len);
- if (subelem == NULL)
- return NULL;
-
- pos = subelem;
- *pos++ = FTIE_SUBELEM_IGTK;
- *pos++ = subelem_len - 2;
- WPA_PUT_LE16(pos, gsm->GN_igtk);
- pos += 2;
- wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN_igtk, pos);
- pos += 6;
- *pos++ = WPA_IGTK_LEN;
- if (aes_wrap(sm->PTK.kek, WPA_IGTK_LEN / 8,
- gsm->IGTK[gsm->GN_igtk - 4], pos)) {
- os_free(subelem);
- return NULL;
- }
-
- *len = subelem_len;
- return subelem;
-}
-#endif /* CONFIG_IEEE80211W */
-
-
-static u8 * wpa_ft_process_rdie(u8 *pos, u8 *end, u8 id, u8 descr_count,
- const u8 *ies, size_t ies_len)
-{
- struct ieee802_11_elems parse;
- struct rsn_rdie *rdie;
-
- wpa_printf(MSG_DEBUG, "FT: Resource Request: id=%d descr_count=%d",
- id, descr_count);
- wpa_hexdump(MSG_MSGDUMP, "FT: Resource descriptor IE(s)",
- ies, ies_len);
-
- if (end - pos < (int) sizeof(*rdie)) {
- wpa_printf(MSG_ERROR, "FT: Not enough room for response RDIE");
- return pos;
- }
-
- *pos++ = WLAN_EID_RIC_DATA;
- *pos++ = sizeof(*rdie);
- rdie = (struct rsn_rdie *) pos;
- rdie->id = id;
- rdie->descr_count = 0;
- rdie->status_code = host_to_le16(WLAN_STATUS_SUCCESS);
- pos += sizeof(*rdie);
-
- if (ieee802_11_parse_elems((u8 *) ies, ies_len, &parse, 1) ==
- ParseFailed) {
- wpa_printf(MSG_DEBUG, "FT: Failed to parse request IEs");
- rdie->status_code =
- host_to_le16(WLAN_STATUS_UNSPECIFIED_FAILURE);
- return pos;
- }
-
-#ifdef NEED_AP_MLME
- if (parse.wmm_tspec) {
- struct wmm_tspec_element *tspec;
- int res;
-
- if (parse.wmm_tspec_len + 2 < (int) sizeof(*tspec)) {
- wpa_printf(MSG_DEBUG, "FT: Too short WMM TSPEC IE "
- "(%d)", (int) parse.wmm_tspec_len);
- rdie->status_code =
- host_to_le16(WLAN_STATUS_UNSPECIFIED_FAILURE);
- return pos;
- }
- if (end - pos < (int) sizeof(*tspec)) {
- wpa_printf(MSG_ERROR, "FT: Not enough room for "
- "response TSPEC");
- rdie->status_code =
- host_to_le16(WLAN_STATUS_UNSPECIFIED_FAILURE);
- return pos;
- }
- tspec = (struct wmm_tspec_element *) pos;
- os_memcpy(tspec, parse.wmm_tspec - 2, sizeof(*tspec));
- res = wmm_process_tspec(tspec);
- wpa_printf(MSG_DEBUG, "FT: ADDTS processing result: %d", res);
- if (res == WMM_ADDTS_STATUS_INVALID_PARAMETERS)
- rdie->status_code =
- host_to_le16(WLAN_STATUS_INVALID_PARAMETERS);
- else if (res == WMM_ADDTS_STATUS_REFUSED)
- rdie->status_code =
- host_to_le16(WLAN_STATUS_REQUEST_DECLINED);
- else {
- /* TSPEC accepted; include updated TSPEC in response */
- rdie->descr_count = 1;
- pos += sizeof(*tspec);
- }
- return pos;
- }
-#endif /* NEED_AP_MLME */
-
- wpa_printf(MSG_DEBUG, "FT: No supported resource requested");
- rdie->status_code = host_to_le16(WLAN_STATUS_UNSPECIFIED_FAILURE);
- return pos;
-}
-
-
-static u8 * wpa_ft_process_ric(u8 *pos, u8 *end, const u8 *ric, size_t ric_len)
-{
- const u8 *rpos, *start;
- const struct rsn_rdie *rdie;
-
- wpa_hexdump(MSG_MSGDUMP, "FT: RIC Request", ric, ric_len);
-
- rpos = ric;
- while (rpos + sizeof(*rdie) < ric + ric_len) {
- if (rpos[0] != WLAN_EID_RIC_DATA || rpos[1] < sizeof(*rdie) ||
- rpos + 2 + rpos[1] > ric + ric_len)
- break;
- rdie = (const struct rsn_rdie *) (rpos + 2);
- rpos += 2 + rpos[1];
- start = rpos;
-
- while (rpos + 2 <= ric + ric_len &&
- rpos + 2 + rpos[1] <= ric + ric_len) {
- if (rpos[0] == WLAN_EID_RIC_DATA)
- break;
- rpos += 2 + rpos[1];
- }
- pos = wpa_ft_process_rdie(pos, end, rdie->id,
- rdie->descr_count,
- start, rpos - start);
- }
-
- return pos;
-}
-
-
-u8 * wpa_sm_write_assoc_resp_ies(struct wpa_state_machine *sm, u8 *pos,
- size_t max_len, int auth_alg,
- const u8 *req_ies, size_t req_ies_len)
-{
- u8 *end, *mdie, *ftie, *rsnie = NULL, *r0kh_id, *subelem = NULL;
- size_t mdie_len, ftie_len, rsnie_len = 0, r0kh_id_len, subelem_len = 0;
- int res;
- struct wpa_auth_config *conf;
- struct rsn_ftie *_ftie;
- struct wpa_ft_ies parse;
- u8 *ric_start;
- u8 *anonce, *snonce;
-
- if (sm == NULL)
- return pos;
-
- conf = &sm->wpa_auth->conf;
-
- if (sm->wpa_key_mgmt != WPA_KEY_MGMT_FT_IEEE8021X &&
- sm->wpa_key_mgmt != WPA_KEY_MGMT_FT_PSK)
- return pos;
-
- end = pos + max_len;
-
- if (auth_alg == WLAN_AUTH_FT) {
- /*
- * RSN (only present if this is a Reassociation Response and
- * part of a fast BSS transition)
- */
- res = wpa_write_rsn_ie(conf, pos, end - pos, sm->pmk_r1_name);
- if (res < 0)
- return pos;
- rsnie = pos;
- rsnie_len = res;
- pos += res;
- }
-
- /* Mobility Domain Information */
- res = wpa_write_mdie(conf, pos, end - pos);
- if (res < 0)
- return pos;
- mdie = pos;
- mdie_len = res;
- pos += res;
-
- /* Fast BSS Transition Information */
- if (auth_alg == WLAN_AUTH_FT) {
- subelem = wpa_ft_gtk_subelem(sm, &subelem_len);
- r0kh_id = sm->r0kh_id;
- r0kh_id_len = sm->r0kh_id_len;
- anonce = sm->ANonce;
- snonce = sm->SNonce;
-#ifdef CONFIG_IEEE80211W
- if (sm->mgmt_frame_prot) {
- u8 *igtk;
- size_t igtk_len;
- u8 *nbuf;
- igtk = wpa_ft_igtk_subelem(sm, &igtk_len);
- if (igtk == NULL) {
- os_free(subelem);
- return pos;
- }
- nbuf = os_realloc(subelem, subelem_len + igtk_len);
- if (nbuf == NULL) {
- os_free(subelem);
- os_free(igtk);
- return pos;
- }
- subelem = nbuf;
- os_memcpy(subelem + subelem_len, igtk, igtk_len);
- subelem_len += igtk_len;
- os_free(igtk);
- }
-#endif /* CONFIG_IEEE80211W */
- } else {
- r0kh_id = conf->r0_key_holder;
- r0kh_id_len = conf->r0_key_holder_len;
- anonce = NULL;
- snonce = NULL;
- }
- res = wpa_write_ftie(conf, r0kh_id, r0kh_id_len, anonce, snonce, pos,
- end - pos, subelem, subelem_len);
- os_free(subelem);
- if (res < 0)
- return pos;
- ftie = pos;
- ftie_len = res;
- pos += res;
-
- os_free(sm->assoc_resp_ftie);
- sm->assoc_resp_ftie = os_malloc(ftie_len);
- if (sm->assoc_resp_ftie)
- os_memcpy(sm->assoc_resp_ftie, ftie, ftie_len);
-
- _ftie = (struct rsn_ftie *) (ftie + 2);
- if (auth_alg == WLAN_AUTH_FT)
- _ftie->mic_control[1] = 3; /* Information element count */
-
- ric_start = pos;
- if (wpa_ft_parse_ies(req_ies, req_ies_len, &parse) == 0 && parse.ric) {
- pos = wpa_ft_process_ric(pos, end, parse.ric, parse.ric_len);
- if (auth_alg == WLAN_AUTH_FT)
- _ftie->mic_control[1] +=
- ieee802_11_ie_count(ric_start,
- pos - ric_start);
- }
- if (ric_start == pos)
- ric_start = NULL;
-
- if (auth_alg == WLAN_AUTH_FT &&
- wpa_ft_mic(sm->PTK.kck, sm->addr, sm->wpa_auth->addr, 6,
- mdie, mdie_len, ftie, ftie_len,
- rsnie, rsnie_len,
- ric_start, ric_start ? pos - ric_start : 0,
- _ftie->mic) < 0)
- wpa_printf(MSG_DEBUG, "FT: Failed to calculate MIC");
-
- return pos;
-}
-
-
-static int wpa_ft_parse_ftie(const u8 *ie, size_t ie_len,
- struct wpa_ft_ies *parse)
-{
- const u8 *end, *pos;
-
- parse->ftie = ie;
- parse->ftie_len = ie_len;
-
- pos = ie + sizeof(struct rsn_ftie);
- end = ie + ie_len;
-
- while (pos + 2 <= end && pos + 2 + pos[1] <= end) {
- switch (pos[0]) {
- case FTIE_SUBELEM_R1KH_ID:
- if (pos[1] != FT_R1KH_ID_LEN) {
- wpa_printf(MSG_DEBUG, "FT: Invalid R1KH-ID "
- "length in FTIE: %d", pos[1]);
- return -1;
- }
- parse->r1kh_id = pos + 2;
- break;
- case FTIE_SUBELEM_GTK:
- parse->gtk = pos + 2;
- parse->gtk_len = pos[1];
- break;
- case FTIE_SUBELEM_R0KH_ID:
- if (pos[1] < 1 || pos[1] > FT_R0KH_ID_MAX_LEN) {
- wpa_printf(MSG_DEBUG, "FT: Invalid R0KH-ID "
- "length in FTIE: %d", pos[1]);
- return -1;
- }
- parse->r0kh_id = pos + 2;
- parse->r0kh_id_len = pos[1];
- break;
- }
-
- pos += 2 + pos[1];
- }
-
- return 0;
-}
-
-
-static int wpa_ft_parse_ies(const u8 *ies, size_t ies_len,
- struct wpa_ft_ies *parse)
-{
- const u8 *end, *pos;
- struct wpa_ie_data data;
- int ret;
- const struct rsn_ftie *ftie;
- int prot_ie_count = 0;
-
- os_memset(parse, 0, sizeof(*parse));
- if (ies == NULL)
- return 0;
-
- pos = ies;
- end = ies + ies_len;
- while (pos + 2 <= end && pos + 2 + pos[1] <= end) {
- switch (pos[0]) {
- case WLAN_EID_RSN:
- parse->rsn = pos + 2;
- parse->rsn_len = pos[1];
- ret = wpa_parse_wpa_ie_rsn(parse->rsn - 2,
- parse->rsn_len + 2,
- &data);
- if (ret < 0) {
- wpa_printf(MSG_DEBUG, "FT: Failed to parse "
- "RSN IE: %d", ret);
- return -1;
- }
- if (data.num_pmkid == 1 && data.pmkid)
- parse->rsn_pmkid = data.pmkid;
- break;
- case WLAN_EID_MOBILITY_DOMAIN:
- parse->mdie = pos + 2;
- parse->mdie_len = pos[1];
- break;
- case WLAN_EID_FAST_BSS_TRANSITION:
- if (pos[1] < sizeof(*ftie))
- return -1;
- ftie = (const struct rsn_ftie *) (pos + 2);
- prot_ie_count = ftie->mic_control[1];
- if (wpa_ft_parse_ftie(pos + 2, pos[1], parse) < 0)
- return -1;
- break;
- case WLAN_EID_RIC_DATA:
- if (parse->ric == NULL)
- parse->ric = pos;
- }
-
- pos += 2 + pos[1];
- }
-
- if (prot_ie_count == 0)
- return 0; /* no MIC */
-
- /*
- * Check that the protected IE count matches with IEs included in the
- * frame.
- */
- if (parse->rsn)
- prot_ie_count--;
- if (parse->mdie)
- prot_ie_count--;
- if (parse->ftie)
- prot_ie_count--;
- if (prot_ie_count < 0) {
- wpa_printf(MSG_DEBUG, "FT: Some required IEs not included in "
- "the protected IE count");
- return -1;
- }
-
- if (prot_ie_count == 0 && parse->ric) {
- wpa_printf(MSG_DEBUG, "FT: RIC IE(s) in the frame, but not "
- "included in protected IE count");
- return -1;
- }
-
- /* Determine the end of the RIC IE(s) */
- pos = parse->ric;
- while (pos && pos + 2 <= end && pos + 2 + pos[1] <= end &&
- prot_ie_count) {
- prot_ie_count--;
- pos += 2 + pos[1];
- }
- parse->ric_len = pos - parse->ric;
- if (prot_ie_count) {
- wpa_printf(MSG_DEBUG, "FT: %d protected IEs missing from "
- "frame", (int) prot_ie_count);
- return -1;
- }
-
- return 0;
-}
-
-
-static inline int wpa_auth_set_key(struct wpa_authenticator *wpa_auth,
- int vlan_id,
- enum wpa_alg alg, const u8 *addr, int idx,
- u8 *key, size_t key_len)
-{
- if (wpa_auth->cb.set_key == NULL)
- return -1;
- return wpa_auth->cb.set_key(wpa_auth->cb.ctx, vlan_id, alg, addr, idx,
- key, key_len);
-}
-
-
-void wpa_ft_install_ptk(struct wpa_state_machine *sm)
-{
- enum wpa_alg alg;
- int klen;
-
- /* MLME-SETKEYS.request(PTK) */
- if (sm->pairwise == WPA_CIPHER_TKIP) {
- alg = WPA_ALG_TKIP;
- klen = 32;
- } else if (sm->pairwise == WPA_CIPHER_CCMP) {
- alg = WPA_ALG_CCMP;
- klen = 16;
- } else {
- wpa_printf(MSG_DEBUG, "FT: Unknown pairwise alg 0x%x - skip "
- "PTK configuration", sm->pairwise);
- return;
- }
-
- /* FIX: add STA entry to kernel/driver here? The set_key will fail
- * most likely without this.. At the moment, STA entry is added only
- * after association has been completed. This function will be called
- * again after association to get the PTK configured, but that could be
- * optimized by adding the STA entry earlier.
- */
- if (wpa_auth_set_key(sm->wpa_auth, 0, alg, sm->addr, 0,
- sm->PTK.tk1, klen))
- return;
-
- /* FIX: MLME-SetProtection.Request(TA, Tx_Rx) */
- sm->pairwise_set = TRUE;
-}
-
-
-static u16 wpa_ft_process_auth_req(struct wpa_state_machine *sm,
- const u8 *ies, size_t ies_len,
- u8 **resp_ies, size_t *resp_ies_len)
-{
- struct rsn_mdie *mdie;
- struct rsn_ftie *ftie;
- u8 pmk_r1[PMK_LEN], pmk_r1_name[WPA_PMK_NAME_LEN];
- u8 ptk_name[WPA_PMK_NAME_LEN];
- struct wpa_auth_config *conf;
- struct wpa_ft_ies parse;
- size_t buflen, ptk_len;
- int ret;
- u8 *pos, *end;
- int pairwise;
-
- *resp_ies = NULL;
- *resp_ies_len = 0;
-
- sm->pmk_r1_name_valid = 0;
- conf = &sm->wpa_auth->conf;
-
- wpa_hexdump(MSG_DEBUG, "FT: Received authentication frame IEs",
- ies, ies_len);
-
- if (wpa_ft_parse_ies(ies, ies_len, &parse) < 0) {
- wpa_printf(MSG_DEBUG, "FT: Failed to parse FT IEs");
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- mdie = (struct rsn_mdie *) parse.mdie;
- if (mdie == NULL || parse.mdie_len < sizeof(*mdie) ||
- os_memcmp(mdie->mobility_domain,
- sm->wpa_auth->conf.mobility_domain,
- MOBILITY_DOMAIN_ID_LEN) != 0) {
- wpa_printf(MSG_DEBUG, "FT: Invalid MDIE");
- return WLAN_STATUS_INVALID_MDIE;
- }
-
- ftie = (struct rsn_ftie *) parse.ftie;
- if (ftie == NULL || parse.ftie_len < sizeof(*ftie)) {
- wpa_printf(MSG_DEBUG, "FT: Invalid FTIE");
- return WLAN_STATUS_INVALID_FTIE;
- }
-
- os_memcpy(sm->SNonce, ftie->snonce, WPA_NONCE_LEN);
-
- if (parse.r0kh_id == NULL) {
- wpa_printf(MSG_DEBUG, "FT: Invalid FTIE - no R0KH-ID");
- return WLAN_STATUS_INVALID_FTIE;
- }
-
- wpa_hexdump(MSG_DEBUG, "FT: STA R0KH-ID",
- parse.r0kh_id, parse.r0kh_id_len);
- os_memcpy(sm->r0kh_id, parse.r0kh_id, parse.r0kh_id_len);
- sm->r0kh_id_len = parse.r0kh_id_len;
-
- if (parse.rsn_pmkid == NULL) {
- wpa_printf(MSG_DEBUG, "FT: No PMKID in RSNIE");
- return WLAN_STATUS_INVALID_PMKID;
- }
-
- wpa_hexdump(MSG_DEBUG, "FT: Requested PMKR0Name",
- parse.rsn_pmkid, WPA_PMK_NAME_LEN);
- wpa_derive_pmk_r1_name(parse.rsn_pmkid,
- sm->wpa_auth->conf.r1_key_holder, sm->addr,
- pmk_r1_name);
- wpa_hexdump(MSG_DEBUG, "FT: Derived requested PMKR1Name",
- pmk_r1_name, WPA_PMK_NAME_LEN);
-
- if (wpa_ft_fetch_pmk_r1(sm->wpa_auth, sm->addr, pmk_r1_name, pmk_r1,
- &pairwise) < 0) {
- if (wpa_ft_pull_pmk_r1(sm->wpa_auth, sm->addr, sm->r0kh_id,
- sm->r0kh_id_len, parse.rsn_pmkid) < 0) {
- wpa_printf(MSG_DEBUG, "FT: Did not have matching "
- "PMK-R1 and unknown R0KH-ID");
- return WLAN_STATUS_INVALID_PMKID;
- }
-
- /*
- * TODO: Should return "status pending" (and the caller should
- * not send out response now). The real response will be sent
- * once the response from R0KH is received.
- */
- return WLAN_STATUS_INVALID_PMKID;
- }
-
- wpa_hexdump_key(MSG_DEBUG, "FT: Selected PMK-R1", pmk_r1, PMK_LEN);
- sm->pmk_r1_name_valid = 1;
- os_memcpy(sm->pmk_r1_name, pmk_r1_name, WPA_PMK_NAME_LEN);
-
- if (random_get_bytes(sm->ANonce, WPA_NONCE_LEN)) {
- wpa_printf(MSG_DEBUG, "FT: Failed to get random data for "
- "ANonce");
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- wpa_hexdump(MSG_DEBUG, "FT: Received SNonce",
- sm->SNonce, WPA_NONCE_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: Generated ANonce",
- sm->ANonce, WPA_NONCE_LEN);
-
- ptk_len = pairwise != WPA_CIPHER_CCMP ? 64 : 48;
- wpa_pmk_r1_to_ptk(pmk_r1, sm->SNonce, sm->ANonce, sm->addr,
- sm->wpa_auth->addr, pmk_r1_name,
- (u8 *) &sm->PTK, ptk_len, ptk_name);
- wpa_hexdump_key(MSG_DEBUG, "FT: PTK",
- (u8 *) &sm->PTK, ptk_len);
- wpa_hexdump(MSG_DEBUG, "FT: PTKName", ptk_name, WPA_PMK_NAME_LEN);
-
- sm->pairwise = pairwise;
- wpa_ft_install_ptk(sm);
-
- buflen = 2 + sizeof(struct rsn_mdie) + 2 + sizeof(struct rsn_ftie) +
- 2 + FT_R1KH_ID_LEN + 200;
- *resp_ies = os_zalloc(buflen);
- if (*resp_ies == NULL) {
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- pos = *resp_ies;
- end = *resp_ies + buflen;
-
- ret = wpa_write_rsn_ie(conf, pos, end - pos, parse.rsn_pmkid);
- if (ret < 0) {
- os_free(*resp_ies);
- *resp_ies = NULL;
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
- pos += ret;
-
- ret = wpa_write_mdie(conf, pos, end - pos);
- if (ret < 0) {
- os_free(*resp_ies);
- *resp_ies = NULL;
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
- pos += ret;
-
- ret = wpa_write_ftie(conf, parse.r0kh_id, parse.r0kh_id_len,
- sm->ANonce, sm->SNonce, pos, end - pos, NULL, 0);
- if (ret < 0) {
- os_free(*resp_ies);
- *resp_ies = NULL;
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
- pos += ret;
-
- *resp_ies_len = pos - *resp_ies;
-
- return WLAN_STATUS_SUCCESS;
-}
-
-
-void wpa_ft_process_auth(struct wpa_state_machine *sm, const u8 *bssid,
- u16 auth_transaction, const u8 *ies, size_t ies_len,
- void (*cb)(void *ctx, const u8 *dst, const u8 *bssid,
- u16 auth_transaction, u16 status,
- const u8 *ies, size_t ies_len),
- void *ctx)
-{
- u16 status;
- u8 *resp_ies;
- size_t resp_ies_len;
-
- if (sm == NULL) {
- wpa_printf(MSG_DEBUG, "FT: Received authentication frame, but "
- "WPA SM not available");
- return;
- }
-
- wpa_printf(MSG_DEBUG, "FT: Received authentication frame: STA=" MACSTR
- " BSSID=" MACSTR " transaction=%d",
- MAC2STR(sm->addr), MAC2STR(bssid), auth_transaction);
- status = wpa_ft_process_auth_req(sm, ies, ies_len, &resp_ies,
- &resp_ies_len);
-
- wpa_printf(MSG_DEBUG, "FT: FT authentication response: dst=" MACSTR
- " auth_transaction=%d status=%d",
- MAC2STR(sm->addr), auth_transaction + 1, status);
- wpa_hexdump(MSG_DEBUG, "FT: Response IEs", resp_ies, resp_ies_len);
- cb(ctx, sm->addr, bssid, auth_transaction + 1, status,
- resp_ies, resp_ies_len);
- os_free(resp_ies);
-}
-
-
-u16 wpa_ft_validate_reassoc(struct wpa_state_machine *sm, const u8 *ies,
- size_t ies_len)
-{
- struct wpa_ft_ies parse;
- struct rsn_mdie *mdie;
- struct rsn_ftie *ftie;
- u8 mic[16];
- unsigned int count;
-
- if (sm == NULL)
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
-
- wpa_hexdump(MSG_DEBUG, "FT: Reassoc Req IEs", ies, ies_len);
-
- if (wpa_ft_parse_ies(ies, ies_len, &parse) < 0) {
- wpa_printf(MSG_DEBUG, "FT: Failed to parse FT IEs");
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- if (parse.rsn == NULL) {
- wpa_printf(MSG_DEBUG, "FT: No RSNIE in Reassoc Req");
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- if (parse.rsn_pmkid == NULL) {
- wpa_printf(MSG_DEBUG, "FT: No PMKID in RSNIE");
- return WLAN_STATUS_INVALID_PMKID;
- }
-
- if (os_memcmp(parse.rsn_pmkid, sm->pmk_r1_name, WPA_PMK_NAME_LEN) != 0)
- {
- wpa_printf(MSG_DEBUG, "FT: PMKID in Reassoc Req did not match "
- "with the PMKR1Name derived from auth request");
- return WLAN_STATUS_INVALID_PMKID;
- }
-
- mdie = (struct rsn_mdie *) parse.mdie;
- if (mdie == NULL || parse.mdie_len < sizeof(*mdie) ||
- os_memcmp(mdie->mobility_domain,
- sm->wpa_auth->conf.mobility_domain,
- MOBILITY_DOMAIN_ID_LEN) != 0) {
- wpa_printf(MSG_DEBUG, "FT: Invalid MDIE");
- return WLAN_STATUS_INVALID_MDIE;
- }
-
- ftie = (struct rsn_ftie *) parse.ftie;
- if (ftie == NULL || parse.ftie_len < sizeof(*ftie)) {
- wpa_printf(MSG_DEBUG, "FT: Invalid FTIE");
- return WLAN_STATUS_INVALID_FTIE;
- }
-
- if (os_memcmp(ftie->snonce, sm->SNonce, WPA_NONCE_LEN) != 0) {
- wpa_printf(MSG_DEBUG, "FT: SNonce mismatch in FTIE");
- wpa_hexdump(MSG_DEBUG, "FT: Received SNonce",
- ftie->snonce, WPA_NONCE_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: Expected SNonce",
- sm->SNonce, WPA_NONCE_LEN);
- return -1;
- }
-
- if (os_memcmp(ftie->anonce, sm->ANonce, WPA_NONCE_LEN) != 0) {
- wpa_printf(MSG_DEBUG, "FT: ANonce mismatch in FTIE");
- wpa_hexdump(MSG_DEBUG, "FT: Received ANonce",
- ftie->anonce, WPA_NONCE_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: Expected ANonce",
- sm->ANonce, WPA_NONCE_LEN);
- return -1;
- }
-
-
- if (parse.r0kh_id == NULL) {
- wpa_printf(MSG_DEBUG, "FT: No R0KH-ID subelem in FTIE");
- return -1;
- }
-
- if (parse.r0kh_id_len != sm->r0kh_id_len ||
- os_memcmp(parse.r0kh_id, sm->r0kh_id, parse.r0kh_id_len) != 0) {
- wpa_printf(MSG_DEBUG, "FT: R0KH-ID in FTIE did not match with "
- "the current R0KH-ID");
- wpa_hexdump(MSG_DEBUG, "FT: R0KH-ID in FTIE",
- parse.r0kh_id, parse.r0kh_id_len);
- wpa_hexdump(MSG_DEBUG, "FT: The current R0KH-ID",
- sm->r0kh_id, sm->r0kh_id_len);
- return -1;
- }
-
- if (parse.r1kh_id == NULL) {
- wpa_printf(MSG_DEBUG, "FT: No R1KH-ID subelem in FTIE");
- return -1;
- }
-
- if (os_memcmp(parse.r1kh_id, sm->wpa_auth->conf.r1_key_holder,
- FT_R1KH_ID_LEN) != 0) {
- wpa_printf(MSG_DEBUG, "FT: Unknown R1KH-ID used in "
- "ReassocReq");
- wpa_hexdump(MSG_DEBUG, "FT: R1KH-ID in FTIE",
- parse.r1kh_id, FT_R1KH_ID_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: Expected R1KH-ID",
- sm->wpa_auth->conf.r1_key_holder, FT_R1KH_ID_LEN);
- return -1;
- }
-
- if (parse.rsn_pmkid == NULL ||
- os_memcmp(parse.rsn_pmkid, sm->pmk_r1_name, WPA_PMK_NAME_LEN)) {
- wpa_printf(MSG_DEBUG, "FT: No matching PMKR1Name (PMKID) in "
- "RSNIE (pmkid=%d)", !!parse.rsn_pmkid);
- return -1;
- }
-
- count = 3;
- if (parse.ric)
- count++;
- if (ftie->mic_control[1] != count) {
- wpa_printf(MSG_DEBUG, "FT: Unexpected IE count in MIC "
- "Control: received %u expected %u",
- ftie->mic_control[1], count);
- return -1;
- }
-
- if (wpa_ft_mic(sm->PTK.kck, sm->addr, sm->wpa_auth->addr, 5,
- parse.mdie - 2, parse.mdie_len + 2,
- parse.ftie - 2, parse.ftie_len + 2,
- parse.rsn - 2, parse.rsn_len + 2,
- parse.ric, parse.ric_len,
- mic) < 0) {
- wpa_printf(MSG_DEBUG, "FT: Failed to calculate MIC");
- return WLAN_STATUS_UNSPECIFIED_FAILURE;
- }
-
- if (os_memcmp(mic, ftie->mic, 16) != 0) {
- wpa_printf(MSG_DEBUG, "FT: Invalid MIC in FTIE");
- wpa_hexdump(MSG_MSGDUMP, "FT: Received MIC", ftie->mic, 16);
- wpa_hexdump(MSG_MSGDUMP, "FT: Calculated MIC", mic, 16);
- return WLAN_STATUS_INVALID_FTIE;
- }
-
- return WLAN_STATUS_SUCCESS;
-}
-
-
-int wpa_ft_action_rx(struct wpa_state_machine *sm, const u8 *data, size_t len)
-{
- const u8 *sta_addr, *target_ap;
- const u8 *ies;
- size_t ies_len;
- u8 action;
- struct ft_rrb_frame *frame;
-
- if (sm == NULL)
- return -1;
-
- /*
- * data: Category[1] Action[1] STA_Address[6] Target_AP_Address[6]
- * FT Request action frame body[variable]
- */
-
- if (len < 14) {
- wpa_printf(MSG_DEBUG, "FT: Too short FT Action frame "
- "(len=%lu)", (unsigned long) len);
- return -1;
- }
-
- action = data[1];
- sta_addr = data + 2;
- target_ap = data + 8;
- ies = data + 14;
- ies_len = len - 14;
-
- wpa_printf(MSG_DEBUG, "FT: Received FT Action frame (STA=" MACSTR
- " Target AP=" MACSTR " Action=%d)",
- MAC2STR(sta_addr), MAC2STR(target_ap), action);
-
- if (os_memcmp(sta_addr, sm->addr, ETH_ALEN) != 0) {
- wpa_printf(MSG_DEBUG, "FT: Mismatch in FT Action STA address: "
- "STA=" MACSTR " STA-Address=" MACSTR,
- MAC2STR(sm->addr), MAC2STR(sta_addr));
- return -1;
- }
-
- /*
- * Do some sanity checking on the target AP address (not own and not
- * broadcast. This could be extended to filter based on a list of known
- * APs in the MD (if such a list were configured).
- */
- if ((target_ap[0] & 0x01) ||
- os_memcmp(target_ap, sm->wpa_auth->addr, ETH_ALEN) == 0) {
- wpa_printf(MSG_DEBUG, "FT: Invalid Target AP in FT Action "
- "frame");
- return -1;
- }
-
- wpa_hexdump(MSG_MSGDUMP, "FT: Action frame body", ies, ies_len);
-
- /* RRB - Forward action frame to the target AP */
- frame = os_malloc(sizeof(*frame) + len);
- frame->frame_type = RSN_REMOTE_FRAME_TYPE_FT_RRB;
- frame->packet_type = FT_PACKET_REQUEST;
- frame->action_length = host_to_le16(len);
- os_memcpy(frame->ap_address, sm->wpa_auth->addr, ETH_ALEN);
- os_memcpy(frame + 1, data, len);
-
- wpa_ft_rrb_send(sm->wpa_auth, target_ap, (u8 *) frame,
- sizeof(*frame) + len);
- os_free(frame);
-
- return 0;
-}
-
-
-static int wpa_ft_rrb_rx_request(struct wpa_authenticator *wpa_auth,
- const u8 *current_ap, const u8 *sta_addr,
- const u8 *body, size_t len)
-{
- struct wpa_state_machine *sm;
- u16 status;
- u8 *resp_ies, *pos;
- size_t resp_ies_len, rlen;
- struct ft_rrb_frame *frame;
-
- sm = wpa_ft_add_sta(wpa_auth, sta_addr);
- if (sm == NULL) {
- wpa_printf(MSG_DEBUG, "FT: Failed to add new STA based on "
- "RRB Request");
- return -1;
- }
-
- wpa_hexdump(MSG_MSGDUMP, "FT: RRB Request Frame body", body, len);
-
- status = wpa_ft_process_auth_req(sm, body, len, &resp_ies,
- &resp_ies_len);
-
- wpa_printf(MSG_DEBUG, "FT: RRB authentication response: STA=" MACSTR
- " CurrentAP=" MACSTR " status=%d",
- MAC2STR(sm->addr), MAC2STR(current_ap), status);
- wpa_hexdump(MSG_DEBUG, "FT: Response IEs", resp_ies, resp_ies_len);
-
- /* RRB - Forward action frame response to the Current AP */
-
- /*
- * data: Category[1] Action[1] STA_Address[6] Target_AP_Address[6]
- * Status_Code[2] FT Request action frame body[variable]
- */
- rlen = 2 + 2 * ETH_ALEN + 2 + resp_ies_len;
-
- frame = os_malloc(sizeof(*frame) + rlen);
- frame->frame_type = RSN_REMOTE_FRAME_TYPE_FT_RRB;
- frame->packet_type = FT_PACKET_RESPONSE;
- frame->action_length = host_to_le16(rlen);
- os_memcpy(frame->ap_address, wpa_auth->addr, ETH_ALEN);
- pos = (u8 *) (frame + 1);
- *pos++ = WLAN_ACTION_FT;
- *pos++ = 2; /* Action: Response */
- os_memcpy(pos, sta_addr, ETH_ALEN);
- pos += ETH_ALEN;
- os_memcpy(pos, wpa_auth->addr, ETH_ALEN);
- pos += ETH_ALEN;
- WPA_PUT_LE16(pos, status);
- pos += 2;
- if (resp_ies) {
- os_memcpy(pos, resp_ies, resp_ies_len);
- os_free(resp_ies);
- }
-
- wpa_ft_rrb_send(wpa_auth, current_ap, (u8 *) frame,
- sizeof(*frame) + rlen);
- os_free(frame);
-
- return 0;
-}
-
-
-static int wpa_ft_rrb_rx_pull(struct wpa_authenticator *wpa_auth,
- const u8 *src_addr,
- const u8 *data, size_t data_len)
-{
- struct ft_r0kh_r1kh_pull_frame *frame, f;
- struct ft_remote_r1kh *r1kh;
- struct ft_r0kh_r1kh_resp_frame resp, r;
- u8 pmk_r0[PMK_LEN];
- int pairwise;
-
- wpa_printf(MSG_DEBUG, "FT: Received PMK-R1 pull");
-
- if (data_len < sizeof(*frame))
- return -1;
-
- r1kh = wpa_auth->conf.r1kh_list;
- while (r1kh) {
- if (os_memcmp(r1kh->addr, src_addr, ETH_ALEN) == 0)
- break;
- r1kh = r1kh->next;
- }
- if (r1kh == NULL) {
- wpa_printf(MSG_DEBUG, "FT: No matching R1KH address found for "
- "PMK-R1 pull source address " MACSTR,
- MAC2STR(src_addr));
- return -1;
- }
-
- frame = (struct ft_r0kh_r1kh_pull_frame *) data;
- /* aes_unwrap() does not support inplace decryption, so use a temporary
- * buffer for the data. */
- if (aes_unwrap(r1kh->key, (FT_R0KH_R1KH_PULL_DATA_LEN + 7) / 8,
- frame->nonce, f.nonce) < 0) {
- wpa_printf(MSG_DEBUG, "FT: Failed to decrypt PMK-R1 pull "
- "request from " MACSTR, MAC2STR(src_addr));
- return -1;
- }
-
- wpa_hexdump(MSG_DEBUG, "FT: PMK-R1 pull - nonce",
- f.nonce, sizeof(f.nonce));
- wpa_hexdump(MSG_DEBUG, "FT: PMK-R1 pull - PMKR0Name",
- f.pmk_r0_name, WPA_PMK_NAME_LEN);
- wpa_printf(MSG_DEBUG, "FT: PMK-R1 pull - R1KH-ID=" MACSTR "S1KH-ID="
- MACSTR, MAC2STR(f.r1kh_id), MAC2STR(f.s1kh_id));
-
- os_memset(&resp, 0, sizeof(resp));
- resp.frame_type = RSN_REMOTE_FRAME_TYPE_FT_RRB;
- resp.packet_type = FT_PACKET_R0KH_R1KH_RESP;
- resp.data_length = host_to_le16(FT_R0KH_R1KH_RESP_DATA_LEN);
- os_memcpy(resp.ap_address, wpa_auth->addr, ETH_ALEN);
-
- /* aes_wrap() does not support inplace encryption, so use a temporary
- * buffer for the data. */
- os_memcpy(r.nonce, f.nonce, sizeof(f.nonce));
- os_memcpy(r.r1kh_id, f.r1kh_id, FT_R1KH_ID_LEN);
- os_memcpy(r.s1kh_id, f.s1kh_id, ETH_ALEN);
- if (wpa_ft_fetch_pmk_r0(wpa_auth, f.s1kh_id, f.pmk_r0_name, pmk_r0,
- &pairwise) < 0) {
- wpa_printf(MSG_DEBUG, "FT: No matching PMKR0Name found for "
- "PMK-R1 pull");
- return -1;
- }
-
- wpa_derive_pmk_r1(pmk_r0, f.pmk_r0_name, f.r1kh_id, f.s1kh_id,
- r.pmk_r1, r.pmk_r1_name);
- wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R1", r.pmk_r1, PMK_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name", r.pmk_r1_name,
- WPA_PMK_NAME_LEN);
- r.pairwise = host_to_le16(pairwise);
-
- if (aes_wrap(r1kh->key, (FT_R0KH_R1KH_RESP_DATA_LEN + 7) / 8,
- r.nonce, resp.nonce) < 0) {
- os_memset(pmk_r0, 0, PMK_LEN);
- return -1;
- }
-
- os_memset(pmk_r0, 0, PMK_LEN);
-
- wpa_ft_rrb_send(wpa_auth, src_addr, (u8 *) &resp, sizeof(resp));
-
- return 0;
-}
-
-
-static int wpa_ft_rrb_rx_resp(struct wpa_authenticator *wpa_auth,
- const u8 *src_addr,
- const u8 *data, size_t data_len)
-{
- struct ft_r0kh_r1kh_resp_frame *frame, f;
- struct ft_remote_r0kh *r0kh;
- int pairwise;
-
- wpa_printf(MSG_DEBUG, "FT: Received PMK-R1 pull response");
-
- if (data_len < sizeof(*frame))
- return -1;
-
- r0kh = wpa_auth->conf.r0kh_list;
- while (r0kh) {
- if (os_memcmp(r0kh->addr, src_addr, ETH_ALEN) == 0)
- break;
- r0kh = r0kh->next;
- }
- if (r0kh == NULL) {
- wpa_printf(MSG_DEBUG, "FT: No matching R0KH address found for "
- "PMK-R0 pull response source address " MACSTR,
- MAC2STR(src_addr));
- return -1;
- }
-
- frame = (struct ft_r0kh_r1kh_resp_frame *) data;
- /* aes_unwrap() does not support inplace decryption, so use a temporary
- * buffer for the data. */
- if (aes_unwrap(r0kh->key, (FT_R0KH_R1KH_RESP_DATA_LEN + 7) / 8,
- frame->nonce, f.nonce) < 0) {
- wpa_printf(MSG_DEBUG, "FT: Failed to decrypt PMK-R1 pull "
- "response from " MACSTR, MAC2STR(src_addr));
- return -1;
- }
-
- if (os_memcmp(f.r1kh_id, wpa_auth->conf.r1_key_holder, FT_R1KH_ID_LEN)
- != 0) {
- wpa_printf(MSG_DEBUG, "FT: PMK-R1 pull response did not use a "
- "matching R1KH-ID");
- return -1;
- }
-
- /* TODO: verify that matches with a pending request
- * and call this requests callback function to finish request
- * processing */
-
- pairwise = le_to_host16(f.pairwise);
- wpa_hexdump(MSG_DEBUG, "FT: PMK-R1 pull - nonce",
- f.nonce, sizeof(f.nonce));
- wpa_printf(MSG_DEBUG, "FT: PMK-R1 pull - R1KH-ID=" MACSTR "S1KH-ID="
- MACSTR " pairwise=0x%x",
- MAC2STR(f.r1kh_id), MAC2STR(f.s1kh_id), pairwise);
- wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R1 pull - PMK-R1",
- f.pmk_r1, PMK_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: PMK-R1 pull - PMKR1Name",
- f.pmk_r1_name, WPA_PMK_NAME_LEN);
-
- wpa_ft_store_pmk_r1(wpa_auth, f.s1kh_id, f.pmk_r1, f.pmk_r1_name,
- pairwise);
- os_memset(f.pmk_r1, 0, PMK_LEN);
-
- return 0;
-}
-
-
-static int wpa_ft_rrb_rx_push(struct wpa_authenticator *wpa_auth,
- const u8 *src_addr,
- const u8 *data, size_t data_len)
-{
- struct ft_r0kh_r1kh_push_frame *frame, f;
- struct ft_remote_r0kh *r0kh;
- struct os_time now;
- os_time_t tsend;
- int pairwise;
-
- wpa_printf(MSG_DEBUG, "FT: Received PMK-R1 push");
-
- if (data_len < sizeof(*frame))
- return -1;
-
- r0kh = wpa_auth->conf.r0kh_list;
- while (r0kh) {
- if (os_memcmp(r0kh->addr, src_addr, ETH_ALEN) == 0)
- break;
- r0kh = r0kh->next;
- }
- if (r0kh == NULL) {
- wpa_printf(MSG_DEBUG, "FT: No matching R0KH address found for "
- "PMK-R0 push source address " MACSTR,
- MAC2STR(src_addr));
- return -1;
- }
-
- frame = (struct ft_r0kh_r1kh_push_frame *) data;
- /* aes_unwrap() does not support inplace decryption, so use a temporary
- * buffer for the data. */
- if (aes_unwrap(r0kh->key, (FT_R0KH_R1KH_PUSH_DATA_LEN + 7) / 8,
- frame->timestamp, f.timestamp) < 0) {
- wpa_printf(MSG_DEBUG, "FT: Failed to decrypt PMK-R1 push from "
- MACSTR, MAC2STR(src_addr));
- return -1;
- }
-
- os_get_time(&now);
- tsend = WPA_GET_LE32(f.timestamp);
- if ((now.sec > tsend && now.sec - tsend > 60) ||
- (now.sec < tsend && tsend - now.sec > 60)) {
- wpa_printf(MSG_DEBUG, "FT: PMK-R1 push did not have a valid "
- "timestamp: sender time %d own time %d\n",
- (int) tsend, (int) now.sec);
- return -1;
- }
-
- if (os_memcmp(f.r1kh_id, wpa_auth->conf.r1_key_holder, FT_R1KH_ID_LEN)
- != 0) {
- wpa_printf(MSG_DEBUG, "FT: PMK-R1 push did not use a matching "
- "R1KH-ID (received " MACSTR " own " MACSTR ")",
- MAC2STR(f.r1kh_id),
- MAC2STR(wpa_auth->conf.r1_key_holder));
- return -1;
- }
-
- pairwise = le_to_host16(f.pairwise);
- wpa_printf(MSG_DEBUG, "FT: PMK-R1 push - R1KH-ID=" MACSTR " S1KH-ID="
- MACSTR " pairwise=0x%x",
- MAC2STR(f.r1kh_id), MAC2STR(f.s1kh_id), pairwise);
- wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R1 push - PMK-R1",
- f.pmk_r1, PMK_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: PMK-R1 push - PMKR1Name",
- f.pmk_r1_name, WPA_PMK_NAME_LEN);
-
- wpa_ft_store_pmk_r1(wpa_auth, f.s1kh_id, f.pmk_r1, f.pmk_r1_name,
- pairwise);
- os_memset(f.pmk_r1, 0, PMK_LEN);
-
- return 0;
-}
-
-
-int wpa_ft_rrb_rx(struct wpa_authenticator *wpa_auth, const u8 *src_addr,
- const u8 *data, size_t data_len)
-{
- struct ft_rrb_frame *frame;
- u16 alen;
- const u8 *pos, *end, *start;
- u8 action;
- const u8 *sta_addr, *target_ap_addr;
-
- wpa_printf(MSG_DEBUG, "FT: RRB received frame from remote AP " MACSTR,
- MAC2STR(src_addr));
-
- if (data_len < sizeof(*frame)) {
- wpa_printf(MSG_DEBUG, "FT: Too short RRB frame (data_len=%lu)",
- (unsigned long) data_len);
- return -1;
- }
-
- pos = data;
- frame = (struct ft_rrb_frame *) pos;
- pos += sizeof(*frame);
-
- alen = le_to_host16(frame->action_length);
- wpa_printf(MSG_DEBUG, "FT: RRB frame - frame_type=%d packet_type=%d "
- "action_length=%d ap_address=" MACSTR,
- frame->frame_type, frame->packet_type, alen,
- MAC2STR(frame->ap_address));
-
- if (frame->frame_type != RSN_REMOTE_FRAME_TYPE_FT_RRB) {
- /* Discard frame per IEEE Std 802.11r-2008, 11A.10.3 */
- wpa_printf(MSG_DEBUG, "FT: RRB discarded frame with "
- "unrecognized type %d", frame->frame_type);
- return -1;
- }
-
- if (alen > data_len - sizeof(*frame)) {
- wpa_printf(MSG_DEBUG, "FT: RRB frame too short for action "
- "frame");
- return -1;
- }
-
- if (frame->packet_type == FT_PACKET_R0KH_R1KH_PULL)
- return wpa_ft_rrb_rx_pull(wpa_auth, src_addr, data, data_len);
- if (frame->packet_type == FT_PACKET_R0KH_R1KH_RESP)
- return wpa_ft_rrb_rx_resp(wpa_auth, src_addr, data, data_len);
- if (frame->packet_type == FT_PACKET_R0KH_R1KH_PUSH)
- return wpa_ft_rrb_rx_push(wpa_auth, src_addr, data, data_len);
-
- wpa_hexdump(MSG_MSGDUMP, "FT: RRB - FT Action frame", pos, alen);
-
- if (alen < 1 + 1 + 2 * ETH_ALEN) {
- wpa_printf(MSG_DEBUG, "FT: Too short RRB frame (not enough "
- "room for Action Frame body); alen=%lu",
- (unsigned long) alen);
- return -1;
- }
- start = pos;
- end = pos + alen;
-
- if (*pos != WLAN_ACTION_FT) {
- wpa_printf(MSG_DEBUG, "FT: Unexpected Action frame category "
- "%d", *pos);
- return -1;
- }
-
- pos++;
- action = *pos++;
- sta_addr = pos;
- pos += ETH_ALEN;
- target_ap_addr = pos;
- pos += ETH_ALEN;
- wpa_printf(MSG_DEBUG, "FT: RRB Action Frame: action=%d sta_addr="
- MACSTR " target_ap_addr=" MACSTR,
- action, MAC2STR(sta_addr), MAC2STR(target_ap_addr));
-
- if (frame->packet_type == FT_PACKET_REQUEST) {
- wpa_printf(MSG_DEBUG, "FT: FT Packet Type - Request");
-
- if (action != 1) {
- wpa_printf(MSG_DEBUG, "FT: Unexpected Action %d in "
- "RRB Request", action);
- return -1;
- }
-
- if (os_memcmp(target_ap_addr, wpa_auth->addr, ETH_ALEN) != 0) {
- wpa_printf(MSG_DEBUG, "FT: Target AP address in the "
- "RRB Request does not match with own "
- "address");
- return -1;
- }
-
- if (wpa_ft_rrb_rx_request(wpa_auth, frame->ap_address,
- sta_addr, pos, end - pos) < 0)
- return -1;
- } else if (frame->packet_type == FT_PACKET_RESPONSE) {
- u16 status_code;
-
- if (end - pos < 2) {
- wpa_printf(MSG_DEBUG, "FT: Not enough room for status "
- "code in RRB Response");
- return -1;
- }
- status_code = WPA_GET_LE16(pos);
- pos += 2;
-
- wpa_printf(MSG_DEBUG, "FT: FT Packet Type - Response "
- "(status_code=%d)", status_code);
-
- if (wpa_ft_action_send(wpa_auth, sta_addr, start, alen) < 0)
- return -1;
- } else {
- wpa_printf(MSG_DEBUG, "FT: RRB discarded frame with unknown "
- "packet_type %d", frame->packet_type);
- return -1;
- }
-
- return 0;
-}
-
-
-static void wpa_ft_generate_pmk_r1(struct wpa_authenticator *wpa_auth,
- struct wpa_ft_pmk_r0_sa *pmk_r0,
- struct ft_remote_r1kh *r1kh,
- const u8 *s1kh_id, int pairwise)
-{
- struct ft_r0kh_r1kh_push_frame frame, f;
- struct os_time now;
-
- os_memset(&frame, 0, sizeof(frame));
- frame.frame_type = RSN_REMOTE_FRAME_TYPE_FT_RRB;
- frame.packet_type = FT_PACKET_R0KH_R1KH_PUSH;
- frame.data_length = host_to_le16(FT_R0KH_R1KH_PUSH_DATA_LEN);
- os_memcpy(frame.ap_address, wpa_auth->addr, ETH_ALEN);
-
- /* aes_wrap() does not support inplace encryption, so use a temporary
- * buffer for the data. */
- os_memcpy(f.r1kh_id, r1kh->id, FT_R1KH_ID_LEN);
- os_memcpy(f.s1kh_id, s1kh_id, ETH_ALEN);
- os_memcpy(f.pmk_r0_name, pmk_r0->pmk_r0_name, WPA_PMK_NAME_LEN);
- wpa_derive_pmk_r1(pmk_r0->pmk_r0, pmk_r0->pmk_r0_name, r1kh->id,
- s1kh_id, f.pmk_r1, f.pmk_r1_name);
- wpa_printf(MSG_DEBUG, "FT: R1KH-ID " MACSTR, MAC2STR(r1kh->id));
- wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R1", f.pmk_r1, PMK_LEN);
- wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name", f.pmk_r1_name,
- WPA_PMK_NAME_LEN);
- os_get_time(&now);
- WPA_PUT_LE32(f.timestamp, now.sec);
- f.pairwise = host_to_le16(pairwise);
- if (aes_wrap(r1kh->key, (FT_R0KH_R1KH_PUSH_DATA_LEN + 7) / 8,
- f.timestamp, frame.timestamp) < 0)
- return;
-
- wpa_ft_rrb_send(wpa_auth, r1kh->addr, (u8 *) &frame, sizeof(frame));
-}
-
-
-void wpa_ft_push_pmk_r1(struct wpa_authenticator *wpa_auth, const u8 *addr)
-{
- struct wpa_ft_pmk_r0_sa *r0;
- struct ft_remote_r1kh *r1kh;
-
- if (!wpa_auth->conf.pmk_r1_push)
- return;
-
- r0 = wpa_auth->ft_pmk_cache->pmk_r0;
- while (r0) {
- if (os_memcmp(r0->spa, addr, ETH_ALEN) == 0)
- break;
- r0 = r0->next;
- }
-
- if (r0 == NULL || r0->pmk_r1_pushed)
- return;
- r0->pmk_r1_pushed = 1;
-
- wpa_printf(MSG_DEBUG, "FT: Deriving and pushing PMK-R1 keys to R1KHs "
- "for STA " MACSTR, MAC2STR(addr));
-
- r1kh = wpa_auth->conf.r1kh_list;
- while (r1kh) {
- wpa_ft_generate_pmk_r1(wpa_auth, r0, r1kh, addr, r0->pairwise);
- r1kh = r1kh->next;
- }
-}
-
-#endif /* CONFIG_IEEE80211R */
diff --git a/hostapd-0.8/src/ap/wpa_auth_glue.c b/hostapd-0.8/src/ap/wpa_auth_glue.c
deleted file mode 100644
index bdb3ed2..0000000
--- a/hostapd-0.8/src/ap/wpa_auth_glue.c
+++ /dev/null
@@ -1,571 +0,0 @@
-/*
- * hostapd / WPA authenticator glue code
- * Copyright (c) 2002-2011, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "common/ieee802_11_defs.h"
-#include "eapol_auth/eapol_auth_sm.h"
-#include "eapol_auth/eapol_auth_sm_i.h"
-#include "eap_server/eap.h"
-#include "l2_packet/l2_packet.h"
-#include "drivers/driver.h"
-#include "hostapd.h"
-#include "ieee802_1x.h"
-#include "preauth_auth.h"
-#include "sta_info.h"
-#include "tkip_countermeasures.h"
-#include "ap_drv_ops.h"
-#include "ap_config.h"
-#include "wpa_auth.h"
-
-
-static void hostapd_wpa_auth_conf(struct hostapd_bss_config *conf,
- struct wpa_auth_config *wconf)
-{
- wconf->wpa = conf->wpa;
- wconf->wpa_key_mgmt = conf->wpa_key_mgmt;
- wconf->wpa_pairwise = conf->wpa_pairwise;
- wconf->wpa_group = conf->wpa_group;
- wconf->wpa_group_rekey = conf->wpa_group_rekey;
- wconf->wpa_strict_rekey = conf->wpa_strict_rekey;
- wconf->wpa_gmk_rekey = conf->wpa_gmk_rekey;
- wconf->wpa_ptk_rekey = conf->wpa_ptk_rekey;
- wconf->rsn_pairwise = conf->rsn_pairwise;
- wconf->rsn_preauth = conf->rsn_preauth;
- wconf->eapol_version = conf->eapol_version;
- wconf->peerkey = conf->peerkey;
- wconf->wmm_enabled = conf->wmm_enabled;
- wconf->wmm_uapsd = conf->wmm_uapsd;
- wconf->okc = conf->okc;
-#ifdef CONFIG_IEEE80211W
- wconf->ieee80211w = conf->ieee80211w;
-#endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_IEEE80211R
- wconf->ssid_len = conf->ssid.ssid_len;
- if (wconf->ssid_len > SSID_LEN)
- wconf->ssid_len = SSID_LEN;
- os_memcpy(wconf->ssid, conf->ssid.ssid, wconf->ssid_len);
- os_memcpy(wconf->mobility_domain, conf->mobility_domain,
- MOBILITY_DOMAIN_ID_LEN);
- if (conf->nas_identifier &&
- os_strlen(conf->nas_identifier) <= FT_R0KH_ID_MAX_LEN) {
- wconf->r0_key_holder_len = os_strlen(conf->nas_identifier);
- os_memcpy(wconf->r0_key_holder, conf->nas_identifier,
- wconf->r0_key_holder_len);
- }
- os_memcpy(wconf->r1_key_holder, conf->r1_key_holder, FT_R1KH_ID_LEN);
- wconf->r0_key_lifetime = conf->r0_key_lifetime;
- wconf->reassociation_deadline = conf->reassociation_deadline;
- wconf->r0kh_list = conf->r0kh_list;
- wconf->r1kh_list = conf->r1kh_list;
- wconf->pmk_r1_push = conf->pmk_r1_push;
- wconf->ft_over_ds = conf->ft_over_ds;
-#endif /* CONFIG_IEEE80211R */
-}
-
-
-static void hostapd_wpa_auth_logger(void *ctx, const u8 *addr,
- logger_level level, const char *txt)
-{
-#ifndef CONFIG_NO_HOSTAPD_LOGGER
- struct hostapd_data *hapd = ctx;
- int hlevel;
-
- switch (level) {
- case LOGGER_WARNING:
- hlevel = HOSTAPD_LEVEL_WARNING;
- break;
- case LOGGER_INFO:
- hlevel = HOSTAPD_LEVEL_INFO;
- break;
- case LOGGER_DEBUG:
- default:
- hlevel = HOSTAPD_LEVEL_DEBUG;
- break;
- }
-
- hostapd_logger(hapd, addr, HOSTAPD_MODULE_WPA, hlevel, "%s", txt);
-#endif /* CONFIG_NO_HOSTAPD_LOGGER */
-}
-
-
-static void hostapd_wpa_auth_disconnect(void *ctx, const u8 *addr,
- u16 reason)
-{
- struct hostapd_data *hapd = ctx;
- wpa_printf(MSG_DEBUG, "%s: WPA authenticator requests disconnect: "
- "STA " MACSTR " reason %d",
- __func__, MAC2STR(addr), reason);
- ap_sta_disconnect(hapd, NULL, addr, reason);
-}
-
-
-static void hostapd_wpa_auth_mic_failure_report(void *ctx, const u8 *addr)
-{
- struct hostapd_data *hapd = ctx;
- michael_mic_failure(hapd, addr, 0);
-}
-
-
-static void hostapd_wpa_auth_set_eapol(void *ctx, const u8 *addr,
- wpa_eapol_variable var, int value)
-{
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta = ap_get_sta(hapd, addr);
- if (sta == NULL)
- return;
- switch (var) {
- case WPA_EAPOL_portEnabled:
- ieee802_1x_notify_port_enabled(sta->eapol_sm, value);
- break;
- case WPA_EAPOL_portValid:
- ieee802_1x_notify_port_valid(sta->eapol_sm, value);
- break;
- case WPA_EAPOL_authorized:
- ieee802_1x_set_sta_authorized(hapd, sta, value);
- break;
- case WPA_EAPOL_portControl_Auto:
- if (sta->eapol_sm)
- sta->eapol_sm->portControl = Auto;
- break;
- case WPA_EAPOL_keyRun:
- if (sta->eapol_sm)
- sta->eapol_sm->keyRun = value ? TRUE : FALSE;
- break;
- case WPA_EAPOL_keyAvailable:
- if (sta->eapol_sm)
- sta->eapol_sm->eap_if->eapKeyAvailable =
- value ? TRUE : FALSE;
- break;
- case WPA_EAPOL_keyDone:
- if (sta->eapol_sm)
- sta->eapol_sm->keyDone = value ? TRUE : FALSE;
- break;
- case WPA_EAPOL_inc_EapolFramesTx:
- if (sta->eapol_sm)
- sta->eapol_sm->dot1xAuthEapolFramesTx++;
- break;
- }
-}
-
-
-static int hostapd_wpa_auth_get_eapol(void *ctx, const u8 *addr,
- wpa_eapol_variable var)
-{
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta = ap_get_sta(hapd, addr);
- if (sta == NULL || sta->eapol_sm == NULL)
- return -1;
- switch (var) {
- case WPA_EAPOL_keyRun:
- return sta->eapol_sm->keyRun;
- case WPA_EAPOL_keyAvailable:
- return sta->eapol_sm->eap_if->eapKeyAvailable;
- default:
- return -1;
- }
-}
-
-
-static const u8 * hostapd_wpa_auth_get_psk(void *ctx, const u8 *addr,
- const u8 *prev_psk)
-{
- struct hostapd_data *hapd = ctx;
- return hostapd_get_psk(hapd->conf, addr, prev_psk);
-}
-
-
-static int hostapd_wpa_auth_get_msk(void *ctx, const u8 *addr, u8 *msk,
- size_t *len)
-{
- struct hostapd_data *hapd = ctx;
- const u8 *key;
- size_t keylen;
- struct sta_info *sta;
-
- sta = ap_get_sta(hapd, addr);
- if (sta == NULL)
- return -1;
-
- key = ieee802_1x_get_key(sta->eapol_sm, &keylen);
- if (key == NULL)
- return -1;
-
- if (keylen > *len)
- keylen = *len;
- os_memcpy(msk, key, keylen);
- *len = keylen;
-
- return 0;
-}
-
-
-static int hostapd_wpa_auth_set_key(void *ctx, int vlan_id, enum wpa_alg alg,
- const u8 *addr, int idx, u8 *key,
- size_t key_len)
-{
- struct hostapd_data *hapd = ctx;
- const char *ifname = hapd->conf->iface;
-
- if (vlan_id > 0) {
- ifname = hostapd_get_vlan_id_ifname(hapd->conf->vlan, vlan_id);
- if (ifname == NULL)
- return -1;
- }
-
- return hostapd_drv_set_key(ifname, hapd, alg, addr, idx, 1, NULL, 0,
- key, key_len);
-}
-
-
-static int hostapd_wpa_auth_get_seqnum(void *ctx, const u8 *addr, int idx,
- u8 *seq)
-{
- struct hostapd_data *hapd = ctx;
- return hostapd_get_seqnum(hapd->conf->iface, hapd, addr, idx, seq);
-}
-
-
-static int hostapd_wpa_auth_send_eapol(void *ctx, const u8 *addr,
- const u8 *data, size_t data_len,
- int encrypt)
-{
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta;
- u32 flags = 0;
-
- sta = ap_get_sta(hapd, addr);
- if (sta)
- flags = hostapd_sta_flags_to_drv(sta->flags);
-
- return hostapd_drv_hapd_send_eapol(hapd, addr, data, data_len,
- encrypt, flags);
-}
-
-
-static int hostapd_wpa_auth_for_each_sta(
- void *ctx, int (*cb)(struct wpa_state_machine *sm, void *ctx),
- void *cb_ctx)
-{
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta;
-
- for (sta = hapd->sta_list; sta; sta = sta->next) {
- if (sta->wpa_sm && cb(sta->wpa_sm, cb_ctx))
- return 1;
- }
- return 0;
-}
-
-
-struct wpa_auth_iface_iter_data {
- int (*cb)(struct wpa_authenticator *sm, void *ctx);
- void *cb_ctx;
-};
-
-static int wpa_auth_iface_iter(struct hostapd_iface *iface, void *ctx)
-{
- struct wpa_auth_iface_iter_data *data = ctx;
- size_t i;
- for (i = 0; i < iface->num_bss; i++) {
- if (iface->bss[i]->wpa_auth &&
- data->cb(iface->bss[i]->wpa_auth, data->cb_ctx))
- return 1;
- }
- return 0;
-}
-
-
-static int hostapd_wpa_auth_for_each_auth(
- void *ctx, int (*cb)(struct wpa_authenticator *sm, void *ctx),
- void *cb_ctx)
-{
- struct hostapd_data *hapd = ctx;
- struct wpa_auth_iface_iter_data data;
- if (hapd->iface->for_each_interface == NULL)
- return -1;
- data.cb = cb;
- data.cb_ctx = cb_ctx;
- return hapd->iface->for_each_interface(hapd->iface->interfaces,
- wpa_auth_iface_iter, &data);
-}
-
-
-#ifdef CONFIG_IEEE80211R
-
-struct wpa_auth_ft_iface_iter_data {
- struct hostapd_data *src_hapd;
- const u8 *dst;
- const u8 *data;
- size_t data_len;
-};
-
-
-static int hostapd_wpa_auth_ft_iter(struct hostapd_iface *iface, void *ctx)
-{
- struct wpa_auth_ft_iface_iter_data *idata = ctx;
- struct hostapd_data *hapd;
- size_t j;
-
- for (j = 0; j < iface->num_bss; j++) {
- hapd = iface->bss[j];
- if (hapd == idata->src_hapd)
- continue;
- if (os_memcmp(hapd->own_addr, idata->dst, ETH_ALEN) == 0) {
- wpa_printf(MSG_DEBUG, "FT: Send RRB data directly to "
- "locally managed BSS " MACSTR "@%s -> "
- MACSTR "@%s",
- MAC2STR(idata->src_hapd->own_addr),
- idata->src_hapd->conf->iface,
- MAC2STR(hapd->own_addr), hapd->conf->iface);
- wpa_ft_rrb_rx(hapd->wpa_auth,
- idata->src_hapd->own_addr,
- idata->data, idata->data_len);
- return 1;
- }
- }
-
- return 0;
-}
-
-#endif /* CONFIG_IEEE80211R */
-
-
-static int hostapd_wpa_auth_send_ether(void *ctx, const u8 *dst, u16 proto,
- const u8 *data, size_t data_len)
-{
- struct hostapd_data *hapd = ctx;
- struct l2_ethhdr *buf;
- int ret;
-
-#ifdef CONFIG_IEEE80211R
- if (proto == ETH_P_RRB && hapd->iface->for_each_interface) {
- int res;
- struct wpa_auth_ft_iface_iter_data idata;
- idata.src_hapd = hapd;
- idata.dst = dst;
- idata.data = data;
- idata.data_len = data_len;
- res = hapd->iface->for_each_interface(hapd->iface->interfaces,
- hostapd_wpa_auth_ft_iter,
- &idata);
- if (res == 1)
- return data_len;
- }
-#endif /* CONFIG_IEEE80211R */
-
- if (hapd->driver && hapd->driver->send_ether)
- return hapd->driver->send_ether(hapd->drv_priv, dst,
- hapd->own_addr, proto,
- data, data_len);
- if (hapd->l2 == NULL)
- return -1;
-
- buf = os_malloc(sizeof(*buf) + data_len);
- if (buf == NULL)
- return -1;
- os_memcpy(buf->h_dest, dst, ETH_ALEN);
- os_memcpy(buf->h_source, hapd->own_addr, ETH_ALEN);
- buf->h_proto = host_to_be16(proto);
- os_memcpy(buf + 1, data, data_len);
- ret = l2_packet_send(hapd->l2, dst, proto, (u8 *) buf,
- sizeof(*buf) + data_len);
- os_free(buf);
- return ret;
-}
-
-
-#ifdef CONFIG_IEEE80211R
-
-static int hostapd_wpa_auth_send_ft_action(void *ctx, const u8 *dst,
- const u8 *data, size_t data_len)
-{
- struct hostapd_data *hapd = ctx;
- int res;
- struct ieee80211_mgmt *m;
- size_t mlen;
- struct sta_info *sta;
-
- sta = ap_get_sta(hapd, dst);
- if (sta == NULL || sta->wpa_sm == NULL)
- return -1;
-
- m = os_zalloc(sizeof(*m) + data_len);
- if (m == NULL)
- return -1;
- mlen = ((u8 *) &m->u - (u8 *) m) + data_len;
- m->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
- WLAN_FC_STYPE_ACTION);
- os_memcpy(m->da, dst, ETH_ALEN);
- os_memcpy(m->sa, hapd->own_addr, ETH_ALEN);
- os_memcpy(m->bssid, hapd->own_addr, ETH_ALEN);
- os_memcpy(&m->u, data, data_len);
-
- res = hostapd_drv_send_mlme(hapd, (u8 *) m, mlen);
- os_free(m);
- return res;
-}
-
-
-static struct wpa_state_machine *
-hostapd_wpa_auth_add_sta(void *ctx, const u8 *sta_addr)
-{
- struct hostapd_data *hapd = ctx;
- struct sta_info *sta;
-
- sta = ap_sta_add(hapd, sta_addr);
- if (sta == NULL)
- return NULL;
- if (sta->wpa_sm) {
- sta->auth_alg = WLAN_AUTH_FT;
- return sta->wpa_sm;
- }
-
- sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth, sta->addr);
- if (sta->wpa_sm == NULL) {
- ap_free_sta(hapd, sta);
- return NULL;
- }
- sta->auth_alg = WLAN_AUTH_FT;
-
- return sta->wpa_sm;
-}
-
-
-static void hostapd_rrb_receive(void *ctx, const u8 *src_addr, const u8 *buf,
- size_t len)
-{
- struct hostapd_data *hapd = ctx;
- struct l2_ethhdr *ethhdr;
- if (len < sizeof(*ethhdr))
- return;
- ethhdr = (struct l2_ethhdr *) buf;
- wpa_printf(MSG_DEBUG, "FT: RRB received packet " MACSTR " -> "
- MACSTR, MAC2STR(ethhdr->h_source), MAC2STR(ethhdr->h_dest));
- wpa_ft_rrb_rx(hapd->wpa_auth, ethhdr->h_source, buf + sizeof(*ethhdr),
- len - sizeof(*ethhdr));
-}
-
-#endif /* CONFIG_IEEE80211R */
-
-
-int hostapd_setup_wpa(struct hostapd_data *hapd)
-{
- struct wpa_auth_config _conf;
- struct wpa_auth_callbacks cb;
- const u8 *wpa_ie;
- size_t wpa_ie_len;
-
- hostapd_wpa_auth_conf(hapd->conf, &_conf);
- if (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_EAPOL_TX_STATUS)
- _conf.tx_status = 1;
- os_memset(&cb, 0, sizeof(cb));
- cb.ctx = hapd;
- cb.logger = hostapd_wpa_auth_logger;
- cb.disconnect = hostapd_wpa_auth_disconnect;
- cb.mic_failure_report = hostapd_wpa_auth_mic_failure_report;
- cb.set_eapol = hostapd_wpa_auth_set_eapol;
- cb.get_eapol = hostapd_wpa_auth_get_eapol;
- cb.get_psk = hostapd_wpa_auth_get_psk;
- cb.get_msk = hostapd_wpa_auth_get_msk;
- cb.set_key = hostapd_wpa_auth_set_key;
- cb.get_seqnum = hostapd_wpa_auth_get_seqnum;
- cb.send_eapol = hostapd_wpa_auth_send_eapol;
- cb.for_each_sta = hostapd_wpa_auth_for_each_sta;
- cb.for_each_auth = hostapd_wpa_auth_for_each_auth;
- cb.send_ether = hostapd_wpa_auth_send_ether;
-#ifdef CONFIG_IEEE80211R
- cb.send_ft_action = hostapd_wpa_auth_send_ft_action;
- cb.add_sta = hostapd_wpa_auth_add_sta;
-#endif /* CONFIG_IEEE80211R */
- hapd->wpa_auth = wpa_init(hapd->own_addr, &_conf, &cb);
- if (hapd->wpa_auth == NULL) {
- wpa_printf(MSG_ERROR, "WPA initialization failed.");
- return -1;
- }
-
- if (hostapd_set_privacy(hapd, 1)) {
- wpa_printf(MSG_ERROR, "Could not set PrivacyInvoked "
- "for interface %s", hapd->conf->iface);
- return -1;
- }
-
- wpa_ie = wpa_auth_get_wpa_ie(hapd->wpa_auth, &wpa_ie_len);
- if (hostapd_set_generic_elem(hapd, wpa_ie, wpa_ie_len)) {
- wpa_printf(MSG_ERROR, "Failed to configure WPA IE for "
- "the kernel driver.");
- return -1;
- }
-
- if (rsn_preauth_iface_init(hapd)) {
- wpa_printf(MSG_ERROR, "Initialization of RSN "
- "pre-authentication failed.");
- return -1;
- }
-
-#ifdef CONFIG_IEEE80211R
- if (!hostapd_drv_none(hapd)) {
- hapd->l2 = l2_packet_init(hapd->conf->bridge[0] ?
- hapd->conf->bridge :
- hapd->conf->iface, NULL, ETH_P_RRB,
- hostapd_rrb_receive, hapd, 1);
- if (hapd->l2 == NULL &&
- (hapd->driver == NULL ||
- hapd->driver->send_ether == NULL)) {
- wpa_printf(MSG_ERROR, "Failed to open l2_packet "
- "interface");
- return -1;
- }
- }
-#endif /* CONFIG_IEEE80211R */
-
- return 0;
-
-}
-
-
-void hostapd_reconfig_wpa(struct hostapd_data *hapd)
-{
- struct wpa_auth_config wpa_auth_conf;
- hostapd_wpa_auth_conf(hapd->conf, &wpa_auth_conf);
- wpa_reconfig(hapd->wpa_auth, &wpa_auth_conf);
-}
-
-
-void hostapd_deinit_wpa(struct hostapd_data *hapd)
-{
- rsn_preauth_iface_deinit(hapd);
- if (hapd->wpa_auth) {
- wpa_deinit(hapd->wpa_auth);
- hapd->wpa_auth = NULL;
-
- if (hostapd_set_privacy(hapd, 0)) {
- wpa_printf(MSG_DEBUG, "Could not disable "
- "PrivacyInvoked for interface %s",
- hapd->conf->iface);
- }
-
- if (hostapd_set_generic_elem(hapd, (u8 *) "", 0)) {
- wpa_printf(MSG_DEBUG, "Could not remove generic "
- "information element from interface %s",
- hapd->conf->iface);
- }
- }
- ieee802_1x_deinit(hapd);
-
-#ifdef CONFIG_IEEE80211R
- l2_packet_deinit(hapd->l2);
-#endif /* CONFIG_IEEE80211R */
-}
diff --git a/hostapd-0.8/src/ap/wpa_auth_glue.h b/hostapd-0.8/src/ap/wpa_auth_glue.h
deleted file mode 100644
index 79d7e05..0000000
--- a/hostapd-0.8/src/ap/wpa_auth_glue.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * hostapd / WPA authenticator glue code
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef WPA_AUTH_GLUE_H
-#define WPA_AUTH_GLUE_H
-
-int hostapd_setup_wpa(struct hostapd_data *hapd);
-void hostapd_reconfig_wpa(struct hostapd_data *hapd);
-void hostapd_deinit_wpa(struct hostapd_data *hapd);
-
-#endif /* WPA_AUTH_GLUE_H */
diff --git a/hostapd-0.8/src/ap/wpa_auth_i.h b/hostapd-0.8/src/ap/wpa_auth_i.h
deleted file mode 100644
index 67a5c3b..0000000
--- a/hostapd-0.8/src/ap/wpa_auth_i.h
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * hostapd - IEEE 802.11i-2004 / WPA Authenticator: Internal definitions
- * Copyright (c) 2004-2007, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef WPA_AUTH_I_H
-#define WPA_AUTH_I_H
-
-/* max(dot11RSNAConfigGroupUpdateCount,dot11RSNAConfigPairwiseUpdateCount) */
-#define RSNA_MAX_EAPOL_RETRIES 4
-
-struct wpa_group;
-
-struct wpa_stsl_negotiation {
- struct wpa_stsl_negotiation *next;
- u8 initiator[ETH_ALEN];
- u8 peer[ETH_ALEN];
-};
-
-
-struct wpa_state_machine {
- struct wpa_authenticator *wpa_auth;
- struct wpa_group *group;
-
- u8 addr[ETH_ALEN];
-
- enum {
- WPA_PTK_INITIALIZE, WPA_PTK_DISCONNECT, WPA_PTK_DISCONNECTED,
- WPA_PTK_AUTHENTICATION, WPA_PTK_AUTHENTICATION2,
- WPA_PTK_INITPMK, WPA_PTK_INITPSK, WPA_PTK_PTKSTART,
- WPA_PTK_PTKCALCNEGOTIATING, WPA_PTK_PTKCALCNEGOTIATING2,
- WPA_PTK_PTKINITNEGOTIATING, WPA_PTK_PTKINITDONE
- } wpa_ptk_state;
-
- enum {
- WPA_PTK_GROUP_IDLE = 0,
- WPA_PTK_GROUP_REKEYNEGOTIATING,
- WPA_PTK_GROUP_REKEYESTABLISHED,
- WPA_PTK_GROUP_KEYERROR
- } wpa_ptk_group_state;
-
- Boolean Init;
- Boolean DeauthenticationRequest;
- Boolean AuthenticationRequest;
- Boolean ReAuthenticationRequest;
- Boolean Disconnect;
- int TimeoutCtr;
- int GTimeoutCtr;
- Boolean TimeoutEvt;
- Boolean EAPOLKeyReceived;
- Boolean EAPOLKeyPairwise;
- Boolean EAPOLKeyRequest;
- Boolean MICVerified;
- Boolean GUpdateStationKeys;
- u8 ANonce[WPA_NONCE_LEN];
- u8 SNonce[WPA_NONCE_LEN];
- u8 PMK[PMK_LEN];
- struct wpa_ptk PTK;
- Boolean PTK_valid;
- Boolean pairwise_set;
- int keycount;
- Boolean Pair;
- struct {
- u8 counter[WPA_REPLAY_COUNTER_LEN];
- Boolean valid;
- } key_replay[RSNA_MAX_EAPOL_RETRIES];
- Boolean PInitAKeys; /* WPA only, not in IEEE 802.11i */
- Boolean PTKRequest; /* not in IEEE 802.11i state machine */
- Boolean has_GTK;
- Boolean PtkGroupInit; /* init request for PTK Group state machine */
-
- u8 *last_rx_eapol_key; /* starting from IEEE 802.1X header */
- size_t last_rx_eapol_key_len;
-
- unsigned int changed:1;
- unsigned int in_step_loop:1;
- unsigned int pending_deinit:1;
- unsigned int started:1;
- unsigned int mgmt_frame_prot:1;
-#ifdef CONFIG_IEEE80211R
- unsigned int ft_completed:1;
- unsigned int pmk_r1_name_valid:1;
-#endif /* CONFIG_IEEE80211R */
-
- u8 req_replay_counter[WPA_REPLAY_COUNTER_LEN];
- int req_replay_counter_used;
-
- u8 *wpa_ie;
- size_t wpa_ie_len;
-
- enum {
- WPA_VERSION_NO_WPA = 0 /* WPA not used */,
- WPA_VERSION_WPA = 1 /* WPA / IEEE 802.11i/D3.0 */,
- WPA_VERSION_WPA2 = 2 /* WPA2 / IEEE 802.11i */
- } wpa;
- int pairwise; /* Pairwise cipher suite, WPA_CIPHER_* */
- int wpa_key_mgmt; /* the selected WPA_KEY_MGMT_* */
- struct rsn_pmksa_cache_entry *pmksa;
-
- u32 dot11RSNAStatsTKIPLocalMICFailures;
- u32 dot11RSNAStatsTKIPRemoteMICFailures;
-
-#ifdef CONFIG_IEEE80211R
- u8 xxkey[PMK_LEN]; /* PSK or the second 256 bits of MSK */
- size_t xxkey_len;
- u8 pmk_r1_name[WPA_PMK_NAME_LEN]; /* PMKR1Name derived from FT Auth
- * Request */
- u8 r0kh_id[FT_R0KH_ID_MAX_LEN]; /* R0KH-ID from FT Auth Request */
- size_t r0kh_id_len;
- u8 sup_pmk_r1_name[WPA_PMK_NAME_LEN]; /* PMKR1Name from EAPOL-Key
- * message 2/4 */
- u8 *assoc_resp_ftie;
-#endif /* CONFIG_IEEE80211R */
-
- int pending_1_of_4_timeout;
-};
-
-
-/* per group key state machine data */
-struct wpa_group {
- struct wpa_group *next;
- int vlan_id;
-
- Boolean GInit;
- int GKeyDoneStations;
- Boolean GTKReKey;
- int GTK_len;
- int GN, GM;
- Boolean GTKAuthenticator;
- u8 Counter[WPA_NONCE_LEN];
-
- enum {
- WPA_GROUP_GTK_INIT = 0,
- WPA_GROUP_SETKEYS, WPA_GROUP_SETKEYSDONE
- } wpa_group_state;
-
- u8 GMK[WPA_GMK_LEN];
- u8 GTK[2][WPA_GTK_MAX_LEN];
- u8 GNonce[WPA_NONCE_LEN];
- Boolean changed;
- Boolean first_sta_seen;
- Boolean reject_4way_hs_for_entropy;
-#ifdef CONFIG_IEEE80211W
- u8 IGTK[2][WPA_IGTK_LEN];
- int GN_igtk, GM_igtk;
-#endif /* CONFIG_IEEE80211W */
-};
-
-
-struct wpa_ft_pmk_cache;
-
-/* per authenticator data */
-struct wpa_authenticator {
- struct wpa_group *group;
-
- unsigned int dot11RSNAStatsTKIPRemoteMICFailures;
- u32 dot11RSNAAuthenticationSuiteSelected;
- u32 dot11RSNAPairwiseCipherSelected;
- u32 dot11RSNAGroupCipherSelected;
- u8 dot11RSNAPMKIDUsed[PMKID_LEN];
- u32 dot11RSNAAuthenticationSuiteRequested; /* FIX: update */
- u32 dot11RSNAPairwiseCipherRequested; /* FIX: update */
- u32 dot11RSNAGroupCipherRequested; /* FIX: update */
- unsigned int dot11RSNATKIPCounterMeasuresInvoked;
- unsigned int dot11RSNA4WayHandshakeFailures;
-
- struct wpa_stsl_negotiation *stsl_negotiations;
-
- struct wpa_auth_config conf;
- struct wpa_auth_callbacks cb;
-
- u8 *wpa_ie;
- size_t wpa_ie_len;
-
- u8 addr[ETH_ALEN];
-
- struct rsn_pmksa_cache *pmksa;
- struct wpa_ft_pmk_cache *ft_pmk_cache;
-};
-
-
-int wpa_write_rsn_ie(struct wpa_auth_config *conf, u8 *buf, size_t len,
- const u8 *pmkid);
-void wpa_auth_logger(struct wpa_authenticator *wpa_auth, const u8 *addr,
- logger_level level, const char *txt);
-void wpa_auth_vlogger(struct wpa_authenticator *wpa_auth, const u8 *addr,
- logger_level level, const char *fmt, ...);
-void __wpa_send_eapol(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, int key_info,
- const u8 *key_rsc, const u8 *nonce,
- const u8 *kde, size_t kde_len,
- int keyidx, int encr, int force_version);
-int wpa_auth_for_each_sta(struct wpa_authenticator *wpa_auth,
- int (*cb)(struct wpa_state_machine *sm, void *ctx),
- void *cb_ctx);
-int wpa_auth_for_each_auth(struct wpa_authenticator *wpa_auth,
- int (*cb)(struct wpa_authenticator *a, void *ctx),
- void *cb_ctx);
-
-#ifdef CONFIG_PEERKEY
-int wpa_stsl_remove(struct wpa_authenticator *wpa_auth,
- struct wpa_stsl_negotiation *neg);
-void wpa_smk_error(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, struct wpa_eapol_key *key);
-void wpa_smk_m1(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, struct wpa_eapol_key *key);
-void wpa_smk_m3(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm, struct wpa_eapol_key *key);
-#endif /* CONFIG_PEERKEY */
-
-#ifdef CONFIG_IEEE80211R
-int wpa_write_mdie(struct wpa_auth_config *conf, u8 *buf, size_t len);
-int wpa_write_ftie(struct wpa_auth_config *conf, const u8 *r0kh_id,
- size_t r0kh_id_len,
- const u8 *anonce, const u8 *snonce,
- u8 *buf, size_t len, const u8 *subelem,
- size_t subelem_len);
-int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, const u8 *pmk,
- struct wpa_ptk *ptk, size_t ptk_len);
-struct wpa_ft_pmk_cache * wpa_ft_pmk_cache_init(void);
-void wpa_ft_pmk_cache_deinit(struct wpa_ft_pmk_cache *cache);
-void wpa_ft_install_ptk(struct wpa_state_machine *sm);
-#endif /* CONFIG_IEEE80211R */
-
-#endif /* WPA_AUTH_I_H */
diff --git a/hostapd-0.8/src/ap/wpa_auth_ie.c b/hostapd-0.8/src/ap/wpa_auth_ie.c
deleted file mode 100644
index 5e8d134..0000000
--- a/hostapd-0.8/src/ap/wpa_auth_ie.c
+++ /dev/null
@@ -1,824 +0,0 @@
-/*
- * hostapd - WPA/RSN IE and KDE definitions
- * Copyright (c) 2004-2008, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "common/ieee802_11_defs.h"
-#include "eapol_auth/eapol_auth_sm.h"
-#include "ap_config.h"
-#include "ieee802_11.h"
-#include "wpa_auth.h"
-#include "pmksa_cache_auth.h"
-#include "wpa_auth_ie.h"
-#include "wpa_auth_i.h"
-
-
-#ifdef CONFIG_RSN_TESTING
-int rsn_testing = 0;
-#endif /* CONFIG_RSN_TESTING */
-
-
-static int wpa_write_wpa_ie(struct wpa_auth_config *conf, u8 *buf, size_t len)
-{
- struct wpa_ie_hdr *hdr;
- int num_suites;
- u8 *pos, *count;
-
- hdr = (struct wpa_ie_hdr *) buf;
- hdr->elem_id = WLAN_EID_VENDOR_SPECIFIC;
- RSN_SELECTOR_PUT(hdr->oui, WPA_OUI_TYPE);
- WPA_PUT_LE16(hdr->version, WPA_VERSION);
- pos = (u8 *) (hdr + 1);
-
- if (conf->wpa_group == WPA_CIPHER_CCMP) {
- RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_CCMP);
- } else if (conf->wpa_group == WPA_CIPHER_TKIP) {
- RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_TKIP);
- } else if (conf->wpa_group == WPA_CIPHER_WEP104) {
- RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_WEP104);
- } else if (conf->wpa_group == WPA_CIPHER_WEP40) {
- RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_WEP40);
- } else {
- wpa_printf(MSG_DEBUG, "Invalid group cipher (%d).",
- conf->wpa_group);
- return -1;
- }
- pos += WPA_SELECTOR_LEN;
-
- num_suites = 0;
- count = pos;
- pos += 2;
-
- if (conf->wpa_pairwise & WPA_CIPHER_CCMP) {
- RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_CCMP);
- pos += WPA_SELECTOR_LEN;
- num_suites++;
- }
- if (conf->wpa_pairwise & WPA_CIPHER_TKIP) {
- RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_TKIP);
- pos += WPA_SELECTOR_LEN;
- num_suites++;
- }
- if (conf->wpa_pairwise & WPA_CIPHER_NONE) {
- RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_NONE);
- pos += WPA_SELECTOR_LEN;
- num_suites++;
- }
-
- if (num_suites == 0) {
- wpa_printf(MSG_DEBUG, "Invalid pairwise cipher (%d).",
- conf->wpa_pairwise);
- return -1;
- }
- WPA_PUT_LE16(count, num_suites);
-
- num_suites = 0;
- count = pos;
- pos += 2;
-
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X) {
- RSN_SELECTOR_PUT(pos, WPA_AUTH_KEY_MGMT_UNSPEC_802_1X);
- pos += WPA_SELECTOR_LEN;
- num_suites++;
- }
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK) {
- RSN_SELECTOR_PUT(pos, WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X);
- pos += WPA_SELECTOR_LEN;
- num_suites++;
- }
-
- if (num_suites == 0) {
- wpa_printf(MSG_DEBUG, "Invalid key management type (%d).",
- conf->wpa_key_mgmt);
- return -1;
- }
- WPA_PUT_LE16(count, num_suites);
-
- /* WPA Capabilities; use defaults, so no need to include it */
-
- hdr->len = (pos - buf) - 2;
-
- return pos - buf;
-}
-
-
-int wpa_write_rsn_ie(struct wpa_auth_config *conf, u8 *buf, size_t len,
- const u8 *pmkid)
-{
- struct rsn_ie_hdr *hdr;
- int num_suites;
- u8 *pos, *count;
- u16 capab;
-
- hdr = (struct rsn_ie_hdr *) buf;
- hdr->elem_id = WLAN_EID_RSN;
- WPA_PUT_LE16(hdr->version, RSN_VERSION);
- pos = (u8 *) (hdr + 1);
-
- if (conf->wpa_group == WPA_CIPHER_CCMP) {
- RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP);
- } else if (conf->wpa_group == WPA_CIPHER_TKIP) {
- RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_TKIP);
- } else if (conf->wpa_group == WPA_CIPHER_WEP104) {
- RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_WEP104);
- } else if (conf->wpa_group == WPA_CIPHER_WEP40) {
- RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_WEP40);
- } else {
- wpa_printf(MSG_DEBUG, "Invalid group cipher (%d).",
- conf->wpa_group);
- return -1;
- }
- pos += RSN_SELECTOR_LEN;
-
- num_suites = 0;
- count = pos;
- pos += 2;
-
-#ifdef CONFIG_RSN_TESTING
- if (rsn_testing) {
- RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 1));
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
-#endif /* CONFIG_RSN_TESTING */
-
- if (conf->rsn_pairwise & WPA_CIPHER_CCMP) {
- RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP);
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
- if (conf->rsn_pairwise & WPA_CIPHER_TKIP) {
- RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_TKIP);
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
- if (conf->rsn_pairwise & WPA_CIPHER_NONE) {
- RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_NONE);
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
-
-#ifdef CONFIG_RSN_TESTING
- if (rsn_testing) {
- RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 2));
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
-#endif /* CONFIG_RSN_TESTING */
-
- if (num_suites == 0) {
- wpa_printf(MSG_DEBUG, "Invalid pairwise cipher (%d).",
- conf->rsn_pairwise);
- return -1;
- }
- WPA_PUT_LE16(count, num_suites);
-
- num_suites = 0;
- count = pos;
- pos += 2;
-
-#ifdef CONFIG_RSN_TESTING
- if (rsn_testing) {
- RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 1));
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
-#endif /* CONFIG_RSN_TESTING */
-
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X) {
- RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_UNSPEC_802_1X);
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK) {
- RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X);
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
-#ifdef CONFIG_IEEE80211R
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) {
- RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_802_1X);
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_PSK) {
- RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_PSK);
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
-#endif /* CONFIG_IEEE80211R */
-#ifdef CONFIG_IEEE80211W
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) {
- RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_802_1X_SHA256);
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK_SHA256) {
- RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_PSK_SHA256);
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
-#endif /* CONFIG_IEEE80211W */
-
-#ifdef CONFIG_RSN_TESTING
- if (rsn_testing) {
- RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 2));
- pos += RSN_SELECTOR_LEN;
- num_suites++;
- }
-#endif /* CONFIG_RSN_TESTING */
-
- if (num_suites == 0) {
- wpa_printf(MSG_DEBUG, "Invalid key management type (%d).",
- conf->wpa_key_mgmt);
- return -1;
- }
- WPA_PUT_LE16(count, num_suites);
-
- /* RSN Capabilities */
- capab = 0;
- if (conf->rsn_preauth)
- capab |= WPA_CAPABILITY_PREAUTH;
- if (conf->peerkey)
- capab |= WPA_CAPABILITY_PEERKEY_ENABLED;
- if (conf->wmm_enabled) {
- /* 4 PTKSA replay counters when using WMM */
- capab |= (RSN_NUM_REPLAY_COUNTERS_16 << 2);
- }
-#ifdef CONFIG_IEEE80211W
- if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION) {
- capab |= WPA_CAPABILITY_MFPC;
- if (conf->ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED)
- capab |= WPA_CAPABILITY_MFPR;
- }
-#endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_RSN_TESTING
- if (rsn_testing)
- capab |= BIT(8) | BIT(14) | BIT(15);
-#endif /* CONFIG_RSN_TESTING */
- WPA_PUT_LE16(pos, capab);
- pos += 2;
-
- if (pmkid) {
- if (pos + 2 + PMKID_LEN > buf + len)
- return -1;
- /* PMKID Count */
- WPA_PUT_LE16(pos, 1);
- pos += 2;
- os_memcpy(pos, pmkid, PMKID_LEN);
- pos += PMKID_LEN;
- }
-
-#ifdef CONFIG_IEEE80211W
- if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION) {
- if (pos + 2 + 4 > buf + len)
- return -1;
- if (pmkid == NULL) {
- /* PMKID Count */
- WPA_PUT_LE16(pos, 0);
- pos += 2;
- }
-
- /* Management Group Cipher Suite */
- RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_AES_128_CMAC);
- pos += RSN_SELECTOR_LEN;
- }
-#endif /* CONFIG_IEEE80211W */
-
-#ifdef CONFIG_RSN_TESTING
- if (rsn_testing) {
- /*
- * Fill in any defined fields and add extra data to the end of
- * the element.
- */
- int pmkid_count_set = pmkid != NULL;
- if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION)
- pmkid_count_set = 1;
- /* PMKID Count */
- WPA_PUT_LE16(pos, 0);
- pos += 2;
- if (conf->ieee80211w == NO_MGMT_FRAME_PROTECTION) {
- /* Management Group Cipher Suite */
- RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_AES_128_CMAC);
- pos += RSN_SELECTOR_LEN;
- }
-
- os_memset(pos, 0x12, 17);
- pos += 17;
- }
-#endif /* CONFIG_RSN_TESTING */
-
- hdr->len = (pos - buf) - 2;
-
- return pos - buf;
-}
-
-
-int wpa_auth_gen_wpa_ie(struct wpa_authenticator *wpa_auth)
-{
- u8 *pos, buf[128];
- int res;
-
- pos = buf;
-
- if (wpa_auth->conf.wpa & WPA_PROTO_RSN) {
- res = wpa_write_rsn_ie(&wpa_auth->conf,
- pos, buf + sizeof(buf) - pos, NULL);
- if (res < 0)
- return res;
- pos += res;
- }
-#ifdef CONFIG_IEEE80211R
- if (wpa_auth->conf.wpa_key_mgmt &
- (WPA_KEY_MGMT_FT_IEEE8021X | WPA_KEY_MGMT_FT_PSK)) {
- res = wpa_write_mdie(&wpa_auth->conf, pos,
- buf + sizeof(buf) - pos);
- if (res < 0)
- return res;
- pos += res;
- }
-#endif /* CONFIG_IEEE80211R */
- if (wpa_auth->conf.wpa & WPA_PROTO_WPA) {
- res = wpa_write_wpa_ie(&wpa_auth->conf,
- pos, buf + sizeof(buf) - pos);
- if (res < 0)
- return res;
- pos += res;
- }
-
- os_free(wpa_auth->wpa_ie);
- wpa_auth->wpa_ie = os_malloc(pos - buf);
- if (wpa_auth->wpa_ie == NULL)
- return -1;
- os_memcpy(wpa_auth->wpa_ie, buf, pos - buf);
- wpa_auth->wpa_ie_len = pos - buf;
-
- return 0;
-}
-
-
-u8 * wpa_add_kde(u8 *pos, u32 kde, const u8 *data, size_t data_len,
- const u8 *data2, size_t data2_len)
-{
- *pos++ = WLAN_EID_VENDOR_SPECIFIC;
- *pos++ = RSN_SELECTOR_LEN + data_len + data2_len;
- RSN_SELECTOR_PUT(pos, kde);
- pos += RSN_SELECTOR_LEN;
- os_memcpy(pos, data, data_len);
- pos += data_len;
- if (data2) {
- os_memcpy(pos, data2, data2_len);
- pos += data2_len;
- }
- return pos;
-}
-
-
-struct wpa_auth_okc_iter_data {
- struct rsn_pmksa_cache_entry *pmksa;
- const u8 *aa;
- const u8 *spa;
- const u8 *pmkid;
-};
-
-
-static int wpa_auth_okc_iter(struct wpa_authenticator *a, void *ctx)
-{
- struct wpa_auth_okc_iter_data *data = ctx;
- data->pmksa = pmksa_cache_get_okc(a->pmksa, data->aa, data->spa,
- data->pmkid);
- if (data->pmksa)
- return 1;
- return 0;
-}
-
-
-int wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth,
- struct wpa_state_machine *sm,
- const u8 *wpa_ie, size_t wpa_ie_len,
- const u8 *mdie, size_t mdie_len)
-{
- struct wpa_ie_data data;
- int ciphers, key_mgmt, res, version;
- u32 selector;
- size_t i;
- const u8 *pmkid = NULL;
-
- if (wpa_auth == NULL || sm == NULL)
- return WPA_NOT_ENABLED;
-
- if (wpa_ie == NULL || wpa_ie_len < 1)
- return WPA_INVALID_IE;
-
- if (wpa_ie[0] == WLAN_EID_RSN)
- version = WPA_PROTO_RSN;
- else
- version = WPA_PROTO_WPA;
-
- if (!(wpa_auth->conf.wpa & version)) {
- wpa_printf(MSG_DEBUG, "Invalid WPA proto (%d) from " MACSTR,
- version, MAC2STR(sm->addr));
- return WPA_INVALID_PROTO;
- }
-
- if (version == WPA_PROTO_RSN) {
- res = wpa_parse_wpa_ie_rsn(wpa_ie, wpa_ie_len, &data);
-
- selector = RSN_AUTH_KEY_MGMT_UNSPEC_802_1X;
- if (0) {
- }
-#ifdef CONFIG_IEEE80211R
- else if (data.key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)
- selector = RSN_AUTH_KEY_MGMT_FT_802_1X;
- else if (data.key_mgmt & WPA_KEY_MGMT_FT_PSK)
- selector = RSN_AUTH_KEY_MGMT_FT_PSK;
-#endif /* CONFIG_IEEE80211R */
-#ifdef CONFIG_IEEE80211W
- else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)
- selector = RSN_AUTH_KEY_MGMT_802_1X_SHA256;
- else if (data.key_mgmt & WPA_KEY_MGMT_PSK_SHA256)
- selector = RSN_AUTH_KEY_MGMT_PSK_SHA256;
-#endif /* CONFIG_IEEE80211W */
- else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X)
- selector = RSN_AUTH_KEY_MGMT_UNSPEC_802_1X;
- else if (data.key_mgmt & WPA_KEY_MGMT_PSK)
- selector = RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X;
- wpa_auth->dot11RSNAAuthenticationSuiteSelected = selector;
-
- selector = RSN_CIPHER_SUITE_CCMP;
- if (data.pairwise_cipher & WPA_CIPHER_CCMP)
- selector = RSN_CIPHER_SUITE_CCMP;
- else if (data.pairwise_cipher & WPA_CIPHER_TKIP)
- selector = RSN_CIPHER_SUITE_TKIP;
- else if (data.pairwise_cipher & WPA_CIPHER_WEP104)
- selector = RSN_CIPHER_SUITE_WEP104;
- else if (data.pairwise_cipher & WPA_CIPHER_WEP40)
- selector = RSN_CIPHER_SUITE_WEP40;
- else if (data.pairwise_cipher & WPA_CIPHER_NONE)
- selector = RSN_CIPHER_SUITE_NONE;
- wpa_auth->dot11RSNAPairwiseCipherSelected = selector;
-
- selector = RSN_CIPHER_SUITE_CCMP;
- if (data.group_cipher & WPA_CIPHER_CCMP)
- selector = RSN_CIPHER_SUITE_CCMP;
- else if (data.group_cipher & WPA_CIPHER_TKIP)
- selector = RSN_CIPHER_SUITE_TKIP;
- else if (data.group_cipher & WPA_CIPHER_WEP104)
- selector = RSN_CIPHER_SUITE_WEP104;
- else if (data.group_cipher & WPA_CIPHER_WEP40)
- selector = RSN_CIPHER_SUITE_WEP40;
- else if (data.group_cipher & WPA_CIPHER_NONE)
- selector = RSN_CIPHER_SUITE_NONE;
- wpa_auth->dot11RSNAGroupCipherSelected = selector;
- } else {
- res = wpa_parse_wpa_ie_wpa(wpa_ie, wpa_ie_len, &data);
-
- selector = WPA_AUTH_KEY_MGMT_UNSPEC_802_1X;
- if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X)
- selector = WPA_AUTH_KEY_MGMT_UNSPEC_802_1X;
- else if (data.key_mgmt & WPA_KEY_MGMT_PSK)
- selector = WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X;
- wpa_auth->dot11RSNAAuthenticationSuiteSelected = selector;
-
- selector = WPA_CIPHER_SUITE_TKIP;
- if (data.pairwise_cipher & WPA_CIPHER_CCMP)
- selector = WPA_CIPHER_SUITE_CCMP;
- else if (data.pairwise_cipher & WPA_CIPHER_TKIP)
- selector = WPA_CIPHER_SUITE_TKIP;
- else if (data.pairwise_cipher & WPA_CIPHER_WEP104)
- selector = WPA_CIPHER_SUITE_WEP104;
- else if (data.pairwise_cipher & WPA_CIPHER_WEP40)
- selector = WPA_CIPHER_SUITE_WEP40;
- else if (data.pairwise_cipher & WPA_CIPHER_NONE)
- selector = WPA_CIPHER_SUITE_NONE;
- wpa_auth->dot11RSNAPairwiseCipherSelected = selector;
-
- selector = WPA_CIPHER_SUITE_TKIP;
- if (data.group_cipher & WPA_CIPHER_CCMP)
- selector = WPA_CIPHER_SUITE_CCMP;
- else if (data.group_cipher & WPA_CIPHER_TKIP)
- selector = WPA_CIPHER_SUITE_TKIP;
- else if (data.group_cipher & WPA_CIPHER_WEP104)
- selector = WPA_CIPHER_SUITE_WEP104;
- else if (data.group_cipher & WPA_CIPHER_WEP40)
- selector = WPA_CIPHER_SUITE_WEP40;
- else if (data.group_cipher & WPA_CIPHER_NONE)
- selector = WPA_CIPHER_SUITE_NONE;
- wpa_auth->dot11RSNAGroupCipherSelected = selector;
- }
- if (res) {
- wpa_printf(MSG_DEBUG, "Failed to parse WPA/RSN IE from "
- MACSTR " (res=%d)", MAC2STR(sm->addr), res);
- wpa_hexdump(MSG_DEBUG, "WPA/RSN IE", wpa_ie, wpa_ie_len);
- return WPA_INVALID_IE;
- }
-
- if (data.group_cipher != wpa_auth->conf.wpa_group) {
- wpa_printf(MSG_DEBUG, "Invalid WPA group cipher (0x%x) from "
- MACSTR, data.group_cipher, MAC2STR(sm->addr));
- return WPA_INVALID_GROUP;
- }
-
- key_mgmt = data.key_mgmt & wpa_auth->conf.wpa_key_mgmt;
- if (!key_mgmt) {
- wpa_printf(MSG_DEBUG, "Invalid WPA key mgmt (0x%x) from "
- MACSTR, data.key_mgmt, MAC2STR(sm->addr));
- return WPA_INVALID_AKMP;
- }
- if (0) {
- }
-#ifdef CONFIG_IEEE80211R
- else if (key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)
- sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
- else if (key_mgmt & WPA_KEY_MGMT_FT_PSK)
- sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_PSK;
-#endif /* CONFIG_IEEE80211R */
-#ifdef CONFIG_IEEE80211W
- else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)
- sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
- else if (key_mgmt & WPA_KEY_MGMT_PSK_SHA256)
- sm->wpa_key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
-#endif /* CONFIG_IEEE80211W */
- else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X)
- sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X;
- else
- sm->wpa_key_mgmt = WPA_KEY_MGMT_PSK;
-
- if (version == WPA_PROTO_RSN)
- ciphers = data.pairwise_cipher & wpa_auth->conf.rsn_pairwise;
- else
- ciphers = data.pairwise_cipher & wpa_auth->conf.wpa_pairwise;
- if (!ciphers) {
- wpa_printf(MSG_DEBUG, "Invalid %s pairwise cipher (0x%x) "
- "from " MACSTR,
- version == WPA_PROTO_RSN ? "RSN" : "WPA",
- data.pairwise_cipher, MAC2STR(sm->addr));
- return WPA_INVALID_PAIRWISE;
- }
-
-#ifdef CONFIG_IEEE80211W
- if (wpa_auth->conf.ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED) {
- if (!(data.capabilities & WPA_CAPABILITY_MFPC)) {
- wpa_printf(MSG_DEBUG, "Management frame protection "
- "required, but client did not enable it");
- return WPA_MGMT_FRAME_PROTECTION_VIOLATION;
- }
-
- if (ciphers & WPA_CIPHER_TKIP) {
- wpa_printf(MSG_DEBUG, "Management frame protection "
- "cannot use TKIP");
- return WPA_MGMT_FRAME_PROTECTION_VIOLATION;
- }
-
- if (data.mgmt_group_cipher != WPA_CIPHER_AES_128_CMAC) {
- wpa_printf(MSG_DEBUG, "Unsupported management group "
- "cipher %d", data.mgmt_group_cipher);
- return WPA_INVALID_MGMT_GROUP_CIPHER;
- }
- }
-
- if (wpa_auth->conf.ieee80211w == NO_MGMT_FRAME_PROTECTION ||
- !(data.capabilities & WPA_CAPABILITY_MFPC))
- sm->mgmt_frame_prot = 0;
- else
- sm->mgmt_frame_prot = 1;
-#endif /* CONFIG_IEEE80211W */
-
-#ifdef CONFIG_IEEE80211R
- if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
- if (mdie == NULL || mdie_len < MOBILITY_DOMAIN_ID_LEN + 1) {
- wpa_printf(MSG_DEBUG, "RSN: Trying to use FT, but "
- "MDIE not included");
- return WPA_INVALID_MDIE;
- }
- if (os_memcmp(mdie, wpa_auth->conf.mobility_domain,
- MOBILITY_DOMAIN_ID_LEN) != 0) {
- wpa_hexdump(MSG_DEBUG, "RSN: Attempted to use unknown "
- "MDIE", mdie, MOBILITY_DOMAIN_ID_LEN);
- return WPA_INVALID_MDIE;
- }
- }
-#endif /* CONFIG_IEEE80211R */
-
- if (ciphers & WPA_CIPHER_CCMP)
- sm->pairwise = WPA_CIPHER_CCMP;
- else
- sm->pairwise = WPA_CIPHER_TKIP;
-
- /* TODO: clear WPA/WPA2 state if STA changes from one to another */
- if (wpa_ie[0] == WLAN_EID_RSN)
- sm->wpa = WPA_VERSION_WPA2;
- else
- sm->wpa = WPA_VERSION_WPA;
-
- sm->pmksa = NULL;
- for (i = 0; i < data.num_pmkid; i++) {
- wpa_hexdump(MSG_DEBUG, "RSN IE: STA PMKID",
- &data.pmkid[i * PMKID_LEN], PMKID_LEN);
- sm->pmksa = pmksa_cache_auth_get(wpa_auth->pmksa, sm->addr,
- &data.pmkid[i * PMKID_LEN]);
- if (sm->pmksa) {
- pmkid = sm->pmksa->pmkid;
- break;
- }
- }
- for (i = 0; sm->pmksa == NULL && wpa_auth->conf.okc &&
- i < data.num_pmkid; i++) {
- struct wpa_auth_okc_iter_data idata;
- idata.pmksa = NULL;
- idata.aa = wpa_auth->addr;
- idata.spa = sm->addr;
- idata.pmkid = &data.pmkid[i * PMKID_LEN];
- wpa_auth_for_each_auth(wpa_auth, wpa_auth_okc_iter, &idata);
- if (idata.pmksa) {
- wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
- "OKC match for PMKID");
- sm->pmksa = pmksa_cache_add_okc(wpa_auth->pmksa,
- idata.pmksa,
- wpa_auth->addr,
- idata.pmkid);
- pmkid = idata.pmkid;
- break;
- }
- }
- if (sm->pmksa) {
- wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
- "PMKID found from PMKSA cache "
- "eap_type=%d vlan_id=%d",
- sm->pmksa->eap_type_authsrv,
- sm->pmksa->vlan_id);
- os_memcpy(wpa_auth->dot11RSNAPMKIDUsed, pmkid, PMKID_LEN);
- }
-
- if (sm->wpa_ie == NULL || sm->wpa_ie_len < wpa_ie_len) {
- os_free(sm->wpa_ie);
- sm->wpa_ie = os_malloc(wpa_ie_len);
- if (sm->wpa_ie == NULL)
- return WPA_ALLOC_FAIL;
- }
- os_memcpy(sm->wpa_ie, wpa_ie, wpa_ie_len);
- sm->wpa_ie_len = wpa_ie_len;
-
- return WPA_IE_OK;
-}
-
-
-/**
- * wpa_parse_generic - Parse EAPOL-Key Key Data Generic IEs
- * @pos: Pointer to the IE header
- * @end: Pointer to the end of the Key Data buffer
- * @ie: Pointer to parsed IE data
- * Returns: 0 on success, 1 if end mark is found, -1 on failure
- */
-static int wpa_parse_generic(const u8 *pos, const u8 *end,
- struct wpa_eapol_ie_parse *ie)
-{
- if (pos[1] == 0)
- return 1;
-
- if (pos[1] >= 6 &&
- RSN_SELECTOR_GET(pos + 2) == WPA_OUI_TYPE &&
- pos[2 + WPA_SELECTOR_LEN] == 1 &&
- pos[2 + WPA_SELECTOR_LEN + 1] == 0) {
- ie->wpa_ie = pos;
- ie->wpa_ie_len = pos[1] + 2;
- return 0;
- }
-
- if (pos + 1 + RSN_SELECTOR_LEN < end &&
- pos[1] >= RSN_SELECTOR_LEN + PMKID_LEN &&
- RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_PMKID) {
- ie->pmkid = pos + 2 + RSN_SELECTOR_LEN;
- return 0;
- }
-
- if (pos[1] > RSN_SELECTOR_LEN + 2 &&
- RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_GROUPKEY) {
- ie->gtk = pos + 2 + RSN_SELECTOR_LEN;
- ie->gtk_len = pos[1] - RSN_SELECTOR_LEN;
- return 0;
- }
-
- if (pos[1] > RSN_SELECTOR_LEN + 2 &&
- RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_MAC_ADDR) {
- ie->mac_addr = pos + 2 + RSN_SELECTOR_LEN;
- ie->mac_addr_len = pos[1] - RSN_SELECTOR_LEN;
- return 0;
- }
-
-#ifdef CONFIG_PEERKEY
- if (pos[1] > RSN_SELECTOR_LEN + 2 &&
- RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_SMK) {
- ie->smk = pos + 2 + RSN_SELECTOR_LEN;
- ie->smk_len = pos[1] - RSN_SELECTOR_LEN;
- return 0;
- }
-
- if (pos[1] > RSN_SELECTOR_LEN + 2 &&
- RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_NONCE) {
- ie->nonce = pos + 2 + RSN_SELECTOR_LEN;
- ie->nonce_len = pos[1] - RSN_SELECTOR_LEN;
- return 0;
- }
-
- if (pos[1] > RSN_SELECTOR_LEN + 2 &&
- RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_LIFETIME) {
- ie->lifetime = pos + 2 + RSN_SELECTOR_LEN;
- ie->lifetime_len = pos[1] - RSN_SELECTOR_LEN;
- return 0;
- }
-
- if (pos[1] > RSN_SELECTOR_LEN + 2 &&
- RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_ERROR) {
- ie->error = pos + 2 + RSN_SELECTOR_LEN;
- ie->error_len = pos[1] - RSN_SELECTOR_LEN;
- return 0;
- }
-#endif /* CONFIG_PEERKEY */
-
-#ifdef CONFIG_IEEE80211W
- if (pos[1] > RSN_SELECTOR_LEN + 2 &&
- RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_IGTK) {
- ie->igtk = pos + 2 + RSN_SELECTOR_LEN;
- ie->igtk_len = pos[1] - RSN_SELECTOR_LEN;
- return 0;
- }
-#endif /* CONFIG_IEEE80211W */
-
- return 0;
-}
-
-
-/**
- * wpa_parse_kde_ies - Parse EAPOL-Key Key Data IEs
- * @buf: Pointer to the Key Data buffer
- * @len: Key Data Length
- * @ie: Pointer to parsed IE data
- * Returns: 0 on success, -1 on failure
- */
-int wpa_parse_kde_ies(const u8 *buf, size_t len, struct wpa_eapol_ie_parse *ie)
-{
- const u8 *pos, *end;
- int ret = 0;
-
- os_memset(ie, 0, sizeof(*ie));
- for (pos = buf, end = pos + len; pos + 1 < end; pos += 2 + pos[1]) {
- if (pos[0] == 0xdd &&
- ((pos == buf + len - 1) || pos[1] == 0)) {
- /* Ignore padding */
- break;
- }
- if (pos + 2 + pos[1] > end) {
- wpa_printf(MSG_DEBUG, "WPA: EAPOL-Key Key Data "
- "underflow (ie=%d len=%d pos=%d)",
- pos[0], pos[1], (int) (pos - buf));
- wpa_hexdump_key(MSG_DEBUG, "WPA: Key Data",
- buf, len);
- ret = -1;
- break;
- }
- if (*pos == WLAN_EID_RSN) {
- ie->rsn_ie = pos;
- ie->rsn_ie_len = pos[1] + 2;
-#ifdef CONFIG_IEEE80211R
- } else if (*pos == WLAN_EID_MOBILITY_DOMAIN) {
- ie->mdie = pos;
- ie->mdie_len = pos[1] + 2;
- } else if (*pos == WLAN_EID_FAST_BSS_TRANSITION) {
- ie->ftie = pos;
- ie->ftie_len = pos[1] + 2;
-#endif /* CONFIG_IEEE80211R */
- } else if (*pos == WLAN_EID_VENDOR_SPECIFIC) {
- ret = wpa_parse_generic(pos, end, ie);
- if (ret < 0)
- break;
- if (ret > 0) {
- ret = 0;
- break;
- }
- } else {
- wpa_hexdump(MSG_DEBUG, "WPA: Unrecognized EAPOL-Key "
- "Key Data IE", pos, 2 + pos[1]);
- }
- }
-
- return ret;
-}
-
-
-int wpa_auth_uses_mfp(struct wpa_state_machine *sm)
-{
- return sm ? sm->mgmt_frame_prot : 0;
-}
diff --git a/hostapd-0.8/src/ap/wpa_auth_ie.h b/hostapd-0.8/src/ap/wpa_auth_ie.h
deleted file mode 100644
index 61d4cb4..0000000
--- a/hostapd-0.8/src/ap/wpa_auth_ie.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * hostapd - WPA/RSN IE and KDE definitions
- * Copyright (c) 2004-2007, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef WPA_AUTH_IE_H
-#define WPA_AUTH_IE_H
-
-struct wpa_eapol_ie_parse {
- const u8 *wpa_ie;
- size_t wpa_ie_len;
- const u8 *rsn_ie;
- size_t rsn_ie_len;
- const u8 *pmkid;
- const u8 *gtk;
- size_t gtk_len;
- const u8 *mac_addr;
- size_t mac_addr_len;
-#ifdef CONFIG_PEERKEY
- const u8 *smk;
- size_t smk_len;
- const u8 *nonce;
- size_t nonce_len;
- const u8 *lifetime;
- size_t lifetime_len;
- const u8 *error;
- size_t error_len;
-#endif /* CONFIG_PEERKEY */
-#ifdef CONFIG_IEEE80211W
- const u8 *igtk;
- size_t igtk_len;
-#endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_IEEE80211R
- const u8 *mdie;
- size_t mdie_len;
- const u8 *ftie;
- size_t ftie_len;
-#endif /* CONFIG_IEEE80211R */
-};
-
-int wpa_parse_kde_ies(const u8 *buf, size_t len,
- struct wpa_eapol_ie_parse *ie);
-u8 * wpa_add_kde(u8 *pos, u32 kde, const u8 *data, size_t data_len,
- const u8 *data2, size_t data2_len);
-int wpa_auth_gen_wpa_ie(struct wpa_authenticator *wpa_auth);
-
-#endif /* WPA_AUTH_IE_H */
diff --git a/hostapd-0.8/src/ap/wps_hostapd.c b/hostapd-0.8/src/ap/wps_hostapd.c
deleted file mode 100644
index fcbd89b..0000000
--- a/hostapd-0.8/src/ap/wps_hostapd.c
+++ /dev/null
@@ -1,1380 +0,0 @@
-/*
- * hostapd / WPS integration
- * Copyright (c) 2008-2010, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "utils/includes.h"
-
-#include "utils/common.h"
-#include "utils/eloop.h"
-#include "utils/uuid.h"
-#include "crypto/dh_groups.h"
-#include "common/wpa_ctrl.h"
-#include "common/ieee802_11_defs.h"
-#include "common/ieee802_11_common.h"
-#include "eapol_auth/eapol_auth_sm.h"
-#include "eapol_auth/eapol_auth_sm_i.h"
-#include "wps/wps.h"
-#include "wps/wps_defs.h"
-#include "wps/wps_dev_attr.h"
-#include "hostapd.h"
-#include "ap_config.h"
-#include "ap_drv_ops.h"
-#include "beacon.h"
-#include "sta_info.h"
-#include "wps_hostapd.h"
-
-
-#ifdef CONFIG_WPS_UPNP
-#include "wps/wps_upnp.h"
-static int hostapd_wps_upnp_init(struct hostapd_data *hapd,
- struct wps_context *wps);
-static void hostapd_wps_upnp_deinit(struct hostapd_data *hapd);
-#endif /* CONFIG_WPS_UPNP */
-
-static int hostapd_wps_probe_req_rx(void *ctx, const u8 *addr,
- const u8 *ie, size_t ie_len);
-static void hostapd_wps_ap_pin_timeout(void *eloop_data, void *user_ctx);
-
-
-struct wps_for_each_data {
- int (*func)(struct hostapd_data *h, void *ctx);
- void *ctx;
-};
-
-
-static int wps_for_each(struct hostapd_iface *iface, void *ctx)
-{
- struct wps_for_each_data *data = ctx;
- size_t j;
-
- if (iface == NULL)
- return 0;
- for (j = 0; j < iface->num_bss; j++) {
- struct hostapd_data *hapd = iface->bss[j];
- int ret = data->func(hapd, data->ctx);
- if (ret)
- return ret;
- }
-
- return 0;
-}
-
-
-static int hostapd_wps_for_each(struct hostapd_data *hapd,
- int (*func)(struct hostapd_data *h, void *ctx),
- void *ctx)
-{
- struct hostapd_iface *iface = hapd->iface;
- struct wps_for_each_data data;
- data.func = func;
- data.ctx = ctx;
- if (iface->for_each_interface == NULL)
- return wps_for_each(iface, &data);
- return iface->for_each_interface(iface->interfaces, wps_for_each,
- &data);
-}
-
-
-static int hostapd_wps_new_psk_cb(void *ctx, const u8 *mac_addr, const u8 *psk,
- size_t psk_len)
-{
- struct hostapd_data *hapd = ctx;
- struct hostapd_wpa_psk *p;
- struct hostapd_ssid *ssid = &hapd->conf->ssid;
-
- wpa_printf(MSG_DEBUG, "Received new WPA/WPA2-PSK from WPS for STA "
- MACSTR, MAC2STR(mac_addr));
- wpa_hexdump_key(MSG_DEBUG, "Per-device PSK", psk, psk_len);
-
- if (psk_len != PMK_LEN) {
- wpa_printf(MSG_DEBUG, "Unexpected PSK length %lu",
- (unsigned long) psk_len);
- return -1;
- }
-
- /* Add the new PSK to runtime PSK list */
- p = os_zalloc(sizeof(*p));
- if (p == NULL)
- return -1;
- os_memcpy(p->addr, mac_addr, ETH_ALEN);
- os_memcpy(p->psk, psk, PMK_LEN);
-
- p->next = ssid->wpa_psk;
- ssid->wpa_psk = p;
-
- if (ssid->wpa_psk_file) {
- FILE *f;
- char hex[PMK_LEN * 2 + 1];
- /* Add the new PSK to PSK list file */
- f = fopen(ssid->wpa_psk_file, "a");
- if (f == NULL) {
- wpa_printf(MSG_DEBUG, "Failed to add the PSK to "
- "'%s'", ssid->wpa_psk_file);
- return -1;
- }
-
- wpa_snprintf_hex(hex, sizeof(hex), psk, psk_len);
- fprintf(f, MACSTR " %s\n", MAC2STR(mac_addr), hex);
- fclose(f);
- }
-
- return 0;
-}
-
-
-static int hostapd_wps_set_ie_cb(void *ctx, struct wpabuf *beacon_ie,
- struct wpabuf *probe_resp_ie)
-{
- struct hostapd_data *hapd = ctx;
- wpabuf_free(hapd->wps_beacon_ie);
- hapd->wps_beacon_ie = beacon_ie;
- wpabuf_free(hapd->wps_probe_resp_ie);
- hapd->wps_probe_resp_ie = probe_resp_ie;
- ieee802_11_set_beacon(hapd);
- return hostapd_set_ap_wps_ie(hapd);
-}
-
-
-static void hostapd_wps_pin_needed_cb(void *ctx, const u8 *uuid_e,
- const struct wps_device_data *dev)
-{
- struct hostapd_data *hapd = ctx;
- char uuid[40], txt[400];
- int len;
- char devtype[WPS_DEV_TYPE_BUFSIZE];
- if (uuid_bin2str(uuid_e, uuid, sizeof(uuid)))
- return;
- wpa_printf(MSG_DEBUG, "WPS: PIN needed for E-UUID %s", uuid);
- len = os_snprintf(txt, sizeof(txt), WPS_EVENT_PIN_NEEDED
- "%s " MACSTR " [%s|%s|%s|%s|%s|%s]",
- uuid, MAC2STR(dev->mac_addr), dev->device_name,
- dev->manufacturer, dev->model_name,
- dev->model_number, dev->serial_number,
- wps_dev_type_bin2str(dev->pri_dev_type, devtype,
- sizeof(devtype)));
- if (len > 0 && len < (int) sizeof(txt))
- wpa_msg(hapd->msg_ctx, MSG_INFO, "%s", txt);
-
- if (hapd->conf->wps_pin_requests) {
- FILE *f;
- struct os_time t;
- f = fopen(hapd->conf->wps_pin_requests, "a");
- if (f == NULL)
- return;
- os_get_time(&t);
- fprintf(f, "%ld\t%s\t" MACSTR "\t%s\t%s\t%s\t%s\t%s"
- "\t%s\n",
- t.sec, uuid, MAC2STR(dev->mac_addr), dev->device_name,
- dev->manufacturer, dev->model_name, dev->model_number,
- dev->serial_number,
- wps_dev_type_bin2str(dev->pri_dev_type, devtype,
- sizeof(devtype)));
- fclose(f);
- }
-}
-
-
-static void hostapd_wps_reg_success_cb(void *ctx, const u8 *mac_addr,
- const u8 *uuid_e)
-{
- struct hostapd_data *hapd = ctx;
- char uuid[40];
- if (uuid_bin2str(uuid_e, uuid, sizeof(uuid)))
- return;
- wpa_msg(hapd->msg_ctx, MSG_INFO, WPS_EVENT_REG_SUCCESS MACSTR " %s",
- MAC2STR(mac_addr), uuid);
- if (hapd->wps_reg_success_cb)
- hapd->wps_reg_success_cb(hapd->wps_reg_success_cb_ctx,
- mac_addr, uuid_e);
-}
-
-
-static void hostapd_wps_enrollee_seen_cb(void *ctx, const u8 *addr,
- const u8 *uuid_e,
- const u8 *pri_dev_type,
- u16 config_methods,
- u16 dev_password_id, u8 request_type,
- const char *dev_name)
-{
- struct hostapd_data *hapd = ctx;
- char uuid[40];
- char devtype[WPS_DEV_TYPE_BUFSIZE];
- if (uuid_bin2str(uuid_e, uuid, sizeof(uuid)))
- return;
- if (dev_name == NULL)
- dev_name = "";
- wpa_msg_ctrl(hapd->msg_ctx, MSG_INFO, WPS_EVENT_ENROLLEE_SEEN MACSTR
- " %s %s 0x%x %u %u [%s]",
- MAC2STR(addr), uuid,
- wps_dev_type_bin2str(pri_dev_type, devtype,
- sizeof(devtype)),
- config_methods, dev_password_id, request_type, dev_name);
-}
-
-
-static int str_starts(const char *str, const char *start)
-{
- return os_strncmp(str, start, os_strlen(start)) == 0;
-}
-
-
-static void wps_reload_config(void *eloop_data, void *user_ctx)
-{
- struct hostapd_iface *iface = eloop_data;
-
- wpa_printf(MSG_DEBUG, "WPS: Reload configuration data");
- if (iface->reload_config(iface) < 0) {
- wpa_printf(MSG_WARNING, "WPS: Failed to reload the updated "
- "configuration");
- }
-}
-
-
-static int hapd_wps_cred_cb(struct hostapd_data *hapd, void *ctx)
-{
- const struct wps_credential *cred = ctx;
- FILE *oconf, *nconf;
- size_t len, i;
- char *tmp_fname;
- char buf[1024];
- int multi_bss;
- int wpa;
-
- if (hapd->wps == NULL)
- return 0;
-
- wpa_hexdump_key(MSG_DEBUG, "WPS: Received Credential attribute",
- cred->cred_attr, cred->cred_attr_len);
-
- wpa_printf(MSG_DEBUG, "WPS: Received new AP Settings");
- wpa_hexdump_ascii(MSG_DEBUG, "WPS: SSID", cred->ssid, cred->ssid_len);
- wpa_printf(MSG_DEBUG, "WPS: Authentication Type 0x%x",
- cred->auth_type);
- wpa_printf(MSG_DEBUG, "WPS: Encryption Type 0x%x", cred->encr_type);
- wpa_printf(MSG_DEBUG, "WPS: Network Key Index %d", cred->key_idx);
- wpa_hexdump_key(MSG_DEBUG, "WPS: Network Key",
- cred->key, cred->key_len);
- wpa_printf(MSG_DEBUG, "WPS: MAC Address " MACSTR,
- MAC2STR(cred->mac_addr));
-
- if ((hapd->conf->wps_cred_processing == 1 ||
- hapd->conf->wps_cred_processing == 2) && cred->cred_attr) {
- size_t blen = cred->cred_attr_len * 2 + 1;
- char *_buf = os_malloc(blen);
- if (_buf) {
- wpa_snprintf_hex(_buf, blen,
- cred->cred_attr, cred->cred_attr_len);
- wpa_msg(hapd->msg_ctx, MSG_INFO, "%s%s",
- WPS_EVENT_NEW_AP_SETTINGS, _buf);
- os_free(_buf);
- }
- } else
- wpa_msg(hapd->msg_ctx, MSG_INFO, WPS_EVENT_NEW_AP_SETTINGS);
-
- if (hapd->conf->wps_cred_processing == 1)
- return 0;
-
- os_memcpy(hapd->wps->ssid, cred->ssid, cred->ssid_len);
- hapd->wps->ssid_len = cred->ssid_len;
- hapd->wps->encr_types = cred->encr_type;
- hapd->wps->auth_types = cred->auth_type;
- if (cred->key_len == 0) {
- os_free(hapd->wps->network_key);
- hapd->wps->network_key = NULL;
- hapd->wps->network_key_len = 0;
- } else {
- if (hapd->wps->network_key == NULL ||
- hapd->wps->network_key_len < cred->key_len) {
- hapd->wps->network_key_len = 0;
- os_free(hapd->wps->network_key);
- hapd->wps->network_key = os_malloc(cred->key_len);
- if (hapd->wps->network_key == NULL)
- return -1;
- }
- hapd->wps->network_key_len = cred->key_len;
- os_memcpy(hapd->wps->network_key, cred->key, cred->key_len);
- }
- hapd->wps->wps_state = WPS_STATE_CONFIGURED;
-
- len = os_strlen(hapd->iface->config_fname) + 5;
- tmp_fname = os_malloc(len);
- if (tmp_fname == NULL)
- return -1;
- os_snprintf(tmp_fname, len, "%s-new", hapd->iface->config_fname);
-
- oconf = fopen(hapd->iface->config_fname, "r");
- if (oconf == NULL) {
- wpa_printf(MSG_WARNING, "WPS: Could not open current "
- "configuration file");
- os_free(tmp_fname);
- return -1;
- }
-
- nconf = fopen(tmp_fname, "w");
- if (nconf == NULL) {
- wpa_printf(MSG_WARNING, "WPS: Could not write updated "
- "configuration file");
- os_free(tmp_fname);
- fclose(oconf);
- return -1;
- }
-
- fprintf(nconf, "# WPS configuration - START\n");
-
- fprintf(nconf, "wps_state=2\n");
-
- fprintf(nconf, "ssid=");
- for (i = 0; i < cred->ssid_len; i++)
- fputc(cred->ssid[i], nconf);
- fprintf(nconf, "\n");
-
- if ((cred->auth_type & (WPS_AUTH_WPA2 | WPS_AUTH_WPA2PSK)) &&
- (cred->auth_type & (WPS_AUTH_WPA | WPS_AUTH_WPAPSK)))
- wpa = 3;
- else if (cred->auth_type & (WPS_AUTH_WPA2 | WPS_AUTH_WPA2PSK))
- wpa = 2;
- else if (cred->auth_type & (WPS_AUTH_WPA | WPS_AUTH_WPAPSK))
- wpa = 1;
- else
- wpa = 0;
-
- if (wpa) {
- char *prefix;
- fprintf(nconf, "wpa=%d\n", wpa);
-
- fprintf(nconf, "wpa_key_mgmt=");
- prefix = "";
- if (cred->auth_type & (WPS_AUTH_WPA2 | WPS_AUTH_WPA)) {
- fprintf(nconf, "WPA-EAP");
- prefix = " ";
- }
- if (cred->auth_type & (WPS_AUTH_WPA2PSK | WPS_AUTH_WPAPSK))
- fprintf(nconf, "%sWPA-PSK", prefix);
- fprintf(nconf, "\n");
-
- fprintf(nconf, "wpa_pairwise=");
- prefix = "";
- if (cred->encr_type & WPS_ENCR_AES) {
- fprintf(nconf, "CCMP");
- prefix = " ";
- }
- if (cred->encr_type & WPS_ENCR_TKIP) {
- fprintf(nconf, "%sTKIP", prefix);
- }
- fprintf(nconf, "\n");
-
- if (cred->key_len >= 8 && cred->key_len < 64) {
- fprintf(nconf, "wpa_passphrase=");
- for (i = 0; i < cred->key_len; i++)
- fputc(cred->key[i], nconf);
- fprintf(nconf, "\n");
- } else if (cred->key_len == 64) {
- fprintf(nconf, "wpa_psk=");
- for (i = 0; i < cred->key_len; i++)
- fputc(cred->key[i], nconf);
- fprintf(nconf, "\n");
- } else {
- wpa_printf(MSG_WARNING, "WPS: Invalid key length %lu "
- "for WPA/WPA2",
- (unsigned long) cred->key_len);
- }
-
- fprintf(nconf, "auth_algs=1\n");
- } else {
- if ((cred->auth_type & WPS_AUTH_OPEN) &&
- (cred->auth_type & WPS_AUTH_SHARED))
- fprintf(nconf, "auth_algs=3\n");
- else if (cred->auth_type & WPS_AUTH_SHARED)
- fprintf(nconf, "auth_algs=2\n");
- else
- fprintf(nconf, "auth_algs=1\n");
-
- if (cred->encr_type & WPS_ENCR_WEP && cred->key_idx <= 4) {
- int key_idx = cred->key_idx;
- if (key_idx)
- key_idx--;
- fprintf(nconf, "wep_default_key=%d\n", key_idx);
- fprintf(nconf, "wep_key%d=", key_idx);
- if (cred->key_len == 10 || cred->key_len == 26) {
- /* WEP key as a hex string */
- for (i = 0; i < cred->key_len; i++)
- fputc(cred->key[i], nconf);
- } else {
- /* Raw WEP key; convert to hex */
- for (i = 0; i < cred->key_len; i++)
- fprintf(nconf, "%02x", cred->key[i]);
- }
- fprintf(nconf, "\n");
- }
- }
-
- fprintf(nconf, "# WPS configuration - END\n");
-
- multi_bss = 0;
- while (fgets(buf, sizeof(buf), oconf)) {
- if (os_strncmp(buf, "bss=", 4) == 0)
- multi_bss = 1;
- if (!multi_bss &&
- (str_starts(buf, "ssid=") ||
- str_starts(buf, "auth_algs=") ||
- str_starts(buf, "wep_default_key=") ||
- str_starts(buf, "wep_key") ||
- str_starts(buf, "wps_state=") ||
- str_starts(buf, "wpa=") ||
- str_starts(buf, "wpa_psk=") ||
- str_starts(buf, "wpa_pairwise=") ||
- str_starts(buf, "rsn_pairwise=") ||
- str_starts(buf, "wpa_key_mgmt=") ||
- str_starts(buf, "wpa_passphrase="))) {
- fprintf(nconf, "#WPS# %s", buf);
- } else
- fprintf(nconf, "%s", buf);
- }
-
- fclose(nconf);
- fclose(oconf);
-
- if (rename(tmp_fname, hapd->iface->config_fname) < 0) {
- wpa_printf(MSG_WARNING, "WPS: Failed to rename the updated "
- "configuration file: %s", strerror(errno));
- os_free(tmp_fname);
- return -1;
- }
-
- os_free(tmp_fname);
-
- /* Schedule configuration reload after short period of time to allow
- * EAP-WSC to be finished.
- */
- eloop_register_timeout(0, 100000, wps_reload_config, hapd->iface,
- NULL);
-
- wpa_printf(MSG_DEBUG, "WPS: AP configuration updated");
-
- return 0;
-}
-
-
-static int hostapd_wps_cred_cb(void *ctx, const struct wps_credential *cred)
-{
- struct hostapd_data *hapd = ctx;
- return hostapd_wps_for_each(hapd, hapd_wps_cred_cb, (void *) cred);
-}
-
-
-static void hostapd_wps_reenable_ap_pin(void *eloop_data, void *user_ctx)
-{
- struct hostapd_data *hapd = eloop_data;
-
- if (hapd->conf->ap_setup_locked)
- return;
-
- wpa_printf(MSG_DEBUG, "WPS: Re-enable AP PIN");
- wpa_msg(hapd->msg_ctx, MSG_INFO, WPS_EVENT_AP_SETUP_UNLOCKED);
- hapd->wps->ap_setup_locked = 0;
- wps_registrar_update_ie(hapd->wps->registrar);
-}
-
-
-static int wps_pwd_auth_fail(struct hostapd_data *hapd, void *ctx)
-{
- struct wps_event_pwd_auth_fail *data = ctx;
-
- if (!data->enrollee || hapd->conf->ap_pin == NULL || hapd->wps == NULL)
- return 0;
-
- /*
- * Registrar failed to prove its knowledge of the AP PIN. Lock AP setup
- * for some time if this happens multiple times to slow down brute
- * force attacks.
- */
- hapd->ap_pin_failures++;
- wpa_printf(MSG_DEBUG, "WPS: AP PIN authentication failure number %u",
- hapd->ap_pin_failures);
- if (hapd->ap_pin_failures < 3)
- return 0;
-
- wpa_msg(hapd->msg_ctx, MSG_INFO, WPS_EVENT_AP_SETUP_LOCKED);
- hapd->wps->ap_setup_locked = 1;
-
- wps_registrar_update_ie(hapd->wps->registrar);
-
- if (!hapd->conf->ap_setup_locked) {
- if (hapd->ap_pin_lockout_time == 0)
- hapd->ap_pin_lockout_time = 60;
- else if (hapd->ap_pin_lockout_time < 365 * 24 * 60 * 60 &&
- (hapd->ap_pin_failures % 3) == 0)
- hapd->ap_pin_lockout_time *= 2;
-
- wpa_printf(MSG_DEBUG, "WPS: Disable AP PIN for %u seconds",
- hapd->ap_pin_lockout_time);
- eloop_cancel_timeout(hostapd_wps_reenable_ap_pin, hapd, NULL);
- eloop_register_timeout(hapd->ap_pin_lockout_time, 0,
- hostapd_wps_reenable_ap_pin, hapd,
- NULL);
- }
-
- return 0;
-}
-
-
-static void hostapd_pwd_auth_fail(struct hostapd_data *hapd,
- struct wps_event_pwd_auth_fail *data)
-{
- hostapd_wps_for_each(hapd, wps_pwd_auth_fail, data);
-}
-
-
-static const char * wps_event_fail_reason[NUM_WPS_EI_VALUES] = {
- "No Error", /* WPS_EI_NO_ERROR */
- "TKIP Only Prohibited", /* WPS_EI_SECURITY_TKIP_ONLY_PROHIBITED */
- "WEP Prohibited" /* WPS_EI_SECURITY_WEP_PROHIBITED */
-};
-
-static void hostapd_wps_event_fail(struct hostapd_data *hapd,
- struct wps_event_fail *fail)
-{
- if (fail->error_indication > 0 &&
- fail->error_indication < NUM_WPS_EI_VALUES) {
- wpa_msg(hapd->msg_ctx, MSG_INFO,
- WPS_EVENT_FAIL "msg=%d config_error=%d reason=%d (%s)",
- fail->msg, fail->config_error, fail->error_indication,
- wps_event_fail_reason[fail->error_indication]);
- } else {
- wpa_msg(hapd->msg_ctx, MSG_INFO,
- WPS_EVENT_FAIL "msg=%d config_error=%d",
- fail->msg, fail->config_error);
- }
-}
-
-
-static void hostapd_wps_event_cb(void *ctx, enum wps_event event,
- union wps_event_data *data)
-{
- struct hostapd_data *hapd = ctx;
-
- switch (event) {
- case WPS_EV_M2D:
- break;
- case WPS_EV_FAIL:
- hostapd_wps_event_fail(hapd, &data->fail);
- break;
- case WPS_EV_SUCCESS:
- break;
- case WPS_EV_PWD_AUTH_FAIL:
- hostapd_pwd_auth_fail(hapd, &data->pwd_auth_fail);
- break;
- case WPS_EV_PBC_OVERLAP:
- break;
- case WPS_EV_PBC_TIMEOUT:
- break;
- case WPS_EV_ER_AP_ADD:
- break;
- case WPS_EV_ER_AP_REMOVE:
- break;
- case WPS_EV_ER_ENROLLEE_ADD:
- break;
- case WPS_EV_ER_ENROLLEE_REMOVE:
- break;
- case WPS_EV_ER_AP_SETTINGS:
- break;
- case WPS_EV_ER_SET_SELECTED_REGISTRAR:
- break;
- }
- if (hapd->wps_event_cb)
- hapd->wps_event_cb(hapd->wps_event_cb_ctx, event, data);
-}
-
-
-static void hostapd_wps_clear_ies(struct hostapd_data *hapd)
-{
- wpabuf_free(hapd->wps_beacon_ie);
- hapd->wps_beacon_ie = NULL;
-
- wpabuf_free(hapd->wps_probe_resp_ie);
- hapd->wps_probe_resp_ie = NULL;
-
- hostapd_set_ap_wps_ie(hapd);
-}
-
-
-static int get_uuid_cb(struct hostapd_iface *iface, void *ctx)
-{
- const u8 **uuid = ctx;
- size_t j;
-
- if (iface == NULL)
- return 0;
- for (j = 0; j < iface->num_bss; j++) {
- struct hostapd_data *hapd = iface->bss[j];
- if (hapd->wps && !is_nil_uuid(hapd->wps->uuid)) {
- *uuid = hapd->wps->uuid;
- return 1;
- }
- }
-
- return 0;
-}
-
-
-static const u8 * get_own_uuid(struct hostapd_iface *iface)
-{
- const u8 *uuid;
- if (iface->for_each_interface == NULL)
- return NULL;
- uuid = NULL;
- iface->for_each_interface(iface->interfaces, get_uuid_cb, &uuid);
- return uuid;
-}
-
-
-static int count_interface_cb(struct hostapd_iface *iface, void *ctx)
-{
- int *count= ctx;
- (*count)++;
- return 0;
-}
-
-
-static int interface_count(struct hostapd_iface *iface)
-{
- int count = 0;
- if (iface->for_each_interface == NULL)
- return 0;
- iface->for_each_interface(iface->interfaces, count_interface_cb,
- &count);
- return count;
-}
-
-
-static int hostapd_wps_set_vendor_ext(struct hostapd_data *hapd,
- struct wps_context *wps)
-{
- int i;
-
- for (i = 0; i < MAX_WPS_VENDOR_EXTENSIONS; i++) {
- wpabuf_free(wps->dev.vendor_ext[i]);
- wps->dev.vendor_ext[i] = NULL;
-
- if (hapd->conf->wps_vendor_ext[i] == NULL)
- continue;
-
- wps->dev.vendor_ext[i] =
- wpabuf_dup(hapd->conf->wps_vendor_ext[i]);
- if (wps->dev.vendor_ext[i] == NULL) {
- while (--i >= 0)
- wpabuf_free(wps->dev.vendor_ext[i]);
- return -1;
- }
- }
-
- return 0;
-}
-
-
-int hostapd_init_wps(struct hostapd_data *hapd,
- struct hostapd_bss_config *conf)
-{
- struct wps_context *wps;
- struct wps_registrar_config cfg;
-
- if (conf->wps_state == 0) {
- hostapd_wps_clear_ies(hapd);
- return 0;
- }
-
- wps = os_zalloc(sizeof(*wps));
- if (wps == NULL)
- return -1;
-
- wps->cred_cb = hostapd_wps_cred_cb;
- wps->event_cb = hostapd_wps_event_cb;
- wps->cb_ctx = hapd;
-
- os_memset(&cfg, 0, sizeof(cfg));
- wps->wps_state = hapd->conf->wps_state;
- wps->ap_setup_locked = hapd->conf->ap_setup_locked;
- if (is_nil_uuid(hapd->conf->uuid)) {
- const u8 *uuid;
- uuid = get_own_uuid(hapd->iface);
- if (uuid) {
- os_memcpy(wps->uuid, uuid, UUID_LEN);
- wpa_hexdump(MSG_DEBUG, "WPS: Clone UUID from another "
- "interface", wps->uuid, UUID_LEN);
- } else {
- uuid_gen_mac_addr(hapd->own_addr, wps->uuid);
- wpa_hexdump(MSG_DEBUG, "WPS: UUID based on MAC "
- "address", wps->uuid, UUID_LEN);
- }
- } else {
- os_memcpy(wps->uuid, hapd->conf->uuid, UUID_LEN);
- wpa_hexdump(MSG_DEBUG, "WPS: Use configured UUID",
- wps->uuid, UUID_LEN);
- }
- wps->ssid_len = hapd->conf->ssid.ssid_len;
- os_memcpy(wps->ssid, hapd->conf->ssid.ssid, wps->ssid_len);
- wps->ap = 1;
- os_memcpy(wps->dev.mac_addr, hapd->own_addr, ETH_ALEN);
- wps->dev.device_name = hapd->conf->device_name ?
- os_strdup(hapd->conf->device_name) : NULL;
- wps->dev.manufacturer = hapd->conf->manufacturer ?
- os_strdup(hapd->conf->manufacturer) : NULL;
- wps->dev.model_name = hapd->conf->model_name ?
- os_strdup(hapd->conf->model_name) : NULL;
- wps->dev.model_number = hapd->conf->model_number ?
- os_strdup(hapd->conf->model_number) : NULL;
- wps->dev.serial_number = hapd->conf->serial_number ?
- os_strdup(hapd->conf->serial_number) : NULL;
- wps->config_methods =
- wps_config_methods_str2bin(hapd->conf->config_methods);
-#ifdef CONFIG_WPS2
- if ((wps->config_methods &
- (WPS_CONFIG_DISPLAY | WPS_CONFIG_VIRT_DISPLAY |
- WPS_CONFIG_PHY_DISPLAY)) == WPS_CONFIG_DISPLAY) {
- wpa_printf(MSG_INFO, "WPS: Converting display to "
- "virtual_display for WPS 2.0 compliance");
- wps->config_methods |= WPS_CONFIG_VIRT_DISPLAY;
- }
- if ((wps->config_methods &
- (WPS_CONFIG_PUSHBUTTON | WPS_CONFIG_VIRT_PUSHBUTTON |
- WPS_CONFIG_PHY_PUSHBUTTON)) == WPS_CONFIG_PUSHBUTTON) {
- wpa_printf(MSG_INFO, "WPS: Converting push_button to "
- "virtual_push_button for WPS 2.0 compliance");
- wps->config_methods |= WPS_CONFIG_VIRT_PUSHBUTTON;
- }
-#endif /* CONFIG_WPS2 */
- os_memcpy(wps->dev.pri_dev_type, hapd->conf->device_type,
- WPS_DEV_TYPE_LEN);
-
- if (hostapd_wps_set_vendor_ext(hapd, wps) < 0) {
- os_free(wps);
- return -1;
- }
-
- wps->dev.os_version = WPA_GET_BE32(hapd->conf->os_version);
- wps->dev.rf_bands = hapd->iconf->hw_mode == HOSTAPD_MODE_IEEE80211A ?
- WPS_RF_50GHZ : WPS_RF_24GHZ; /* FIX: dualband AP */
-
- if (conf->wpa & WPA_PROTO_RSN) {
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK)
- wps->auth_types |= WPS_AUTH_WPA2PSK;
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X)
- wps->auth_types |= WPS_AUTH_WPA2;
-
- if (conf->rsn_pairwise & WPA_CIPHER_CCMP)
- wps->encr_types |= WPS_ENCR_AES;
- if (conf->rsn_pairwise & WPA_CIPHER_TKIP)
- wps->encr_types |= WPS_ENCR_TKIP;
- }
-
- if (conf->wpa & WPA_PROTO_WPA) {
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK)
- wps->auth_types |= WPS_AUTH_WPAPSK;
- if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X)
- wps->auth_types |= WPS_AUTH_WPA;
-
- if (conf->wpa_pairwise & WPA_CIPHER_CCMP)
- wps->encr_types |= WPS_ENCR_AES;
- if (conf->wpa_pairwise & WPA_CIPHER_TKIP)
- wps->encr_types |= WPS_ENCR_TKIP;
- }
-
- if (conf->ssid.security_policy == SECURITY_PLAINTEXT) {
- wps->encr_types |= WPS_ENCR_NONE;
- wps->auth_types |= WPS_AUTH_OPEN;
- } else if (conf->ssid.security_policy == SECURITY_STATIC_WEP) {
- wps->encr_types |= WPS_ENCR_WEP;
- if (conf->auth_algs & WPA_AUTH_ALG_OPEN)
- wps->auth_types |= WPS_AUTH_OPEN;
- if (conf->auth_algs & WPA_AUTH_ALG_SHARED)
- wps->auth_types |= WPS_AUTH_SHARED;
- } else if (conf->ssid.security_policy == SECURITY_IEEE_802_1X) {
- wps->auth_types |= WPS_AUTH_OPEN;
- if (conf->default_wep_key_len)
- wps->encr_types |= WPS_ENCR_WEP;
- else
- wps->encr_types |= WPS_ENCR_NONE;
- }
-
- if (conf->ssid.wpa_psk_file) {
- /* Use per-device PSKs */
- } else if (conf->ssid.wpa_passphrase) {
- wps->network_key = (u8 *) os_strdup(conf->ssid.wpa_passphrase);
- wps->network_key_len = os_strlen(conf->ssid.wpa_passphrase);
- } else if (conf->ssid.wpa_psk) {
- wps->network_key = os_malloc(2 * PMK_LEN + 1);
- if (wps->network_key == NULL) {
- os_free(wps);
- return -1;
- }
- wpa_snprintf_hex((char *) wps->network_key, 2 * PMK_LEN + 1,
- conf->ssid.wpa_psk->psk, PMK_LEN);
- wps->network_key_len = 2 * PMK_LEN;
- } else if (conf->ssid.wep.keys_set && conf->ssid.wep.key[0]) {
- wps->network_key = os_malloc(conf->ssid.wep.len[0]);
- if (wps->network_key == NULL) {
- os_free(wps);
- return -1;
- }
- os_memcpy(wps->network_key, conf->ssid.wep.key[0],
- conf->ssid.wep.len[0]);
- wps->network_key_len = conf->ssid.wep.len[0];
- }
-
- if (conf->ssid.wpa_psk) {
- os_memcpy(wps->psk, conf->ssid.wpa_psk->psk, PMK_LEN);
- wps->psk_set = 1;
- }
-
- if (conf->wps_state == WPS_STATE_NOT_CONFIGURED) {
- /* Override parameters to enable security by default */
- wps->auth_types = WPS_AUTH_WPA2PSK | WPS_AUTH_WPAPSK;
- wps->encr_types = WPS_ENCR_AES | WPS_ENCR_TKIP;
- }
-
- wps->ap_settings = conf->ap_settings;
- wps->ap_settings_len = conf->ap_settings_len;
-
- cfg.new_psk_cb = hostapd_wps_new_psk_cb;
- cfg.set_ie_cb = hostapd_wps_set_ie_cb;
- cfg.pin_needed_cb = hostapd_wps_pin_needed_cb;
- cfg.reg_success_cb = hostapd_wps_reg_success_cb;
- cfg.enrollee_seen_cb = hostapd_wps_enrollee_seen_cb;
- cfg.cb_ctx = hapd;
- cfg.skip_cred_build = conf->skip_cred_build;
- cfg.extra_cred = conf->extra_cred;
- cfg.extra_cred_len = conf->extra_cred_len;
- cfg.disable_auto_conf = (hapd->conf->wps_cred_processing == 1) &&
- conf->skip_cred_build;
- if (conf->ssid.security_policy == SECURITY_STATIC_WEP)
- cfg.static_wep_only = 1;
- cfg.dualband = interface_count(hapd->iface) > 1;
- if (cfg.dualband)
- wpa_printf(MSG_DEBUG, "WPS: Dualband AP");
-
- wps->registrar = wps_registrar_init(wps, &cfg);
- if (wps->registrar == NULL) {
- wpa_printf(MSG_ERROR, "Failed to initialize WPS Registrar");
- os_free(wps->network_key);
- os_free(wps);
- return -1;
- }
-
-#ifdef CONFIG_WPS_UPNP
- wps->friendly_name = hapd->conf->friendly_name;
- wps->manufacturer_url = hapd->conf->manufacturer_url;
- wps->model_description = hapd->conf->model_description;
- wps->model_url = hapd->conf->model_url;
- wps->upc = hapd->conf->upc;
-
- if (hostapd_wps_upnp_init(hapd, wps) < 0) {
- wpa_printf(MSG_ERROR, "Failed to initialize WPS UPnP");
- wps_registrar_deinit(wps->registrar);
- os_free(wps->network_key);
- os_free(wps);
- return -1;
- }
-#endif /* CONFIG_WPS_UPNP */
-
- hostapd_register_probereq_cb(hapd, hostapd_wps_probe_req_rx, hapd);
-
- hapd->wps = wps;
-
- return 0;
-}
-
-
-void hostapd_deinit_wps(struct hostapd_data *hapd)
-{
- eloop_cancel_timeout(hostapd_wps_reenable_ap_pin, hapd, NULL);
- eloop_cancel_timeout(hostapd_wps_ap_pin_timeout, hapd, NULL);
- if (hapd->wps == NULL)
- return;
-#ifdef CONFIG_WPS_UPNP
- hostapd_wps_upnp_deinit(hapd);
-#endif /* CONFIG_WPS_UPNP */
- wps_registrar_deinit(hapd->wps->registrar);
- os_free(hapd->wps->network_key);
- wps_device_data_free(&hapd->wps->dev);
- wpabuf_free(hapd->wps->dh_pubkey);
- wpabuf_free(hapd->wps->dh_privkey);
- wpabuf_free(hapd->wps->oob_conf.pubkey_hash);
- wpabuf_free(hapd->wps->oob_conf.dev_password);
- wps_free_pending_msgs(hapd->wps->upnp_msgs);
- os_free(hapd->wps);
- hapd->wps = NULL;
- hostapd_wps_clear_ies(hapd);
-}
-
-
-void hostapd_update_wps(struct hostapd_data *hapd)
-{
- if (hapd->wps == NULL)
- return;
-
-#ifdef CONFIG_WPS_UPNP
- hapd->wps->friendly_name = hapd->conf->friendly_name;
- hapd->wps->manufacturer_url = hapd->conf->manufacturer_url;
- hapd->wps->model_description = hapd->conf->model_description;
- hapd->wps->model_url = hapd->conf->model_url;
- hapd->wps->upc = hapd->conf->upc;
-#endif /* CONFIG_WPS_UPNP */
-
- hostapd_wps_set_vendor_ext(hapd, hapd->wps);
-
- if (hapd->conf->wps_state)
- wps_registrar_update_ie(hapd->wps->registrar);
- else
- hostapd_deinit_wps(hapd);
-}
-
-
-struct wps_add_pin_data {
- const u8 *addr;
- const u8 *uuid;
- const u8 *pin;
- size_t pin_len;
- int timeout;
- int added;
-};
-
-
-static int wps_add_pin(struct hostapd_data *hapd, void *ctx)
-{
- struct wps_add_pin_data *data = ctx;
- int ret;
-
- if (hapd->wps == NULL)
- return 0;
- ret = wps_registrar_add_pin(hapd->wps->registrar, data->addr,
- data->uuid, data->pin, data->pin_len,
- data->timeout);
- if (ret == 0)
- data->added++;
- return ret;
-}
-
-
-int hostapd_wps_add_pin(struct hostapd_data *hapd, const u8 *addr,
- const char *uuid, const char *pin, int timeout)
-{
- u8 u[UUID_LEN];
- struct wps_add_pin_data data;
-
- data.addr = addr;
- data.uuid = u;
- data.pin = (const u8 *) pin;
- data.pin_len = os_strlen(pin);
- data.timeout = timeout;
- data.added = 0;
-
- if (os_strcmp(uuid, "any") == 0)
- data.uuid = NULL;
- else {
- if (uuid_str2bin(uuid, u))
- return -1;
- data.uuid = u;
- }
- if (hostapd_wps_for_each(hapd, wps_add_pin, &data) < 0)
- return -1;
- return data.added ? 0 : -1;
-}
-
-
-static int wps_button_pushed(struct hostapd_data *hapd, void *ctx)
-{
- const u8 *p2p_dev_addr = ctx;
- if (hapd->wps == NULL)
- return 0;
- return wps_registrar_button_pushed(hapd->wps->registrar, p2p_dev_addr);
-}
-
-
-int hostapd_wps_button_pushed(struct hostapd_data *hapd,
- const u8 *p2p_dev_addr)
-{
- return hostapd_wps_for_each(hapd, wps_button_pushed,
- (void *) p2p_dev_addr);
-}
-
-
-#ifdef CONFIG_WPS_OOB
-int hostapd_wps_start_oob(struct hostapd_data *hapd, char *device_type,
- char *path, char *method, char *name)
-{
- struct wps_context *wps = hapd->wps;
- struct oob_device_data *oob_dev;
-
- oob_dev = wps_get_oob_device(device_type);
- if (oob_dev == NULL)
- return -1;
- oob_dev->device_path = path;
- oob_dev->device_name = name;
- wps->oob_conf.oob_method = wps_get_oob_method(method);
-
- if (wps->oob_conf.oob_method == OOB_METHOD_DEV_PWD_R) {
- /*
- * Use pre-configured DH keys in order to be able to write the
- * key hash into the OOB file.
- */
- wpabuf_free(wps->dh_pubkey);
- wpabuf_free(wps->dh_privkey);
- wps->dh_privkey = NULL;
- wps->dh_pubkey = dh_init(dh_groups_get(WPS_DH_GROUP),
- &wps->dh_privkey);
- wps->dh_pubkey = wpabuf_zeropad(wps->dh_pubkey, 192);
- if (wps->dh_pubkey == NULL) {
- wpa_printf(MSG_ERROR, "WPS: Failed to initialize "
- "Diffie-Hellman handshake");
- return -1;
- }
- }
-
- if (wps_process_oob(wps, oob_dev, 1) < 0)
- goto error;
-
- if ((wps->oob_conf.oob_method == OOB_METHOD_DEV_PWD_E ||
- wps->oob_conf.oob_method == OOB_METHOD_DEV_PWD_R) &&
- hostapd_wps_add_pin(hapd, NULL, "any",
- wpabuf_head(wps->oob_conf.dev_password), 0) <
- 0)
- goto error;
-
- return 0;
-
-error:
- wpabuf_free(wps->dh_pubkey);
- wps->dh_pubkey = NULL;
- wpabuf_free(wps->dh_privkey);
- wps->dh_privkey = NULL;
- return -1;
-}
-#endif /* CONFIG_WPS_OOB */
-
-
-static int hostapd_wps_probe_req_rx(void *ctx, const u8 *addr,
- const u8 *ie, size_t ie_len)
-{
- struct hostapd_data *hapd = ctx;
- struct wpabuf *wps_ie;
- struct ieee802_11_elems elems;
-
- if (hapd->wps == NULL)
- return 0;
-
- if (ieee802_11_parse_elems(ie, ie_len, &elems, 0) == ParseFailed) {
- wpa_printf(MSG_DEBUG, "WPS: Could not parse ProbeReq from "
- MACSTR, MAC2STR(addr));
- return 0;
- }
-
- if (elems.ssid && elems.ssid_len > 0 &&
- (elems.ssid_len != hapd->conf->ssid.ssid_len ||
- os_memcmp(elems.ssid, hapd->conf->ssid.ssid, elems.ssid_len) !=
- 0))
- return 0; /* Not for us */
-
- wps_ie = ieee802_11_vendor_ie_concat(ie, ie_len, WPS_DEV_OUI_WFA);
- if (wps_ie == NULL)
- return 0;
- if (wps_validate_probe_req(wps_ie, addr) < 0) {
- wpabuf_free(wps_ie);
- return 0;
- }
-
- if (wpabuf_len(wps_ie) > 0) {
- int p2p_wildcard = 0;
-#ifdef CONFIG_P2P
- if (elems.ssid && elems.ssid_len == P2P_WILDCARD_SSID_LEN &&
- os_memcmp(elems.ssid, P2P_WILDCARD_SSID,
- P2P_WILDCARD_SSID_LEN) == 0)
- p2p_wildcard = 1;
-#endif /* CONFIG_P2P */
- wps_registrar_probe_req_rx(hapd->wps->registrar, addr, wps_ie,
- p2p_wildcard);
-#ifdef CONFIG_WPS_UPNP
- /* FIX: what exactly should be included in the WLANEvent?
- * WPS attributes? Full ProbeReq frame? */
- if (!p2p_wildcard)
- upnp_wps_device_send_wlan_event(
- hapd->wps_upnp, addr,
- UPNP_WPS_WLANEVENT_TYPE_PROBE, wps_ie);
-#endif /* CONFIG_WPS_UPNP */
- }
-
- wpabuf_free(wps_ie);
-
- return 0;
-}
-
-
-#ifdef CONFIG_WPS_UPNP
-
-static int hostapd_rx_req_put_wlan_response(
- void *priv, enum upnp_wps_wlanevent_type ev_type,
- const u8 *mac_addr, const struct wpabuf *msg,
- enum wps_msg_type msg_type)
-{
- struct hostapd_data *hapd = priv;
- struct sta_info *sta;
- struct upnp_pending_message *p;
-
- wpa_printf(MSG_DEBUG, "WPS UPnP: PutWLANResponse ev_type=%d mac_addr="
- MACSTR, ev_type, MAC2STR(mac_addr));
- wpa_hexdump(MSG_MSGDUMP, "WPS UPnP: PutWLANResponse NewMessage",
- wpabuf_head(msg), wpabuf_len(msg));
- if (ev_type != UPNP_WPS_WLANEVENT_TYPE_EAP) {
- wpa_printf(MSG_DEBUG, "WPS UPnP: Ignored unexpected "
- "PutWLANResponse WLANEventType %d", ev_type);
- return -1;
- }
-
- /*
- * EAP response to ongoing to WPS Registration. Send it to EAP-WSC
- * server implementation for delivery to the peer.
- */
-
- sta = ap_get_sta(hapd, mac_addr);
-#ifndef CONFIG_WPS_STRICT
- if (!sta) {
- /*
- * Workaround - Intel wsccmd uses bogus NewWLANEventMAC:
- * Pick STA that is in an ongoing WPS registration without
- * checking the MAC address.
- */
- wpa_printf(MSG_DEBUG, "WPS UPnP: No matching STA found based "
- "on NewWLANEventMAC; try wildcard match");
- for (sta = hapd->sta_list; sta; sta = sta->next) {
- if (sta->eapol_sm && (sta->flags & WLAN_STA_WPS))
- break;
- }
- }
-#endif /* CONFIG_WPS_STRICT */
-
- if (!sta) {
- wpa_printf(MSG_DEBUG, "WPS UPnP: No matching STA found");
- return 0;
- }
-
- p = os_zalloc(sizeof(*p));
- if (p == NULL)
- return -1;
- os_memcpy(p->addr, sta->addr, ETH_ALEN);
- p->msg = wpabuf_dup(msg);
- p->type = msg_type;
- p->next = hapd->wps->upnp_msgs;
- hapd->wps->upnp_msgs = p;
-
- return eapol_auth_eap_pending_cb(sta->eapol_sm, sta->eapol_sm->eap);
-}
-
-
-static int hostapd_wps_upnp_init(struct hostapd_data *hapd,
- struct wps_context *wps)
-{
- struct upnp_wps_device_ctx *ctx;
-
- if (!hapd->conf->upnp_iface)
- return 0;
- ctx = os_zalloc(sizeof(*ctx));
- if (ctx == NULL)
- return -1;
-
- ctx->rx_req_put_wlan_response = hostapd_rx_req_put_wlan_response;
- if (hapd->conf->ap_pin)
- ctx->ap_pin = os_strdup(hapd->conf->ap_pin);
-
- hapd->wps_upnp = upnp_wps_device_init(ctx, wps, hapd,
- hapd->conf->upnp_iface);
- if (hapd->wps_upnp == NULL)
- return -1;
- wps->wps_upnp = hapd->wps_upnp;
-
- return 0;
-}
-
-
-static void hostapd_wps_upnp_deinit(struct hostapd_data *hapd)
-{
- upnp_wps_device_deinit(hapd->wps_upnp, hapd);
-}
-
-#endif /* CONFIG_WPS_UPNP */
-
-
-int hostapd_wps_get_mib_sta(struct hostapd_data *hapd, const u8 *addr,
- char *buf, size_t buflen)
-{
- if (hapd->wps == NULL)
- return 0;
- return wps_registrar_get_info(hapd->wps->registrar, addr, buf, buflen);
-}
-
-
-static void hostapd_wps_ap_pin_timeout(void *eloop_data, void *user_ctx)
-{
- struct hostapd_data *hapd = eloop_data;
- wpa_printf(MSG_DEBUG, "WPS: AP PIN timed out");
- hostapd_wps_ap_pin_disable(hapd);
-}
-
-
-static void hostapd_wps_ap_pin_enable(struct hostapd_data *hapd, int timeout)
-{
- wpa_printf(MSG_DEBUG, "WPS: Enabling AP PIN (timeout=%d)", timeout);
- hapd->ap_pin_failures = 0;
- hapd->conf->ap_setup_locked = 0;
- if (hapd->wps->ap_setup_locked) {
- wpa_msg(hapd->msg_ctx, MSG_INFO, WPS_EVENT_AP_SETUP_UNLOCKED);
- hapd->wps->ap_setup_locked = 0;
- wps_registrar_update_ie(hapd->wps->registrar);
- }
- eloop_cancel_timeout(hostapd_wps_ap_pin_timeout, hapd, NULL);
- if (timeout > 0)
- eloop_register_timeout(timeout, 0,
- hostapd_wps_ap_pin_timeout, hapd, NULL);
-}
-
-
-static int wps_ap_pin_disable(struct hostapd_data *hapd, void *ctx)
-{
- os_free(hapd->conf->ap_pin);
- hapd->conf->ap_pin = NULL;
-#ifdef CONFIG_WPS_UPNP
- upnp_wps_set_ap_pin(hapd->wps_upnp, NULL);
-#endif /* CONFIG_WPS_UPNP */
- eloop_cancel_timeout(hostapd_wps_ap_pin_timeout, hapd, NULL);
- return 0;
-}
-
-
-void hostapd_wps_ap_pin_disable(struct hostapd_data *hapd)
-{
- wpa_printf(MSG_DEBUG, "WPS: Disabling AP PIN");
- hostapd_wps_for_each(hapd, wps_ap_pin_disable, NULL);
-}
-
-
-struct wps_ap_pin_data {
- char pin_txt[9];
- int timeout;
-};
-
-
-static int wps_ap_pin_set(struct hostapd_data *hapd, void *ctx)
-{
- struct wps_ap_pin_data *data = ctx;
- os_free(hapd->conf->ap_pin);
- hapd->conf->ap_pin = os_strdup(data->pin_txt);
-#ifdef CONFIG_WPS_UPNP
- upnp_wps_set_ap_pin(hapd->wps_upnp, data->pin_txt);
-#endif /* CONFIG_WPS_UPNP */
- hostapd_wps_ap_pin_enable(hapd, data->timeout);
- return 0;
-}
-
-
-const char * hostapd_wps_ap_pin_random(struct hostapd_data *hapd, int timeout)
-{
- unsigned int pin;
- struct wps_ap_pin_data data;
-
- pin = wps_generate_pin();
- os_snprintf(data.pin_txt, sizeof(data.pin_txt), "%u", pin);
- data.timeout = timeout;
- hostapd_wps_for_each(hapd, wps_ap_pin_set, &data);
- return hapd->conf->ap_pin;
-}
-
-
-const char * hostapd_wps_ap_pin_get(struct hostapd_data *hapd)
-{
- return hapd->conf->ap_pin;
-}
-
-
-int hostapd_wps_ap_pin_set(struct hostapd_data *hapd, const char *pin,
- int timeout)
-{
- struct wps_ap_pin_data data;
- int ret;
-
- ret = os_snprintf(data.pin_txt, sizeof(data.pin_txt), "%s", pin);
- if (ret < 0 || ret >= (int) sizeof(data.pin_txt))
- return -1;
- data.timeout = timeout;
- return hostapd_wps_for_each(hapd, wps_ap_pin_set, &data);
-}
-
-
-static int wps_update_ie(struct hostapd_data *hapd, void *ctx)
-{
- if (hapd->wps)
- wps_registrar_update_ie(hapd->wps->registrar);
- return 0;
-}
-
-
-void hostapd_wps_update_ie(struct hostapd_data *hapd)
-{
- hostapd_wps_for_each(hapd, wps_update_ie, NULL);
-}
-
-
-int hostapd_wps_config_ap(struct hostapd_data *hapd, const char *ssid,
- const char *auth, const char *encr, const char *key)
-{
- struct wps_credential cred;
- size_t len;
-
- os_memset(&cred, 0, sizeof(cred));
-
- len = os_strlen(ssid);
- if ((len & 1) || len > 2 * sizeof(cred.ssid) ||
- hexstr2bin(ssid, cred.ssid, len / 2))
- return -1;
- cred.ssid_len = len / 2;
-
- if (os_strncmp(auth, "OPEN", 4) == 0)
- cred.auth_type = WPS_AUTH_OPEN;
- else if (os_strncmp(auth, "WPAPSK", 6) == 0)
- cred.auth_type = WPS_AUTH_WPAPSK;
- else if (os_strncmp(auth, "WPA2PSK", 7) == 0)
- cred.auth_type = WPS_AUTH_WPA2PSK;
- else
- return -1;
-
- if (encr) {
- if (os_strncmp(encr, "NONE", 4) == 0)
- cred.encr_type = WPS_ENCR_NONE;
- else if (os_strncmp(encr, "WEP", 3) == 0)
- cred.encr_type = WPS_ENCR_WEP;
- else if (os_strncmp(encr, "TKIP", 4) == 0)
- cred.encr_type = WPS_ENCR_TKIP;
- else if (os_strncmp(encr, "CCMP", 4) == 0)
- cred.encr_type = WPS_ENCR_AES;
- else
- return -1;
- } else
- cred.encr_type = WPS_ENCR_NONE;
-
- if (key) {
- len = os_strlen(key);
- if ((len & 1) || len > 2 * sizeof(cred.key) ||
- hexstr2bin(key, cred.key, len / 2))
- return -1;
- cred.key_len = len / 2;
- }
-
- return wps_registrar_config_ap(hapd->wps->registrar, &cred);
-}
diff --git a/hostapd-0.8/src/ap/wps_hostapd.h b/hostapd-0.8/src/ap/wps_hostapd.h
deleted file mode 100644
index 338a220..0000000
--- a/hostapd-0.8/src/ap/wps_hostapd.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * hostapd / WPS integration
- * Copyright (c) 2008-2010, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef WPS_HOSTAPD_H
-#define WPS_HOSTAPD_H
-
-#ifdef CONFIG_WPS
-
-int hostapd_init_wps(struct hostapd_data *hapd,
- struct hostapd_bss_config *conf);
-void hostapd_deinit_wps(struct hostapd_data *hapd);
-void hostapd_update_wps(struct hostapd_data *hapd);
-int hostapd_wps_add_pin(struct hostapd_data *hapd, const u8 *addr,
- const char *uuid, const char *pin, int timeout);
-int hostapd_wps_button_pushed(struct hostapd_data *hapd,
- const u8 *p2p_dev_addr);
-int hostapd_wps_start_oob(struct hostapd_data *hapd, char *device_type,
- char *path, char *method, char *name);
-int hostapd_wps_get_mib_sta(struct hostapd_data *hapd, const u8 *addr,
- char *buf, size_t buflen);
-void hostapd_wps_ap_pin_disable(struct hostapd_data *hapd);
-const char * hostapd_wps_ap_pin_random(struct hostapd_data *hapd, int timeout);
-const char * hostapd_wps_ap_pin_get(struct hostapd_data *hapd);
-int hostapd_wps_ap_pin_set(struct hostapd_data *hapd, const char *pin,
- int timeout);
-void hostapd_wps_update_ie(struct hostapd_data *hapd);
-int hostapd_wps_config_ap(struct hostapd_data *hapd, const char *ssid,
- const char *auth, const char *encr, const char *key);
-
-#else /* CONFIG_WPS */
-
-static inline int hostapd_init_wps(struct hostapd_data *hapd,
- struct hostapd_bss_config *conf)
-{
- return 0;
-}
-
-static inline void hostapd_deinit_wps(struct hostapd_data *hapd)
-{
-}
-
-static inline void hostapd_update_wps(struct hostapd_data *hapd)
-{
-}
-
-static inline int hostapd_wps_get_mib_sta(struct hostapd_data *hapd,
- const u8 *addr,
- char *buf, size_t buflen)
-{
- return 0;
-}
-
-static inline int hostapd_wps_button_pushed(struct hostapd_data *hapd,
- const u8 *p2p_dev_addr)
-{
- return 0;
-}
-
-#endif /* CONFIG_WPS */
-
-#endif /* WPS_HOSTAPD_H */
diff --git a/hostapd-0.8/src/common/Makefile b/hostapd-0.8/src/common/Makefile
deleted file mode 100644
index 9c41962..0000000
--- a/hostapd-0.8/src/common/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-all:
- @echo Nothing to be made.
-
-clean:
- rm -f *~ *.o *.d
-
-install:
- @echo Nothing to be made.
diff --git a/hostapd-0.8/src/common/defs.h b/hostapd-0.8/src/common/defs.h
deleted file mode 100644
index 8abec07..0000000
--- a/hostapd-0.8/src/common/defs.h
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * WPA Supplicant - Common definitions
- * Copyright (c) 2004-2008, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef DEFS_H
-#define DEFS_H
-
-#ifdef FALSE
-#undef FALSE
-#endif
-#ifdef TRUE
-#undef TRUE
-#endif
-typedef enum { FALSE = 0, TRUE = 1 } Boolean;
-
-
-#define WPA_CIPHER_NONE BIT(0)
-#define WPA_CIPHER_WEP40 BIT(1)
-#define WPA_CIPHER_WEP104 BIT(2)
-#define WPA_CIPHER_TKIP BIT(3)
-#define WPA_CIPHER_CCMP BIT(4)
-#ifdef CONFIG_IEEE80211W
-#define WPA_CIPHER_AES_128_CMAC BIT(5)
-#endif /* CONFIG_IEEE80211W */
-
-#define WPA_KEY_MGMT_IEEE8021X BIT(0)
-#define WPA_KEY_MGMT_PSK BIT(1)
-#define WPA_KEY_MGMT_NONE BIT(2)
-#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3)
-#define WPA_KEY_MGMT_WPA_NONE BIT(4)
-#define WPA_KEY_MGMT_FT_IEEE8021X BIT(5)
-#define WPA_KEY_MGMT_FT_PSK BIT(6)
-#define WPA_KEY_MGMT_IEEE8021X_SHA256 BIT(7)
-#define WPA_KEY_MGMT_PSK_SHA256 BIT(8)
-#define WPA_KEY_MGMT_WPS BIT(9)
-
-static inline int wpa_key_mgmt_wpa_ieee8021x(int akm)
-{
- return !!(akm & (WPA_KEY_MGMT_IEEE8021X |
- WPA_KEY_MGMT_FT_IEEE8021X |
- WPA_KEY_MGMT_IEEE8021X_SHA256));
-}
-
-static inline int wpa_key_mgmt_wpa_psk(int akm)
-{
- return !!(akm & (WPA_KEY_MGMT_PSK |
- WPA_KEY_MGMT_FT_PSK |
- WPA_KEY_MGMT_PSK_SHA256));
-}
-
-static inline int wpa_key_mgmt_ft(int akm)
-{
- return !!(akm & (WPA_KEY_MGMT_FT_PSK |
- WPA_KEY_MGMT_FT_IEEE8021X));
-}
-
-static inline int wpa_key_mgmt_sha256(int akm)
-{
- return !!(akm & (WPA_KEY_MGMT_PSK_SHA256 |
- WPA_KEY_MGMT_IEEE8021X_SHA256));
-}
-
-static inline int wpa_key_mgmt_wpa(int akm)
-{
- return wpa_key_mgmt_wpa_ieee8021x(akm) ||
- wpa_key_mgmt_wpa_psk(akm);
-}
-
-
-#define WPA_PROTO_WPA BIT(0)
-#define WPA_PROTO_RSN BIT(1)
-
-#define WPA_AUTH_ALG_OPEN BIT(0)
-#define WPA_AUTH_ALG_SHARED BIT(1)
-#define WPA_AUTH_ALG_LEAP BIT(2)
-#define WPA_AUTH_ALG_FT BIT(3)
-
-
-enum wpa_alg {
- WPA_ALG_NONE,
- WPA_ALG_WEP,
- WPA_ALG_TKIP,
- WPA_ALG_CCMP,
- WPA_ALG_IGTK,
- WPA_ALG_PMK
-};
-
-/**
- * enum wpa_cipher - Cipher suites
- */
-enum wpa_cipher {
- CIPHER_NONE,
- CIPHER_WEP40,
- CIPHER_TKIP,
- CIPHER_CCMP,
- CIPHER_WEP104
-};
-
-/**
- * enum wpa_key_mgmt - Key management suites
- */
-enum wpa_key_mgmt {
- KEY_MGMT_802_1X,
- KEY_MGMT_PSK,
- KEY_MGMT_NONE,
- KEY_MGMT_802_1X_NO_WPA,
- KEY_MGMT_WPA_NONE,
- KEY_MGMT_FT_802_1X,
- KEY_MGMT_FT_PSK,
- KEY_MGMT_802_1X_SHA256,
- KEY_MGMT_PSK_SHA256,
- KEY_MGMT_WPS
-};
-
-/**
- * enum wpa_states - wpa_supplicant state
- *
- * These enumeration values are used to indicate the current wpa_supplicant
- * state (wpa_s->wpa_state). The current state can be retrieved with
- * wpa_supplicant_get_state() function and the state can be changed by calling
- * wpa_supplicant_set_state(). In WPA state machine (wpa.c and preauth.c), the
- * wrapper functions wpa_sm_get_state() and wpa_sm_set_state() should be used
- * to access the state variable.
- */
-enum wpa_states {
- /**
- * WPA_DISCONNECTED - Disconnected state
- *
- * This state indicates that client is not associated, but is likely to
- * start looking for an access point. This state is entered when a
- * connection is lost.
- */
- WPA_DISCONNECTED,
-
- /**
- * WPA_INTERFACE_DISABLED - Interface disabled
- *
- * This stat eis entered if the network interface is disabled, e.g.,
- * due to rfkill. wpa_supplicant refuses any new operations that would
- * use the radio until the interface has been enabled.
- */
- WPA_INTERFACE_DISABLED,
-
- /**
- * WPA_INACTIVE - Inactive state (wpa_supplicant disabled)
- *
- * This state is entered if there are no enabled networks in the
- * configuration. wpa_supplicant is not trying to associate with a new
- * network and external interaction (e.g., ctrl_iface call to add or
- * enable a network) is needed to start association.
- */
- WPA_INACTIVE,
-
- /**
- * WPA_SCANNING - Scanning for a network
- *
- * This state is entered when wpa_supplicant starts scanning for a
- * network.
- */
- WPA_SCANNING,
-
- /**
- * WPA_AUTHENTICATING - Trying to authenticate with a BSS/SSID
- *
- * This state is entered when wpa_supplicant has found a suitable BSS
- * to authenticate with and the driver is configured to try to
- * authenticate with this BSS. This state is used only with drivers
- * that use wpa_supplicant as the SME.
- */
- WPA_AUTHENTICATING,
-
- /**
- * WPA_ASSOCIATING - Trying to associate with a BSS/SSID
- *
- * This state is entered when wpa_supplicant has found a suitable BSS
- * to associate with and the driver is configured to try to associate
- * with this BSS in ap_scan=1 mode. When using ap_scan=2 mode, this
- * state is entered when the driver is configured to try to associate
- * with a network using the configured SSID and security policy.
- */
- WPA_ASSOCIATING,
-
- /**
- * WPA_ASSOCIATED - Association completed
- *
- * This state is entered when the driver reports that association has
- * been successfully completed with an AP. If IEEE 802.1X is used
- * (with or without WPA/WPA2), wpa_supplicant remains in this state
- * until the IEEE 802.1X/EAPOL authentication has been completed.
- */
- WPA_ASSOCIATED,
-
- /**
- * WPA_4WAY_HANDSHAKE - WPA 4-Way Key Handshake in progress
- *
- * This state is entered when WPA/WPA2 4-Way Handshake is started. In
- * case of WPA-PSK, this happens when receiving the first EAPOL-Key
- * frame after association. In case of WPA-EAP, this state is entered
- * when the IEEE 802.1X/EAPOL authentication has been completed.
- */
- WPA_4WAY_HANDSHAKE,
-
- /**
- * WPA_GROUP_HANDSHAKE - WPA Group Key Handshake in progress
- *
- * This state is entered when 4-Way Key Handshake has been completed
- * (i.e., when the supplicant sends out message 4/4) and when Group
- * Key rekeying is started by the AP (i.e., when supplicant receives
- * message 1/2).
- */
- WPA_GROUP_HANDSHAKE,
-
- /**
- * WPA_COMPLETED - All authentication completed
- *
- * This state is entered when the full authentication process is
- * completed. In case of WPA2, this happens when the 4-Way Handshake is
- * successfully completed. With WPA, this state is entered after the
- * Group Key Handshake; with IEEE 802.1X (non-WPA) connection is
- * completed after dynamic keys are received (or if not used, after
- * the EAP authentication has been completed). With static WEP keys and
- * plaintext connections, this state is entered when an association
- * has been completed.
- *
- * This state indicates that the supplicant has completed its
- * processing for the association phase and that data connection is
- * fully configured.
- */
- WPA_COMPLETED
-};
-
-#define MLME_SETPROTECTION_PROTECT_TYPE_NONE 0
-#define MLME_SETPROTECTION_PROTECT_TYPE_RX 1
-#define MLME_SETPROTECTION_PROTECT_TYPE_TX 2
-#define MLME_SETPROTECTION_PROTECT_TYPE_RX_TX 3
-
-#define MLME_SETPROTECTION_KEY_TYPE_GROUP 0
-#define MLME_SETPROTECTION_KEY_TYPE_PAIRWISE 1
-
-
-/**
- * enum mfp_options - Management frame protection (IEEE 802.11w) options
- */
-enum mfp_options {
- NO_MGMT_FRAME_PROTECTION = 0,
- MGMT_FRAME_PROTECTION_OPTIONAL = 1,
- MGMT_FRAME_PROTECTION_REQUIRED = 2
-};
-
-/**
- * enum hostapd_hw_mode - Hardware mode
- */
-enum hostapd_hw_mode {
- HOSTAPD_MODE_IEEE80211B,
- HOSTAPD_MODE_IEEE80211G,
- HOSTAPD_MODE_IEEE80211A,
- NUM_HOSTAPD_MODES
-};
-
-#endif /* DEFS_H */
diff --git a/hostapd-0.8/src/common/eapol_common.h b/hostapd-0.8/src/common/eapol_common.h
deleted file mode 100644
index d70e62d..0000000
--- a/hostapd-0.8/src/common/eapol_common.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * EAPOL definitions shared between hostapd and wpa_supplicant
- * Copyright (c) 2002-2007, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef EAPOL_COMMON_H
-#define EAPOL_COMMON_H
-
-/* IEEE Std 802.1X-2004 */
-
-#ifdef _MSC_VER
-#pragma pack(push, 1)
-#endif /* _MSC_VER */
-
-struct ieee802_1x_hdr {
- u8 version;
- u8 type;
- be16 length;
- /* followed by length octets of data */
-} STRUCT_PACKED;
-
-#ifdef _MSC_VER
-#pragma pack(pop)
-#endif /* _MSC_VER */
-
-#define EAPOL_VERSION 2
-
-enum { IEEE802_1X_TYPE_EAP_PACKET = 0,
- IEEE802_1X_TYPE_EAPOL_START = 1,
- IEEE802_1X_TYPE_EAPOL_LOGOFF = 2,
- IEEE802_1X_TYPE_EAPOL_KEY = 3,
- IEEE802_1X_TYPE_EAPOL_ENCAPSULATED_ASF_ALERT = 4
-};
-
-enum { EAPOL_KEY_TYPE_RC4 = 1, EAPOL_KEY_TYPE_RSN = 2,
- EAPOL_KEY_TYPE_WPA = 254 };
-
-#endif /* EAPOL_COMMON_H */
diff --git a/hostapd-0.8/src/common/ieee802_11_common.c b/hostapd-0.8/src/common/ieee802_11_common.c
deleted file mode 100644
index ee41b3a..0000000
--- a/hostapd-0.8/src/common/ieee802_11_common.c
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * IEEE 802.11 Common routines
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "includes.h"
-
-#include "common.h"
-#include "ieee802_11_defs.h"
-#include "ieee802_11_common.h"
-
-
-static int ieee802_11_parse_vendor_specific(const u8 *pos, size_t elen,
- struct ieee802_11_elems *elems,
- int show_errors)
-{
- unsigned int oui;
-
- /* first 3 bytes in vendor specific information element are the IEEE
- * OUI of the vendor. The following byte is used a vendor specific
- * sub-type. */
- if (elen < 4) {
- if (show_errors) {
- wpa_printf(MSG_MSGDUMP, "short vendor specific "
- "information element ignored (len=%lu)",
- (unsigned long) elen);
- }
- return -1;
- }
-
- oui = WPA_GET_BE24(pos);
- switch (oui) {
- case OUI_MICROSOFT:
- /* Microsoft/Wi-Fi information elements are further typed and
- * subtyped */
- switch (pos[3]) {
- case 1:
- /* Microsoft OUI (00:50:F2) with OUI Type 1:
- * real WPA information element */
- elems->wpa_ie = pos;
- elems->wpa_ie_len = elen;
- break;
- case WMM_OUI_TYPE:
- /* WMM information element */
- if (elen < 5) {
- wpa_printf(MSG_MSGDUMP, "short WMM "
- "information element ignored "
- "(len=%lu)",
- (unsigned long) elen);
- return -1;
- }
- switch (pos[4]) {
- case WMM_OUI_SUBTYPE_INFORMATION_ELEMENT:
- case WMM_OUI_SUBTYPE_PARAMETER_ELEMENT:
- /*
- * Share same pointer since only one of these
- * is used and they start with same data.
- * Length field can be used to distinguish the
- * IEs.
- */
- elems->wmm = pos;
- elems->wmm_len = elen;
- break;
- case WMM_OUI_SUBTYPE_TSPEC_ELEMENT:
- elems->wmm_tspec = pos;
- elems->wmm_tspec_len = elen;
- break;
- default:
- wpa_printf(MSG_EXCESSIVE, "unknown WMM "
- "information element ignored "
- "(subtype=%d len=%lu)",
- pos[4], (unsigned long) elen);
- return -1;
- }
- break;
- case 4:
- /* Wi-Fi Protected Setup (WPS) IE */
- elems->wps_ie = pos;
- elems->wps_ie_len = elen;
- break;
- default:
- wpa_printf(MSG_EXCESSIVE, "Unknown Microsoft "
- "information element ignored "
- "(type=%d len=%lu)",
- pos[3], (unsigned long) elen);
- return -1;
- }
- break;
-
- case OUI_WFA:
- switch (pos[3]) {
- case P2P_OUI_TYPE:
- /* Wi-Fi Alliance - P2P IE */
- elems->p2p = pos;
- elems->p2p_len = elen;
- break;
- default:
- wpa_printf(MSG_MSGDUMP, "Unknown WFA "
- "information element ignored "
- "(type=%d len=%lu)\n",
- pos[3], (unsigned long) elen);
- return -1;
- }
- break;
-
- case OUI_BROADCOM:
- switch (pos[3]) {
- case VENDOR_HT_CAPAB_OUI_TYPE:
- elems->vendor_ht_cap = pos;
- elems->vendor_ht_cap_len = elen;
- break;
- default:
- wpa_printf(MSG_EXCESSIVE, "Unknown Broadcom "
- "information element ignored "
- "(type=%d len=%lu)",
- pos[3], (unsigned long) elen);
- return -1;
- }
- break;
-
- default:
- wpa_printf(MSG_EXCESSIVE, "unknown vendor specific "
- "information element ignored (vendor OUI "
- "%02x:%02x:%02x len=%lu)",
- pos[0], pos[1], pos[2], (unsigned long) elen);
- return -1;
- }
-
- return 0;
-}
-
-
-/**
- * ieee802_11_parse_elems - Parse information elements in management frames
- * @start: Pointer to the start of IEs
- * @len: Length of IE buffer in octets
- * @elems: Data structure for parsed elements
- * @show_errors: Whether to show parsing errors in debug log
- * Returns: Parsing result
- */
-ParseRes ieee802_11_parse_elems(const u8 *start, size_t len,
- struct ieee802_11_elems *elems,
- int show_errors)
-{
- size_t left = len;
- const u8 *pos = start;
- int unknown = 0;
-
- os_memset(elems, 0, sizeof(*elems));
-
- while (left >= 2) {
- u8 id, elen;
-
- id = *pos++;
- elen = *pos++;
- left -= 2;
-
- if (elen > left) {
- if (show_errors) {
- wpa_printf(MSG_DEBUG, "IEEE 802.11 element "
- "parse failed (id=%d elen=%d "
- "left=%lu)",
- id, elen, (unsigned long) left);
- wpa_hexdump(MSG_MSGDUMP, "IEs", start, len);
- }
- return ParseFailed;
- }
-
- switch (id) {
- case WLAN_EID_SSID:
- elems->ssid = pos;
- elems->ssid_len = elen;
- break;
- case WLAN_EID_SUPP_RATES:
- elems->supp_rates = pos;
- elems->supp_rates_len = elen;
- break;
- case WLAN_EID_FH_PARAMS:
- elems->fh_params = pos;
- elems->fh_params_len = elen;
- break;
- case WLAN_EID_DS_PARAMS:
- elems->ds_params = pos;
- elems->ds_params_len = elen;
- break;
- case WLAN_EID_CF_PARAMS:
- elems->cf_params = pos;
- elems->cf_params_len = elen;
- break;
- case WLAN_EID_TIM:
- elems->tim = pos;
- elems->tim_len = elen;
- break;
- case WLAN_EID_IBSS_PARAMS:
- elems->ibss_params = pos;
- elems->ibss_params_len = elen;
- break;
- case WLAN_EID_CHALLENGE:
- elems->challenge = pos;
- elems->challenge_len = elen;
- break;
- case WLAN_EID_ERP_INFO:
- elems->erp_info = pos;
- elems->erp_info_len = elen;
- break;
- case WLAN_EID_EXT_SUPP_RATES:
- elems->ext_supp_rates = pos;
- elems->ext_supp_rates_len = elen;
- break;
- case WLAN_EID_VENDOR_SPECIFIC:
- if (ieee802_11_parse_vendor_specific(pos, elen,
- elems,
- show_errors))
- unknown++;
- break;
- case WLAN_EID_RSN:
- elems->rsn_ie = pos;
- elems->rsn_ie_len = elen;
- break;
- case WLAN_EID_PWR_CAPABILITY:
- elems->power_cap = pos;
- elems->power_cap_len = elen;
- break;
- case WLAN_EID_SUPPORTED_CHANNELS:
- elems->supp_channels = pos;
- elems->supp_channels_len = elen;
- break;
- case WLAN_EID_MOBILITY_DOMAIN:
- elems->mdie = pos;
- elems->mdie_len = elen;
- break;
- case WLAN_EID_FAST_BSS_TRANSITION:
- elems->ftie = pos;
- elems->ftie_len = elen;
- break;
- case WLAN_EID_TIMEOUT_INTERVAL:
- elems->timeout_int = pos;
- elems->timeout_int_len = elen;
- break;
- case WLAN_EID_HT_CAP:
- elems->ht_capabilities = pos;
- elems->ht_capabilities_len = elen;
- break;
- case WLAN_EID_HT_OPERATION:
- elems->ht_operation = pos;
- elems->ht_operation_len = elen;
- break;
- case WLAN_EID_LINK_ID:
- if (elen < 18)
- break;
- elems->link_id = pos;
- break;
- default:
- unknown++;
- if (!show_errors)
- break;
- wpa_printf(MSG_MSGDUMP, "IEEE 802.11 element parse "
- "ignored unknown element (id=%d elen=%d)",
- id, elen);
- break;
- }
-
- left -= elen;
- pos += elen;
- }
-
- if (left)
- return ParseFailed;
-
- return unknown ? ParseUnknown : ParseOK;
-}
-
-
-int ieee802_11_ie_count(const u8 *ies, size_t ies_len)
-{
- int count = 0;
- const u8 *pos, *end;
-
- if (ies == NULL)
- return 0;
-
- pos = ies;
- end = ies + ies_len;
-
- while (pos + 2 <= end) {
- if (pos + 2 + pos[1] > end)
- break;
- count++;
- pos += 2 + pos[1];
- }
-
- return count;
-}
-
-
-struct wpabuf * ieee802_11_vendor_ie_concat(const u8 *ies, size_t ies_len,
- u32 oui_type)
-{
- struct wpabuf *buf;
- const u8 *end, *pos, *ie;
-
- pos = ies;
- end = ies + ies_len;
- ie = NULL;
-
- while (pos + 1 < end) {
- if (pos + 2 + pos[1] > end)
- return NULL;
- if (pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 &&
- WPA_GET_BE32(&pos[2]) == oui_type) {
- ie = pos;
- break;
- }
- pos += 2 + pos[1];
- }
-
- if (ie == NULL)
- return NULL; /* No specified vendor IE found */
-
- buf = wpabuf_alloc(ies_len);
- if (buf == NULL)
- return NULL;
-
- /*
- * There may be multiple vendor IEs in the message, so need to
- * concatenate their data fields.
- */
- while (pos + 1 < end) {
- if (pos + 2 + pos[1] > end)
- break;
- if (pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 &&
- WPA_GET_BE32(&pos[2]) == oui_type)
- wpabuf_put_data(buf, pos + 6, pos[1] - 4);
- pos += 2 + pos[1];
- }
-
- return buf;
-}
diff --git a/hostapd-0.8/src/common/ieee802_11_common.h b/hostapd-0.8/src/common/ieee802_11_common.h
deleted file mode 100644
index 0c90fa4..0000000
--- a/hostapd-0.8/src/common/ieee802_11_common.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * IEEE 802.11 Common routines
- * Copyright (c) 2002-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef IEEE802_11_COMMON_H
-#define IEEE802_11_COMMON_H
-
-/* Parsed Information Elements */
-struct ieee802_11_elems {
- const u8 *ssid;
- const u8 *supp_rates;
- const u8 *fh_params;
- const u8 *ds_params;
- const u8 *cf_params;
- const u8 *tim;
- const u8 *ibss_params;
- const u8 *challenge;
- const u8 *erp_info;
- const u8 *ext_supp_rates;
- const u8 *wpa_ie;
- const u8 *rsn_ie;
- const u8 *wmm; /* WMM Information or Parameter Element */
- const u8 *wmm_tspec;
- const u8 *wps_ie;
- const u8 *power_cap;
- const u8 *supp_channels;
- const u8 *mdie;
- const u8 *ftie;
- const u8 *timeout_int;
- const u8 *ht_capabilities;
- const u8 *ht_operation;
- const u8 *vendor_ht_cap;
- const u8 *p2p;
- const u8 *link_id;
-
- u8 ssid_len;
- u8 supp_rates_len;
- u8 fh_params_len;
- u8 ds_params_len;
- u8 cf_params_len;
- u8 tim_len;
- u8 ibss_params_len;
- u8 challenge_len;
- u8 erp_info_len;
- u8 ext_supp_rates_len;
- u8 wpa_ie_len;
- u8 rsn_ie_len;
- u8 wmm_len; /* 7 = WMM Information; 24 = WMM Parameter */
- u8 wmm_tspec_len;
- u8 wps_ie_len;
- u8 power_cap_len;
- u8 supp_channels_len;
- u8 mdie_len;
- u8 ftie_len;
- u8 timeout_int_len;
- u8 ht_capabilities_len;
- u8 ht_operation_len;
- u8 vendor_ht_cap_len;
- u8 p2p_len;
-};
-
-typedef enum { ParseOK = 0, ParseUnknown = 1, ParseFailed = -1 } ParseRes;
-
-ParseRes ieee802_11_parse_elems(const u8 *start, size_t len,
- struct ieee802_11_elems *elems,
- int show_errors);
-int ieee802_11_ie_count(const u8 *ies, size_t ies_len);
-struct wpabuf * ieee802_11_vendor_ie_concat(const u8 *ies, size_t ies_len,
- u32 oui_type);
-
-#endif /* IEEE802_11_COMMON_H */
diff --git a/hostapd-0.8/src/common/ieee802_11_defs.h b/hostapd-0.8/src/common/ieee802_11_defs.h
deleted file mode 100644
index 86868c0..0000000
--- a/hostapd-0.8/src/common/ieee802_11_defs.h
+++ /dev/null
@@ -1,800 +0,0 @@
-/*
- * IEEE 802.11 Frame type definitions
- * Copyright (c) 2002-2009, Jouni Malinen
- * Copyright (c) 2007-2008 Intel Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef IEEE802_11_DEFS_H
-#define IEEE802_11_DEFS_H
-
-/* IEEE 802.11 defines */
-
-#define WLAN_FC_PVER 0x0003
-#define WLAN_FC_TODS 0x0100
-#define WLAN_FC_FROMDS 0x0200
-#define WLAN_FC_MOREFRAG 0x0400
-#define WLAN_FC_RETRY 0x0800
-#define WLAN_FC_PWRMGT 0x1000
-#define WLAN_FC_MOREDATA 0x2000
-#define WLAN_FC_ISWEP 0x4000
-#define WLAN_FC_ORDER 0x8000
-
-#define WLAN_FC_GET_TYPE(fc) (((fc) & 0x000c) >> 2)
-#define WLAN_FC_GET_STYPE(fc) (((fc) & 0x00f0) >> 4)
-
-#define WLAN_GET_SEQ_FRAG(seq) ((seq) & (BIT(3) | BIT(2) | BIT(1) | BIT(0)))
-#define WLAN_GET_SEQ_SEQ(seq) \
- (((seq) & (~(BIT(3) | BIT(2) | BIT(1) | BIT(0)))) >> 4)
-
-#define WLAN_FC_TYPE_MGMT 0
-#define WLAN_FC_TYPE_CTRL 1
-#define WLAN_FC_TYPE_DATA 2
-
-/* management */
-#define WLAN_FC_STYPE_ASSOC_REQ 0
-#define WLAN_FC_STYPE_ASSOC_RESP 1
-#define WLAN_FC_STYPE_REASSOC_REQ 2
-#define WLAN_FC_STYPE_REASSOC_RESP 3
-#define WLAN_FC_STYPE_PROBE_REQ 4
-#define WLAN_FC_STYPE_PROBE_RESP 5
-#define WLAN_FC_STYPE_BEACON 8
-#define WLAN_FC_STYPE_ATIM 9
-#define WLAN_FC_STYPE_DISASSOC 10
-#define WLAN_FC_STYPE_AUTH 11
-#define WLAN_FC_STYPE_DEAUTH 12
-#define WLAN_FC_STYPE_ACTION 13
-
-/* control */
-#define WLAN_FC_STYPE_PSPOLL 10
-#define WLAN_FC_STYPE_RTS 11
-#define WLAN_FC_STYPE_CTS 12
-#define WLAN_FC_STYPE_ACK 13
-#define WLAN_FC_STYPE_CFEND 14
-#define WLAN_FC_STYPE_CFENDACK 15
-
-/* data */
-#define WLAN_FC_STYPE_DATA 0
-#define WLAN_FC_STYPE_DATA_CFACK 1
-#define WLAN_FC_STYPE_DATA_CFPOLL 2
-#define WLAN_FC_STYPE_DATA_CFACKPOLL 3
-#define WLAN_FC_STYPE_NULLFUNC 4
-#define WLAN_FC_STYPE_CFACK 5
-#define WLAN_FC_STYPE_CFPOLL 6
-#define WLAN_FC_STYPE_CFACKPOLL 7
-#define WLAN_FC_STYPE_QOS_DATA 8
-#define WLAN_FC_STYPE_QOS_DATA_CFACK 9
-#define WLAN_FC_STYPE_QOS_DATA_CFPOLL 10
-#define WLAN_FC_STYPE_QOS_DATA_CFACKPOLL 11
-#define WLAN_FC_STYPE_QOS_NULL 12
-#define WLAN_FC_STYPE_QOS_CFPOLL 14
-#define WLAN_FC_STYPE_QOS_CFACKPOLL 15
-
-/* Authentication algorithms */
-#define WLAN_AUTH_OPEN 0
-#define WLAN_AUTH_SHARED_KEY 1
-#define WLAN_AUTH_FT 2
-#define WLAN_AUTH_LEAP 128
-
-#define WLAN_AUTH_CHALLENGE_LEN 128
-
-#define WLAN_CAPABILITY_ESS BIT(0)
-#define WLAN_CAPABILITY_IBSS BIT(1)
-#define WLAN_CAPABILITY_CF_POLLABLE BIT(2)
-#define WLAN_CAPABILITY_CF_POLL_REQUEST BIT(3)
-#define WLAN_CAPABILITY_PRIVACY BIT(4)
-#define WLAN_CAPABILITY_SHORT_PREAMBLE BIT(5)
-#define WLAN_CAPABILITY_PBCC BIT(6)
-#define WLAN_CAPABILITY_CHANNEL_AGILITY BIT(7)
-#define WLAN_CAPABILITY_SPECTRUM_MGMT BIT(8)
-#define WLAN_CAPABILITY_SHORT_SLOT_TIME BIT(10)
-#define WLAN_CAPABILITY_DSSS_OFDM BIT(13)
-
-/* Status codes (IEEE 802.11-2007, 7.3.1.9, Table 7-23) */
-#define WLAN_STATUS_SUCCESS 0
-#define WLAN_STATUS_UNSPECIFIED_FAILURE 1
-#define WLAN_STATUS_TDLS_WAKEUP_ALTERNATE 2
-#define WLAN_STATUS_TDLS_WAKEUP_REJECT 3
-#define WLAN_STATUS_SECURITY_DISABLED 5
-#define WLAN_STATUS_UNACCEPTABLE_LIFETIME 6
-#define WLAN_STATUS_NOT_IN_SAME_BSS 7
-#define WLAN_STATUS_CAPS_UNSUPPORTED 10
-#define WLAN_STATUS_REASSOC_NO_ASSOC 11
-#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12
-#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13
-#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14
-#define WLAN_STATUS_CHALLENGE_FAIL 15
-#define WLAN_STATUS_AUTH_TIMEOUT 16
-#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17
-#define WLAN_STATUS_ASSOC_DENIED_RATES 18
-/* IEEE 802.11b */
-#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19
-#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20
-#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21
-/* IEEE 802.11h */
-#define WLAN_STATUS_SPEC_MGMT_REQUIRED 22
-#define WLAN_STATUS_PWR_CAPABILITY_NOT_VALID 23
-#define WLAN_STATUS_SUPPORTED_CHANNEL_NOT_VALID 24
-/* IEEE 802.11g */
-#define WLAN_STATUS_ASSOC_DENIED_NO_SHORT_SLOT_TIME 25
-#define WLAN_STATUS_ASSOC_DENIED_NO_DSSS_OFDM 26
-#define WLAN_STATUS_ASSOC_DENIED_NO_HT 27
-#define WLAN_STATUS_R0KH_UNREACHABLE 28
-#define WLAN_STATUS_ASSOC_DENIED_NO_PCO 29
-/* IEEE 802.11w */
-#define WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY 30
-#define WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION 31
-#define WLAN_STATUS_UNSPECIFIED_QOS_FAILURE 32
-#define WLAN_STATUS_REQUEST_DECLINED 37
-#define WLAN_STATUS_INVALID_PARAMETERS 38
-/* IEEE 802.11i */
-#define WLAN_STATUS_INVALID_IE 40
-#define WLAN_STATUS_GROUP_CIPHER_NOT_VALID 41
-#define WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID 42
-#define WLAN_STATUS_AKMP_NOT_VALID 43
-#define WLAN_STATUS_UNSUPPORTED_RSN_IE_VERSION 44
-#define WLAN_STATUS_INVALID_RSN_IE_CAPAB 45
-#define WLAN_STATUS_CIPHER_REJECTED_PER_POLICY 46
-#define WLAN_STATUS_TS_NOT_CREATED 47
-#define WLAN_STATUS_DIRECT_LINK_NOT_ALLOWED 48
-#define WLAN_STATUS_DEST_STA_NOT_PRESENT 49
-#define WLAN_STATUS_DEST_STA_NOT_QOS_STA 50
-#define WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE 51
-/* IEEE 802.11r */
-#define WLAN_STATUS_INVALID_FT_ACTION_FRAME_COUNT 52
-#define WLAN_STATUS_INVALID_PMKID 53
-#define WLAN_STATUS_INVALID_MDIE 54
-#define WLAN_STATUS_INVALID_FTIE 55
-#define WLAN_STATUS_INVALID_RSNIE 72
-
-/* Reason codes (IEEE 802.11-2007, 7.3.1.7, Table 7-22) */
-#define WLAN_REASON_UNSPECIFIED 1
-#define WLAN_REASON_PREV_AUTH_NOT_VALID 2
-#define WLAN_REASON_DEAUTH_LEAVING 3
-#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4
-#define WLAN_REASON_DISASSOC_AP_BUSY 5
-#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6
-#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7
-#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8
-#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9
-/* IEEE 802.11h */
-#define WLAN_REASON_PWR_CAPABILITY_NOT_VALID 10
-#define WLAN_REASON_SUPPORTED_CHANNEL_NOT_VALID 11
-/* IEEE 802.11i */
-#define WLAN_REASON_INVALID_IE 13
-#define WLAN_REASON_MICHAEL_MIC_FAILURE 14
-#define WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT 15
-#define WLAN_REASON_GROUP_KEY_UPDATE_TIMEOUT 16
-#define WLAN_REASON_IE_IN_4WAY_DIFFERS 17
-#define WLAN_REASON_GROUP_CIPHER_NOT_VALID 18
-#define WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID 19
-#define WLAN_REASON_AKMP_NOT_VALID 20
-#define WLAN_REASON_UNSUPPORTED_RSN_IE_VERSION 21
-#define WLAN_REASON_INVALID_RSN_IE_CAPAB 22
-#define WLAN_REASON_IEEE_802_1X_AUTH_FAILED 23
-#define WLAN_REASON_CIPHER_SUITE_REJECTED 24
-#define WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE 25
-#define WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED 26
-/* IEEE 802.11e */
-#define WLAN_REASON_DISASSOC_LOW_ACK 34
-
-
-/* Information Element IDs */
-#define WLAN_EID_SSID 0
-#define WLAN_EID_SUPP_RATES 1
-#define WLAN_EID_FH_PARAMS 2
-#define WLAN_EID_DS_PARAMS 3
-#define WLAN_EID_CF_PARAMS 4
-#define WLAN_EID_TIM 5
-#define WLAN_EID_IBSS_PARAMS 6
-#define WLAN_EID_COUNTRY 7
-#define WLAN_EID_CHALLENGE 16
-/* EIDs defined by IEEE 802.11h - START */
-#define WLAN_EID_PWR_CONSTRAINT 32
-#define WLAN_EID_PWR_CAPABILITY 33
-#define WLAN_EID_TPC_REQUEST 34
-#define WLAN_EID_TPC_REPORT 35
-#define WLAN_EID_SUPPORTED_CHANNELS 36
-#define WLAN_EID_CHANNEL_SWITCH 37
-#define WLAN_EID_MEASURE_REQUEST 38
-#define WLAN_EID_MEASURE_REPORT 39
-#define WLAN_EID_QUITE 40
-#define WLAN_EID_IBSS_DFS 41
-/* EIDs defined by IEEE 802.11h - END */
-#define WLAN_EID_ERP_INFO 42
-#define WLAN_EID_HT_CAP 45
-#define WLAN_EID_RSN 48
-#define WLAN_EID_EXT_SUPP_RATES 50
-#define WLAN_EID_MOBILITY_DOMAIN 54
-#define WLAN_EID_FAST_BSS_TRANSITION 55
-#define WLAN_EID_TIMEOUT_INTERVAL 56
-#define WLAN_EID_RIC_DATA 57
-#define WLAN_EID_HT_OPERATION 61
-#define WLAN_EID_SECONDARY_CHANNEL_OFFSET 62
-#define WLAN_EID_20_40_BSS_COEXISTENCE 72
-#define WLAN_EID_20_40_BSS_INTOLERANT 73
-#define WLAN_EID_OVERLAPPING_BSS_SCAN_PARAMS 74
-#define WLAN_EID_MMIE 76
-#define WLAN_EID_LINK_ID 101
-#define WLAN_EID_ADV_PROTO 108
-#define WLAN_EID_EXT_CAPAB 127
-#define WLAN_EID_VENDOR_SPECIFIC 221
-
-
-/* Action frame categories (IEEE 802.11-2007, 7.3.1.11, Table 7-24) */
-#define WLAN_ACTION_SPECTRUM_MGMT 0
-#define WLAN_ACTION_QOS 1
-#define WLAN_ACTION_DLS 2
-#define WLAN_ACTION_BLOCK_ACK 3
-#define WLAN_ACTION_PUBLIC 4
-#define WLAN_ACTION_RADIO_MEASUREMENT 5
-#define WLAN_ACTION_FT 6
-#define WLAN_ACTION_HT 7
-#define WLAN_ACTION_SA_QUERY 8
-#define WLAN_ACTION_TDLS 12
-#define WLAN_ACTION_WMM 17 /* WMM Specification 1.1 */
-#define WLAN_ACTION_VENDOR_SPECIFIC 127
-
-/* Public action codes */
-#define WLAN_PA_VENDOR_SPECIFIC 9
-#define WLAN_PA_GAS_INITIAL_REQ 10
-#define WLAN_PA_GAS_INITIAL_RESP 11
-#define WLAN_PA_GAS_COMEBACK_REQ 12
-#define WLAN_PA_GAS_COMEBACK_RESP 13
-
-/* SA Query Action frame (IEEE 802.11w/D8.0, 7.4.9) */
-#define WLAN_SA_QUERY_REQUEST 0
-#define WLAN_SA_QUERY_RESPONSE 1
-
-#define WLAN_SA_QUERY_TR_ID_LEN 2
-
-/* TDLS action codes */
-#define WLAN_TDLS_SETUP_REQUEST 0
-#define WLAN_TDLS_SETUP_RESPONSE 1
-#define WLAN_TDLS_SETUP_CONFIRM 2
-#define WLAN_TDLS_TEARDOWN 3
-#define WLAN_TDLS_PEER_TRAFFIC_INDICATION 4
-#define WLAN_TDLS_CHANNEL_SWITCH_REQUEST 5
-#define WLAN_TDLS_CHANNEL_SWITCH_RESPONSE 6
-#define WLAN_TDLS_PEER_PSM_REQUEST 7
-#define WLAN_TDLS_PEER_PSM_RESPONSE 8
-#define WLAN_TDLS_PEER_TRAFFIC_RESPONSE 9
-#define WLAN_TDLS_DISCOVERY_REQUEST 10
-
-/* Timeout Interval Type */
-#define WLAN_TIMEOUT_REASSOC_DEADLINE 1
-#define WLAN_TIMEOUT_KEY_LIFETIME 2
-#define WLAN_TIMEOUT_ASSOC_COMEBACK 3
-
-/* Advertisement Protocol ID definitions (IEEE 802.11u) */
-enum adv_proto_id {
- NATIVE_QUERY_PROTOCOL = 0,
- MIH_INFO_SERVICE = 1,
- MIH_CMD_AND_EVENT_DISCOVERY = 2,
- EMERGENCY_ALERT_SYSTEM = 3,
- LOCATION_TO_SERVICE = 4,
- ADV_PROTO_VENDOR_SPECIFIC = 221
-};
-
-/* Native Query Protocol info ID definitions (IEEE 802.11u) */
-enum nqp_info_id {
- NQP_CAPABILITY_LIST = 256,
- NQP_VENUE_NAME = 257,
- NQP_EMERGENCY_CALL_NUMBER = 258,
- NQP_NETWORK_AUTH_TYPE = 259,
- NQP_ROAMING_CONSORTIUM = 260,
- NQP_IP_ADDR_TYPE_AVAILABILITY = 261,
- NQP_NAI_REALM = 262,
- NQP_3GPP_CELLULAR_NETWORK = 263,
- NQP_AP_GEOSPATIAL_LOCATION = 264,
- NQP_AP_CIVIC_LOCATION = 265,
- NQP_DOMAIN_NAME = 266,
- NQP_EMERGENCY_ALERT_URI = 267,
- NQP_VENDOR_SPECIFIC = 56797
-};
-
-
-#ifdef _MSC_VER
-#pragma pack(push, 1)
-#endif /* _MSC_VER */
-
-struct ieee80211_hdr {
- le16 frame_control;
- le16 duration_id;
- u8 addr1[6];
- u8 addr2[6];
- u8 addr3[6];
- le16 seq_ctrl;
- /* followed by 'u8 addr4[6];' if ToDS and FromDS is set in data frame
- */
-} STRUCT_PACKED;
-
-#define IEEE80211_DA_FROMDS addr1
-#define IEEE80211_BSSID_FROMDS addr2
-#define IEEE80211_SA_FROMDS addr3
-
-#define IEEE80211_HDRLEN (sizeof(struct ieee80211_hdr))
-
-#define IEEE80211_FC(type, stype) host_to_le16((type << 2) | (stype << 4))
-
-struct ieee80211_mgmt {
- le16 frame_control;
- le16 duration;
- u8 da[6];
- u8 sa[6];
- u8 bssid[6];
- le16 seq_ctrl;
- union {
- struct {
- le16 auth_alg;
- le16 auth_transaction;
- le16 status_code;
- /* possibly followed by Challenge text */
- u8 variable[0];
- } STRUCT_PACKED auth;
- struct {
- le16 reason_code;
- u8 variable[0];
- } STRUCT_PACKED deauth;
- struct {
- le16 capab_info;
- le16 listen_interval;
- /* followed by SSID and Supported rates */
- u8 variable[0];
- } STRUCT_PACKED assoc_req;
- struct {
- le16 capab_info;
- le16 status_code;
- le16 aid;
- /* followed by Supported rates */
- u8 variable[0];
- } STRUCT_PACKED assoc_resp, reassoc_resp;
- struct {
- le16 capab_info;
- le16 listen_interval;
- u8 current_ap[6];
- /* followed by SSID and Supported rates */
- u8 variable[0];
- } STRUCT_PACKED reassoc_req;
- struct {
- le16 reason_code;
- u8 variable[0];
- } STRUCT_PACKED disassoc;
- struct {
- u8 timestamp[8];
- le16 beacon_int;
- le16 capab_info;
- /* followed by some of SSID, Supported rates,
- * FH Params, DS Params, CF Params, IBSS Params, TIM */
- u8 variable[0];
- } STRUCT_PACKED beacon;
- struct {
- /* only variable items: SSID, Supported rates */
- u8 variable[0];
- } STRUCT_PACKED probe_req;
- struct {
- u8 timestamp[8];
- le16 beacon_int;
- le16 capab_info;
- /* followed by some of SSID, Supported rates,
- * FH Params, DS Params, CF Params, IBSS Params */
- u8 variable[0];
- } STRUCT_PACKED probe_resp;
- struct {
- u8 category;
- union {
- struct {
- u8 action_code;
- u8 dialog_token;
- u8 status_code;
- u8 variable[0];
- } STRUCT_PACKED wmm_action;
- struct{
- u8 action_code;
- u8 element_id;
- u8 length;
- u8 switch_mode;
- u8 new_chan;
- u8 switch_count;
- } STRUCT_PACKED chan_switch;
- struct {
- u8 action;
- u8 sta_addr[ETH_ALEN];
- u8 target_ap_addr[ETH_ALEN];
- u8 variable[0]; /* FT Request */
- } STRUCT_PACKED ft_action_req;
- struct {
- u8 action;
- u8 sta_addr[ETH_ALEN];
- u8 target_ap_addr[ETH_ALEN];
- le16 status_code;
- u8 variable[0]; /* FT Request */
- } STRUCT_PACKED ft_action_resp;
- struct {
- u8 action;
- u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
- } STRUCT_PACKED sa_query_req;
- struct {
- u8 action; /* */
- u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
- } STRUCT_PACKED sa_query_resp;
- struct {
- u8 action;
- u8 variable[0];
- } STRUCT_PACKED public_action;
- struct {
- u8 action; /* 9 */
- u8 oui[3];
- /* Vendor-specific content */
- u8 variable[0];
- } STRUCT_PACKED vs_public_action;
- } u;
- } STRUCT_PACKED action;
- } u;
-} STRUCT_PACKED;
-
-
-struct ieee80211_ht_capabilities {
- le16 ht_capabilities_info;
- u8 a_mpdu_params;
- u8 supported_mcs_set[16];
- le16 ht_extended_capabilities;
- le32 tx_bf_capability_info;
- u8 asel_capabilities;
-} STRUCT_PACKED;
-
-
-struct ieee80211_ht_operation {
- u8 control_chan;
- u8 ht_param;
- le16 operation_mode;
- le16 stbc_param;
- u8 basic_set[16];
-} STRUCT_PACKED;
-
-#ifdef _MSC_VER
-#pragma pack(pop)
-#endif /* _MSC_VER */
-
-#define ERP_INFO_NON_ERP_PRESENT BIT(0)
-#define ERP_INFO_USE_PROTECTION BIT(1)
-#define ERP_INFO_BARKER_PREAMBLE_MODE BIT(2)
-
-
-#define HT_CAP_INFO_LDPC_CODING_CAP ((u16) BIT(0))
-#define HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET ((u16) BIT(1))
-#define HT_CAP_INFO_SMPS_MASK ((u16) (BIT(2) | BIT(3)))
-#define HT_CAP_INFO_SMPS_STATIC ((u16) 0)
-#define HT_CAP_INFO_SMPS_DYNAMIC ((u16) BIT(2))
-#define HT_CAP_INFO_SMPS_DISABLED ((u16) (BIT(2) | BIT(3)))
-#define HT_CAP_INFO_GREEN_FIELD ((u16) BIT(4))
-#define HT_CAP_INFO_SHORT_GI20MHZ ((u16) BIT(5))
-#define HT_CAP_INFO_SHORT_GI40MHZ ((u16) BIT(6))
-#define HT_CAP_INFO_TX_STBC ((u16) BIT(7))
-#define HT_CAP_INFO_RX_STBC_MASK ((u16) (BIT(8) | BIT(9)))
-#define HT_CAP_INFO_RX_STBC_1 ((u16) BIT(8))
-#define HT_CAP_INFO_RX_STBC_12 ((u16) BIT(9))
-#define HT_CAP_INFO_RX_STBC_123 ((u16) (BIT(8) | BIT(9)))
-#define HT_CAP_INFO_DELAYED_BA ((u16) BIT(10))
-#define HT_CAP_INFO_MAX_AMSDU_SIZE ((u16) BIT(11))
-#define HT_CAP_INFO_DSSS_CCK40MHZ ((u16) BIT(12))
-#define HT_CAP_INFO_PSMP_SUPP ((u16) BIT(13))
-#define HT_CAP_INFO_40MHZ_INTOLERANT ((u16) BIT(14))
-#define HT_CAP_INFO_LSIG_TXOP_PROTECT_SUPPORT ((u16) BIT(15))
-
-
-#define EXT_HT_CAP_INFO_PCO ((u16) BIT(0))
-#define EXT_HT_CAP_INFO_TRANS_TIME_OFFSET 1
-#define EXT_HT_CAP_INFO_MCS_FEEDBACK_OFFSET 8
-#define EXT_HT_CAP_INFO_HTC_SUPPORTED ((u16) BIT(10))
-#define EXT_HT_CAP_INFO_RD_RESPONDER ((u16) BIT(11))
-
-
-#define TX_BEAMFORM_CAP_TXBF_CAP ((u32) BIT(0))
-#define TX_BEAMFORM_CAP_RX_STAGGERED_SOUNDING_CAP ((u32) BIT(1))
-#define TX_BEAMFORM_CAP_TX_STAGGERED_SOUNDING_CAP ((u32) BIT(2))
-#define TX_BEAMFORM_CAP_RX_ZLF_CAP ((u32) BIT(3))
-#define TX_BEAMFORM_CAP_TX_ZLF_CAP ((u32) BIT(4))
-#define TX_BEAMFORM_CAP_IMPLICIT_ZLF_CAP ((u32) BIT(5))
-#define TX_BEAMFORM_CAP_CALIB_OFFSET 6
-#define TX_BEAMFORM_CAP_EXPLICIT_CSI_TXBF_CAP ((u32) BIT(8))
-#define TX_BEAMFORM_CAP_EXPLICIT_UNCOMPR_STEERING_MATRIX_CAP ((u32) BIT(9))
-#define TX_BEAMFORM_CAP_EXPLICIT_BF_CSI_FEEDBACK_CAP ((u32) BIT(10))
-#define TX_BEAMFORM_CAP_EXPLICIT_BF_CSI_FEEDBACK_OFFSET 11
-#define TX_BEAMFORM_CAP_EXPLICIT_UNCOMPR_STEERING_MATRIX_FEEDBACK_OFFSET 13
-#define TX_BEAMFORM_CAP_EXPLICIT_COMPRESSED_STEERING_MATRIX_FEEDBACK_OFFSET 15
-#define TX_BEAMFORM_CAP_MINIMAL_GROUPING_OFFSET 17
-#define TX_BEAMFORM_CAP_CSI_NUM_BEAMFORMER_ANT_OFFSET 19
-#define TX_BEAMFORM_CAP_UNCOMPRESSED_STEERING_MATRIX_BEAMFORMER_ANT_OFFSET 21
-#define TX_BEAMFORM_CAP_COMPRESSED_STEERING_MATRIX_BEAMFORMER_ANT_OFFSET 23
-#define TX_BEAMFORM_CAP_SCI_MAX_OF_ROWS_BEANFORMER_SUPPORTED_OFFSET 25
-
-
-#define ASEL_CAPABILITY_ASEL_CAPABLE ((u8) BIT(0))
-#define ASEL_CAPABILITY_EXPLICIT_CSI_FEEDBACK_BASED_TX_AS_CAP ((u8) BIT(1))
-#define ASEL_CAPABILITY_ANT_INDICES_FEEDBACK_BASED_TX_AS_CAP ((u8) BIT(2))
-#define ASEL_CAPABILITY_EXPLICIT_CSI_FEEDBACK_CAP ((u8) BIT(3))
-#define ASEL_CAPABILITY_ANT_INDICES_FEEDBACK_CAP ((u8) BIT(4))
-#define ASEL_CAPABILITY_RX_AS_CAP ((u8) BIT(5))
-#define ASEL_CAPABILITY_TX_SOUND_PPDUS_CAP ((u8) BIT(6))
-
-#define HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK ((u8) BIT(0) | BIT(1))
-#define HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE ((u8) BIT(0))
-#define HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW ((u8) BIT(0) | BIT(1))
-#define HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH ((u8) BIT(2))
-#define HT_INFO_HT_PARAM_RIFS_MODE ((u8) BIT(3))
-#define HT_INFO_HT_PARAM_CTRL_ACCESS_ONLY ((u8) BIT(4))
-#define HT_INFO_HT_PARAM_SRV_INTERVAL_GRANULARITY ((u8) BIT(5))
-
-
-#define OP_MODE_PURE 0
-#define OP_MODE_MAY_BE_LEGACY_STAS 1
-#define OP_MODE_20MHZ_HT_STA_ASSOCED 2
-#define OP_MODE_MIXED 3
-
-#define HT_INFO_OPERATION_MODE_OP_MODE_MASK \
- ((le16) (0x0001 | 0x0002))
-#define HT_INFO_OPERATION_MODE_OP_MODE_OFFSET 0
-#define HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT ((u8) BIT(2))
-#define HT_INFO_OPERATION_MODE_TRANSMIT_BURST_LIMIT ((u8) BIT(3))
-#define HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT ((u8) BIT(4))
-
-#define HT_INFO_STBC_PARAM_DUAL_BEACON ((u16) BIT(6))
-#define HT_INFO_STBC_PARAM_DUAL_STBC_PROTECT ((u16) BIT(7))
-#define HT_INFO_STBC_PARAM_SECONDARY_BCN ((u16) BIT(8))
-#define HT_INFO_STBC_PARAM_LSIG_TXOP_PROTECT_ALLOWED ((u16) BIT(9))
-#define HT_INFO_STBC_PARAM_PCO_ACTIVE ((u16) BIT(10))
-#define HT_INFO_STBC_PARAM_PCO_PHASE ((u16) BIT(11))
-
-#define BSS_MEMBERSHIP_SELECTOR_HT_PHY 127
-
-#define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs)
- * 00:50:F2 */
-#define WPA_IE_VENDOR_TYPE 0x0050f201
-#define WPS_IE_VENDOR_TYPE 0x0050f204
-#define OUI_WFA 0x506f9a
-#define P2P_IE_VENDOR_TYPE 0x506f9a09
-
-#define WMM_OUI_TYPE 2
-#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0
-#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1
-#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2
-#define WMM_VERSION 1
-
-#define WMM_ACTION_CODE_ADDTS_REQ 0
-#define WMM_ACTION_CODE_ADDTS_RESP 1
-#define WMM_ACTION_CODE_DELTS 2
-
-#define WMM_ADDTS_STATUS_ADMISSION_ACCEPTED 0
-#define WMM_ADDTS_STATUS_INVALID_PARAMETERS 1
-/* 2 - Reserved */
-#define WMM_ADDTS_STATUS_REFUSED 3
-/* 4-255 - Reserved */
-
-/* WMM TSPEC Direction Field Values */
-#define WMM_TSPEC_DIRECTION_UPLINK 0
-#define WMM_TSPEC_DIRECTION_DOWNLINK 1
-/* 2 - Reserved */
-#define WMM_TSPEC_DIRECTION_BI_DIRECTIONAL 3
-
-/*
- * WMM Information Element (used in (Re)Association Request frames; may also be
- * used in Beacon frames)
- */
-struct wmm_information_element {
- /* Element ID: 221 (0xdd); Length: 7 */
- /* required fields for WMM version 1 */
- u8 oui[3]; /* 00:50:f2 */
- u8 oui_type; /* 2 */
- u8 oui_subtype; /* 0 */
- u8 version; /* 1 for WMM version 1.0 */
- u8 qos_info; /* AP/STA specific QoS info */
-
-} STRUCT_PACKED;
-
-#define WMM_AC_AIFSN_MASK 0x0f
-#define WMM_AC_AIFNS_SHIFT 0
-#define WMM_AC_ACM 0x10
-#define WMM_AC_ACI_MASK 0x60
-#define WMM_AC_ACI_SHIFT 5
-
-#define WMM_AC_ECWMIN_MASK 0x0f
-#define WMM_AC_ECWMIN_SHIFT 0
-#define WMM_AC_ECWMAX_MASK 0xf0
-#define WMM_AC_ECWMAX_SHIFT 4
-
-struct wmm_ac_parameter {
- u8 aci_aifsn; /* AIFSN, ACM, ACI */
- u8 cw; /* ECWmin, ECWmax (CW = 2^ECW - 1) */
- le16 txop_limit;
-} STRUCT_PACKED;
-
-/*
- * WMM Parameter Element (used in Beacon, Probe Response, and (Re)Association
- * Response frmaes)
- */
-struct wmm_parameter_element {
- /* Element ID: 221 (0xdd); Length: 24 */
- /* required fields for WMM version 1 */
- u8 oui[3]; /* 00:50:f2 */
- u8 oui_type; /* 2 */
- u8 oui_subtype; /* 1 */
- u8 version; /* 1 for WMM version 1.0 */
- u8 qos_info; /* AP/STA specif QoS info */
- u8 reserved; /* 0 */
- struct wmm_ac_parameter ac[4]; /* AC_BE, AC_BK, AC_VI, AC_VO */
-
-} STRUCT_PACKED;
-
-/* WMM TSPEC Element */
-struct wmm_tspec_element {
- u8 eid; /* 221 = 0xdd */
- u8 length; /* 6 + 55 = 61 */
- u8 oui[3]; /* 00:50:f2 */
- u8 oui_type; /* 2 */
- u8 oui_subtype; /* 2 */
- u8 version; /* 1 */
- /* WMM TSPEC body (55 octets): */
- u8 ts_info[3];
- le16 nominal_msdu_size;
- le16 maximum_msdu_size;
- le32 minimum_service_interval;
- le32 maximum_service_interval;
- le32 inactivity_interval;
- le32 suspension_interval;
- le32 service_start_time;
- le32 minimum_data_rate;
- le32 mean_data_rate;
- le32 peak_data_rate;
- le32 maximum_burst_size;
- le32 delay_bound;
- le32 minimum_phy_rate;
- le16 surplus_bandwidth_allowance;
- le16 medium_time;
-} STRUCT_PACKED;
-
-
-/* Access Categories / ACI to AC coding */
-enum {
- WMM_AC_BE = 0 /* Best Effort */,
- WMM_AC_BK = 1 /* Background */,
- WMM_AC_VI = 2 /* Video */,
- WMM_AC_VO = 3 /* Voice */
-};
-
-
-/* Wi-Fi Direct (P2P) */
-
-#define P2P_OUI_TYPE 9
-
-enum p2p_attr_id {
- P2P_ATTR_STATUS = 0,
- P2P_ATTR_MINOR_REASON_CODE = 1,
- P2P_ATTR_CAPABILITY = 2,
- P2P_ATTR_DEVICE_ID = 3,
- P2P_ATTR_GROUP_OWNER_INTENT = 4,
- P2P_ATTR_CONFIGURATION_TIMEOUT = 5,
- P2P_ATTR_LISTEN_CHANNEL = 6,
- P2P_ATTR_GROUP_BSSID = 7,
- P2P_ATTR_EXT_LISTEN_TIMING = 8,
- P2P_ATTR_INTENDED_INTERFACE_ADDR = 9,
- P2P_ATTR_MANAGEABILITY = 10,
- P2P_ATTR_CHANNEL_LIST = 11,
- P2P_ATTR_NOTICE_OF_ABSENCE = 12,
- P2P_ATTR_DEVICE_INFO = 13,
- P2P_ATTR_GROUP_INFO = 14,
- P2P_ATTR_GROUP_ID = 15,
- P2P_ATTR_INTERFACE = 16,
- P2P_ATTR_OPERATING_CHANNEL = 17,
- P2P_ATTR_INVITATION_FLAGS = 18,
- P2P_ATTR_VENDOR_SPECIFIC = 221
-};
-
-#define P2P_MAX_GO_INTENT 15
-
-/* P2P Capability - Device Capability bitmap */
-#define P2P_DEV_CAPAB_SERVICE_DISCOVERY BIT(0)
-#define P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY BIT(1)
-#define P2P_DEV_CAPAB_CONCURRENT_OPER BIT(2)
-#define P2P_DEV_CAPAB_INFRA_MANAGED BIT(3)
-#define P2P_DEV_CAPAB_DEVICE_LIMIT BIT(4)
-#define P2P_DEV_CAPAB_INVITATION_PROCEDURE BIT(5)
-
-/* P2P Capability - Group Capability bitmap */
-#define P2P_GROUP_CAPAB_GROUP_OWNER BIT(0)
-#define P2P_GROUP_CAPAB_PERSISTENT_GROUP BIT(1)
-#define P2P_GROUP_CAPAB_GROUP_LIMIT BIT(2)
-#define P2P_GROUP_CAPAB_INTRA_BSS_DIST BIT(3)
-#define P2P_GROUP_CAPAB_CROSS_CONN BIT(4)
-#define P2P_GROUP_CAPAB_PERSISTENT_RECONN BIT(5)
-#define P2P_GROUP_CAPAB_GROUP_FORMATION BIT(6)
-
-/* Invitation Flags */
-#define P2P_INVITATION_FLAGS_TYPE BIT(0)
-
-/* P2P Manageability */
-#define P2P_MAN_DEVICE_MANAGEMENT BIT(0)
-#define P2P_MAN_CROSS_CONNECTION_PERMITTED BIT(1)
-#define P2P_MAN_COEXISTENCE_OPTIONAL BIT(2)
-
-enum p2p_status_code {
- P2P_SC_SUCCESS = 0,
- P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE = 1,
- P2P_SC_FAIL_INCOMPATIBLE_PARAMS = 2,
- P2P_SC_FAIL_LIMIT_REACHED = 3,
- P2P_SC_FAIL_INVALID_PARAMS = 4,
- P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE = 5,
- P2P_SC_FAIL_PREV_PROTOCOL_ERROR = 6,
- P2P_SC_FAIL_NO_COMMON_CHANNELS = 7,
- P2P_SC_FAIL_UNKNOWN_GROUP = 8,
- P2P_SC_FAIL_BOTH_GO_INTENT_15 = 9,
- P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD = 10,
- P2P_SC_FAIL_REJECTED_BY_USER = 11,
-};
-
-#define P2P_WILDCARD_SSID "DIRECT-"
-#define P2P_WILDCARD_SSID_LEN 7
-
-/* P2P action frames */
-enum p2p_act_frame_type {
- P2P_NOA = 0,
- P2P_PRESENCE_REQ = 1,
- P2P_PRESENCE_RESP = 2,
- P2P_GO_DISC_REQ = 3
-};
-
-/* P2P public action frames */
-enum p2p_action_frame_type {
- P2P_GO_NEG_REQ = 0,
- P2P_GO_NEG_RESP = 1,
- P2P_GO_NEG_CONF = 2,
- P2P_INVITATION_REQ = 3,
- P2P_INVITATION_RESP = 4,
- P2P_DEV_DISC_REQ = 5,
- P2P_DEV_DISC_RESP = 6,
- P2P_PROV_DISC_REQ = 7,
- P2P_PROV_DISC_RESP = 8
-};
-
-enum p2p_service_protocol_type {
- P2P_SERV_ALL_SERVICES = 0,
- P2P_SERV_BONJOUR = 1,
- P2P_SERV_UPNP = 2,
- P2P_SERV_WS_DISCOVERY = 3,
- P2P_SERV_VENDOR_SPECIFIC = 255
-};
-
-enum p2p_sd_status {
- P2P_SD_SUCCESS = 0,
- P2P_SD_PROTO_NOT_AVAILABLE = 1,
- P2P_SD_REQUESTED_INFO_NOT_AVAILABLE = 2,
- P2P_SD_BAD_REQUEST = 3
-};
-
-
-#define OUI_BROADCOM 0x00904c /* Broadcom (Epigram) */
-
-#define VENDOR_HT_CAPAB_OUI_TYPE 0x33 /* 00-90-4c:0x33 */
-
-/* cipher suite selectors */
-#define WLAN_CIPHER_SUITE_USE_GROUP 0x000FAC00
-#define WLAN_CIPHER_SUITE_WEP40 0x000FAC01
-#define WLAN_CIPHER_SUITE_TKIP 0x000FAC02
-/* reserved: 0x000FAC03 */
-#define WLAN_CIPHER_SUITE_CCMP 0x000FAC04
-#define WLAN_CIPHER_SUITE_WEP104 0x000FAC05
-#define WLAN_CIPHER_SUITE_AES_CMAC 0x000FAC06
-
-/* AKM suite selectors */
-#define WLAN_AKM_SUITE_8021X 0x000FAC01
-#define WLAN_AKM_SUITE_PSK 0x000FAC02
-
-#endif /* IEEE802_11_DEFS_H */
diff --git a/hostapd-0.8/src/common/privsep_commands.h b/hostapd-0.8/src/common/privsep_commands.h
deleted file mode 100644
index cc900be..0000000
--- a/hostapd-0.8/src/common/privsep_commands.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * WPA Supplicant - privilege separation commands
- * Copyright (c) 2007-2009, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef PRIVSEP_COMMANDS_H
-#define PRIVSEP_COMMANDS_H
-
-enum privsep_cmd {
- PRIVSEP_CMD_REGISTER,
- PRIVSEP_CMD_UNREGISTER,
- PRIVSEP_CMD_SCAN,
- PRIVSEP_CMD_GET_SCAN_RESULTS,
- PRIVSEP_CMD_ASSOCIATE,
- PRIVSEP_CMD_GET_BSSID,
- PRIVSEP_CMD_GET_SSID,
- PRIVSEP_CMD_SET_KEY,
- PRIVSEP_CMD_GET_CAPA,
- PRIVSEP_CMD_L2_REGISTER,
- PRIVSEP_CMD_L2_UNREGISTER,
- PRIVSEP_CMD_L2_NOTIFY_AUTH_START,
- PRIVSEP_CMD_L2_SEND,
- PRIVSEP_CMD_SET_COUNTRY,
-};
-
-struct privsep_cmd_associate
-{
- u8 bssid[ETH_ALEN];
- u8 ssid[32];
- size_t ssid_len;
- int freq;
- int pairwise_suite;
- int group_suite;
- int key_mgmt_suite;
- int auth_alg;
- int mode;
- size_t wpa_ie_len;
- /* followed by wpa_ie_len bytes of wpa_ie */
-};
-
-struct privsep_cmd_set_key
-{
- int alg;
- u8 addr[ETH_ALEN];
- int key_idx;
- int set_tx;
- u8 seq[8];
- size_t seq_len;
- u8 key[32];
- size_t key_len;
-};
-
-enum privsep_event {
- PRIVSEP_EVENT_SCAN_RESULTS,
- PRIVSEP_EVENT_ASSOC,
- PRIVSEP_EVENT_DISASSOC,
- PRIVSEP_EVENT_ASSOCINFO,
- PRIVSEP_EVENT_MICHAEL_MIC_FAILURE,
- PRIVSEP_EVENT_INTERFACE_STATUS,
- PRIVSEP_EVENT_PMKID_CANDIDATE,
- PRIVSEP_EVENT_STKSTART,
- PRIVSEP_EVENT_FT_RESPONSE,
- PRIVSEP_EVENT_RX_EAPOL,
-};
-
-#endif /* PRIVSEP_COMMANDS_H */
diff --git a/hostapd-0.8/src/common/version.h b/hostapd-0.8/src/common/version.h
deleted file mode 100644
index ba2d2c0..0000000
--- a/hostapd-0.8/src/common/version.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef VERSION_H
-#define VERSION_H
-
-#ifndef VERSION_STR_POSTFIX
-#define VERSION_STR_POSTFIX ""
-#endif /* VERSION_STR_POSTFIX */
-
-#define VERSION_STR "0.8.x" VERSION_STR_POSTFIX
-
-#endif /* VERSION_H */
diff --git a/hostapd-0.8/src/common/wpa_common.c b/hostapd-0.8/src/common/wpa_common.c
deleted file mode 100644
index eb2745e..0000000
--- a/hostapd-0.8/src/common/wpa_common.c
+++ /dev/null
@@ -1,927 +0,0 @@
-/*
- * WPA/RSN - Shared functions for supplicant and authenticator
- * Copyright (c) 2002-2008, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "includes.h"
-
-#include "common.h"
-#include "crypto/md5.h"
-#include "crypto/sha1.h"
-#include "crypto/sha256.h"
-#include "crypto/aes_wrap.h"
-#include "crypto/crypto.h"
-#include "ieee802_11_defs.h"
-#include "defs.h"
-#include "wpa_common.h"
-
-
-/**
- * wpa_eapol_key_mic - Calculate EAPOL-Key MIC
- * @key: EAPOL-Key Key Confirmation Key (KCK)
- * @ver: Key descriptor version (WPA_KEY_INFO_TYPE_*)
- * @buf: Pointer to the beginning of the EAPOL header (version field)
- * @len: Length of the EAPOL frame (from EAPOL header to the end of the frame)
- * @mic: Pointer to the buffer to which the EAPOL-Key MIC is written
- * Returns: 0 on success, -1 on failure
- *
- * Calculate EAPOL-Key MIC for an EAPOL-Key packet. The EAPOL-Key MIC field has
- * to be cleared (all zeroes) when calling this function.
- *
- * Note: 'IEEE Std 802.11i-2004 - 8.5.2 EAPOL-Key frames' has an error in the
- * description of the Key MIC calculation. It includes packet data from the
- * beginning of the EAPOL-Key header, not EAPOL header. This incorrect change
- * happened during final editing of the standard and the correct behavior is
- * defined in the last draft (IEEE 802.11i/D10).
- */
-int wpa_eapol_key_mic(const u8 *key, int ver, const u8 *buf, size_t len,
- u8 *mic)
-{
- u8 hash[SHA1_MAC_LEN];
-
- switch (ver) {
- case WPA_KEY_INFO_TYPE_HMAC_MD5_RC4:
- return hmac_md5(key, 16, buf, len, mic);
- case WPA_KEY_INFO_TYPE_HMAC_SHA1_AES:
- if (hmac_sha1(key, 16, buf, len, hash))
- return -1;
- os_memcpy(mic, hash, MD5_MAC_LEN);
- break;
-#if defined(CONFIG_IEEE80211R) || defined(CONFIG_IEEE80211W)
- case WPA_KEY_INFO_TYPE_AES_128_CMAC:
- return omac1_aes_128(key, buf, len, mic);
-#endif /* CONFIG_IEEE80211R || CONFIG_IEEE80211W */
- default:
- return -1;
- }
-
- return 0;
-}
-
-
-/**
- * wpa_pmk_to_ptk - Calculate PTK from PMK, addresses, and nonces
- * @pmk: Pairwise master key
- * @pmk_len: Length of PMK
- * @label: Label to use in derivation
- * @addr1: AA or SA
- * @addr2: SA or AA
- * @nonce1: ANonce or SNonce
- * @nonce2: SNonce or ANonce
- * @ptk: Buffer for pairwise transient key
- * @ptk_len: Length of PTK
- * @use_sha256: Whether to use SHA256-based KDF
- *
- * IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy
- * PTK = PRF-X(PMK, "Pairwise key expansion",
- * Min(AA, SA) || Max(AA, SA) ||
- * Min(ANonce, SNonce) || Max(ANonce, SNonce))
- *
- * STK = PRF-X(SMK, "Peer key expansion",
- * Min(MAC_I, MAC_P) || Max(MAC_I, MAC_P) ||
- * Min(INonce, PNonce) || Max(INonce, PNonce))
- */
-void wpa_pmk_to_ptk(const u8 *pmk, size_t pmk_len, const char *label,
- const u8 *addr1, const u8 *addr2,
- const u8 *nonce1, const u8 *nonce2,
- u8 *ptk, size_t ptk_len, int use_sha256)
-{
- u8 data[2 * ETH_ALEN + 2 * WPA_NONCE_LEN];
-
- if (os_memcmp(addr1, addr2, ETH_ALEN) < 0) {
- os_memcpy(data, addr1, ETH_ALEN);
- os_memcpy(data + ETH_ALEN, addr2, ETH_ALEN);
- } else {
- os_memcpy(data, addr2, ETH_ALEN);
- os_memcpy(data + ETH_ALEN, addr1, ETH_ALEN);
- }
-
- if (os_memcmp(nonce1, nonce2, WPA_NONCE_LEN) < 0) {
- os_memcpy(data + 2 * ETH_ALEN, nonce1, WPA_NONCE_LEN);
- os_memcpy(data + 2 * ETH_ALEN + WPA_NONCE_LEN, nonce2,
- WPA_NONCE_LEN);
- } else {
- os_memcpy(data + 2 * ETH_ALEN, nonce2, WPA_NONCE_LEN);
- os_memcpy(data + 2 * ETH_ALEN + WPA_NONCE_LEN, nonce1,
- WPA_NONCE_LEN);
- }
-
-#ifdef CONFIG_IEEE80211W
- if (use_sha256)
- sha256_prf(pmk, pmk_len, label, data, sizeof(data),
- ptk, ptk_len);
- else
-#endif /* CONFIG_IEEE80211W */
- sha1_prf(pmk, pmk_len, label, data, sizeof(data), ptk,
- ptk_len);
-
- wpa_printf(MSG_DEBUG, "WPA: PTK derivation - A1=" MACSTR " A2=" MACSTR,
- MAC2STR(addr1), MAC2STR(addr2));
- wpa_hexdump(MSG_DEBUG, "WPA: Nonce1", nonce1, WPA_NONCE_LEN);
- wpa_hexdump(MSG_DEBUG, "WPA: Nonce2", nonce2, WPA_NONCE_LEN);
- wpa_hexdump_key(MSG_DEBUG, "WPA: PMK", pmk, pmk_len);
- wpa_hexdump_key(MSG_DEBUG, "WPA: PTK", ptk, ptk_len);
-}
-
-
-#ifdef CONFIG_IEEE80211R
-int wpa_ft_mic(const u8 *kck, const u8 *sta_addr, const u8 *ap_addr,
- u8 transaction_seqnum, const u8 *mdie, size_t mdie_len,
- const u8 *ftie, size_t ftie_len,
- const u8 *rsnie, size_t rsnie_len,
- const u8 *ric, size_t ric_len, u8 *mic)
-{
- u8 *buf, *pos;
- size_t buf_len;
-
- buf_len = 2 * ETH_ALEN + 1 + mdie_len + ftie_len + rsnie_len + ric_len;
- buf = os_malloc(buf_len);
- if (buf == NULL)
- return -1;
-
- pos = buf;
- os_memcpy(pos, sta_addr, ETH_ALEN);
- pos += ETH_ALEN;
- os_memcpy(pos, ap_addr, ETH_ALEN);
- pos += ETH_ALEN;
- *pos++ = transaction_seqnum;
- if (rsnie) {
- os_memcpy(pos, rsnie, rsnie_len);
- pos += rsnie_len;
- }
- if (mdie) {
- os_memcpy(pos, mdie, mdie_len);
- pos += mdie_len;
- }
- if (ftie) {
- struct rsn_ftie *_ftie;
- os_memcpy(pos, ftie, ftie_len);
- if (ftie_len < 2 + sizeof(*_ftie)) {
- os_free(buf);
- return -1;
- }
- _ftie = (struct rsn_ftie *) (pos + 2);
- os_memset(_ftie->mic, 0, sizeof(_ftie->mic));
- pos += ftie_len;
- }
- if (ric) {
- os_memcpy(pos, ric, ric_len);
- pos += ric_len;
- }
-
- wpa_hexdump(MSG_MSGDUMP, "FT: MIC data", buf, pos - buf);
- if (omac1_aes_128(kck, buf, pos - buf, mic)) {
- os_free(buf);
- return -1;
- }
-
- os_free(buf);
-
- return 0;
-}
-#endif /* CONFIG_IEEE80211R */
-
-
-#ifndef CONFIG_NO_WPA2
-static int rsn_selector_to_bitfield(const u8 *s)
-{
- if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_NONE)
- return WPA_CIPHER_NONE;
- if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_WEP40)
- return WPA_CIPHER_WEP40;
- if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_TKIP)
- return WPA_CIPHER_TKIP;
- if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_CCMP)
- return WPA_CIPHER_CCMP;
- if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_WEP104)
- return WPA_CIPHER_WEP104;
-#ifdef CONFIG_IEEE80211W
- if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_AES_128_CMAC)
- return WPA_CIPHER_AES_128_CMAC;
-#endif /* CONFIG_IEEE80211W */
- return 0;
-}
-
-
-static int rsn_key_mgmt_to_bitfield(const u8 *s)
-{
- if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_UNSPEC_802_1X)
- return WPA_KEY_MGMT_IEEE8021X;
- if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X)
- return WPA_KEY_MGMT_PSK;
-#ifdef CONFIG_IEEE80211R
- if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_802_1X)
- return WPA_KEY_MGMT_FT_IEEE8021X;
- if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_PSK)
- return WPA_KEY_MGMT_FT_PSK;
-#endif /* CONFIG_IEEE80211R */
-#ifdef CONFIG_IEEE80211W
- if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SHA256)
- return WPA_KEY_MGMT_IEEE8021X_SHA256;
- if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PSK_SHA256)
- return WPA_KEY_MGMT_PSK_SHA256;
-#endif /* CONFIG_IEEE80211W */
- return 0;
-}
-#endif /* CONFIG_NO_WPA2 */
-
-
-/**
- * wpa_parse_wpa_ie_rsn - Parse RSN IE
- * @rsn_ie: Buffer containing RSN IE
- * @rsn_ie_len: RSN IE buffer length (including IE number and length octets)
- * @data: Pointer to structure that will be filled in with parsed data
- * Returns: 0 on success, <0 on failure
- */
-int wpa_parse_wpa_ie_rsn(const u8 *rsn_ie, size_t rsn_ie_len,
- struct wpa_ie_data *data)
-{
-#ifndef CONFIG_NO_WPA2
- const struct rsn_ie_hdr *hdr;
- const u8 *pos;
- int left;
- int i, count;
-
- os_memset(data, 0, sizeof(*data));
- data->proto = WPA_PROTO_RSN;
- data->pairwise_cipher = WPA_CIPHER_CCMP;
- data->group_cipher = WPA_CIPHER_CCMP;
- data->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
- data->capabilities = 0;
- data->pmkid = NULL;
- data->num_pmkid = 0;
-#ifdef CONFIG_IEEE80211W
- data->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
-#else /* CONFIG_IEEE80211W */
- data->mgmt_group_cipher = 0;
-#endif /* CONFIG_IEEE80211W */
-
- if (rsn_ie_len == 0) {
- /* No RSN IE - fail silently */
- return -1;
- }
-
- if (rsn_ie_len < sizeof(struct rsn_ie_hdr)) {
- wpa_printf(MSG_DEBUG, "%s: ie len too short %lu",
- __func__, (unsigned long) rsn_ie_len);
- return -1;
- }
-
- hdr = (const struct rsn_ie_hdr *) rsn_ie;
-
- if (hdr->elem_id != WLAN_EID_RSN ||
- hdr->len != rsn_ie_len - 2 ||
- WPA_GET_LE16(hdr->version) != RSN_VERSION) {
- wpa_printf(MSG_DEBUG, "%s: malformed ie or unknown version",
- __func__);
- return -2;
- }
-
- pos = (const u8 *) (hdr + 1);
- left = rsn_ie_len - sizeof(*hdr);
-
- if (left >= RSN_SELECTOR_LEN) {
- data->group_cipher = rsn_selector_to_bitfield(pos);
-#ifdef CONFIG_IEEE80211W
- if (data->group_cipher == WPA_CIPHER_AES_128_CMAC) {
- wpa_printf(MSG_DEBUG, "%s: AES-128-CMAC used as group "
- "cipher", __func__);
- return -1;
- }
-#endif /* CONFIG_IEEE80211W */
- pos += RSN_SELECTOR_LEN;
- left -= RSN_SELECTOR_LEN;
- } else if (left > 0) {
- wpa_printf(MSG_DEBUG, "%s: ie length mismatch, %u too much",
- __func__, left);
- return -3;
- }
-
- if (left >= 2) {
- data->pairwise_cipher = 0;
- count = WPA_GET_LE16(pos);
- pos += 2;
- left -= 2;
- if (count == 0 || left < count * RSN_SELECTOR_LEN) {
- wpa_printf(MSG_DEBUG, "%s: ie count botch (pairwise), "
- "count %u left %u", __func__, count, left);
- return -4;
- }
- for (i = 0; i < count; i++) {
- data->pairwise_cipher |= rsn_selector_to_bitfield(pos);
- pos += RSN_SELECTOR_LEN;
- left -= RSN_SELECTOR_LEN;
- }
-#ifdef CONFIG_IEEE80211W
- if (data->pairwise_cipher & WPA_CIPHER_AES_128_CMAC) {
- wpa_printf(MSG_DEBUG, "%s: AES-128-CMAC used as "
- "pairwise cipher", __func__);
- return -1;
- }
-#endif /* CONFIG_IEEE80211W */
- } else if (left == 1) {
- wpa_printf(MSG_DEBUG, "%s: ie too short (for key mgmt)",
- __func__);
- return -5;
- }
-
- if (left >= 2) {
- data->key_mgmt = 0;
- count = WPA_GET_LE16(pos);
- pos += 2;
- left -= 2;
- if (count == 0 || left < count * RSN_SELECTOR_LEN) {
- wpa_printf(MSG_DEBUG, "%s: ie count botch (key mgmt), "
- "count %u left %u", __func__, count, left);
- return -6;
- }
- for (i = 0; i < count; i++) {
- data->key_mgmt |= rsn_key_mgmt_to_bitfield(pos);
- pos += RSN_SELECTOR_LEN;
- left -= RSN_SELECTOR_LEN;
- }
- } else if (left == 1) {
- wpa_printf(MSG_DEBUG, "%s: ie too short (for capabilities)",
- __func__);
- return -7;
- }
-
- if (left >= 2) {
- data->capabilities = WPA_GET_LE16(pos);
- pos += 2;
- left -= 2;
- }
-
- if (left >= 2) {
- data->num_pmkid = WPA_GET_LE16(pos);
- pos += 2;
- left -= 2;
- if (left < (int) data->num_pmkid * PMKID_LEN) {
- wpa_printf(MSG_DEBUG, "%s: PMKID underflow "
- "(num_pmkid=%lu left=%d)",
- __func__, (unsigned long) data->num_pmkid,
- left);
- data->num_pmkid = 0;
- return -9;
- } else {
- data->pmkid = pos;
- pos += data->num_pmkid * PMKID_LEN;
- left -= data->num_pmkid * PMKID_LEN;
- }
- }
-
-#ifdef CONFIG_IEEE80211W
- if (left >= 4) {
- data->mgmt_group_cipher = rsn_selector_to_bitfield(pos);
- if (data->mgmt_group_cipher != WPA_CIPHER_AES_128_CMAC) {
- wpa_printf(MSG_DEBUG, "%s: Unsupported management "
- "group cipher 0x%x", __func__,
- data->mgmt_group_cipher);
- return -10;
- }
- pos += RSN_SELECTOR_LEN;
- left -= RSN_SELECTOR_LEN;
- }
-#endif /* CONFIG_IEEE80211W */
-
- if (left > 0) {
- wpa_printf(MSG_DEBUG, "%s: ie has %u trailing bytes - ignored",
- __func__, left);
- }
-
- return 0;
-#else /* CONFIG_NO_WPA2 */
- return -1;
-#endif /* CONFIG_NO_WPA2 */
-}
-
-
-static int wpa_selector_to_bitfield(const u8 *s)
-{
- if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_NONE)
- return WPA_CIPHER_NONE;
- if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_WEP40)
- return WPA_CIPHER_WEP40;
- if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_TKIP)
- return WPA_CIPHER_TKIP;
- if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_CCMP)
- return WPA_CIPHER_CCMP;
- if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_WEP104)
- return WPA_CIPHER_WEP104;
- return 0;
-}
-
-
-static int wpa_key_mgmt_to_bitfield(const u8 *s)
-{
- if (RSN_SELECTOR_GET(s) == WPA_AUTH_KEY_MGMT_UNSPEC_802_1X)
- return WPA_KEY_MGMT_IEEE8021X;
- if (RSN_SELECTOR_GET(s) == WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X)
- return WPA_KEY_MGMT_PSK;
- if (RSN_SELECTOR_GET(s) == WPA_AUTH_KEY_MGMT_NONE)
- return WPA_KEY_MGMT_WPA_NONE;
- return 0;
-}
-
-
-int wpa_parse_wpa_ie_wpa(const u8 *wpa_ie, size_t wpa_ie_len,
- struct wpa_ie_data *data)
-{
- const struct wpa_ie_hdr *hdr;
- const u8 *pos;
- int left;
- int i, count;
-
- os_memset(data, 0, sizeof(*data));
- data->proto = WPA_PROTO_WPA;
- data->pairwise_cipher = WPA_CIPHER_TKIP;
- data->group_cipher = WPA_CIPHER_TKIP;
- data->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
- data->capabilities = 0;
- data->pmkid = NULL;
- data->num_pmkid = 0;
- data->mgmt_group_cipher = 0;
-
- if (wpa_ie_len == 0) {
- /* No WPA IE - fail silently */
- return -1;
- }
-
- if (wpa_ie_len < sizeof(struct wpa_ie_hdr)) {
- wpa_printf(MSG_DEBUG, "%s: ie len too short %lu",
- __func__, (unsigned long) wpa_ie_len);
- return -1;
- }
-
- hdr = (const struct wpa_ie_hdr *) wpa_ie;
-
- if (hdr->elem_id != WLAN_EID_VENDOR_SPECIFIC ||
- hdr->len != wpa_ie_len - 2 ||
- RSN_SELECTOR_GET(hdr->oui) != WPA_OUI_TYPE ||
- WPA_GET_LE16(hdr->version) != WPA_VERSION) {
- wpa_printf(MSG_DEBUG, "%s: malformed ie or unknown version",
- __func__);
- return -2;
- }
-
- pos = (const u8 *) (hdr + 1);
- left = wpa_ie_len - sizeof(*hdr);
-
- if (left >= WPA_SELECTOR_LEN) {
- data->group_cipher = wpa_selector_to_bitfield(pos);
- pos += WPA_SELECTOR_LEN;
- left -= WPA_SELECTOR_LEN;
- } else if (left > 0) {
- wpa_printf(MSG_DEBUG, "%s: ie length mismatch, %u too much",
- __func__, left);
- return -3;
- }
-
- if (left >= 2) {
- data->pairwise_cipher = 0;
- count = WPA_GET_LE16(pos);
- pos += 2;
- left -= 2;
- if (count == 0 || left < count * WPA_SELECTOR_LEN) {
- wpa_printf(MSG_DEBUG, "%s: ie count botch (pairwise), "
- "count %u left %u", __func__, count, left);
- return -4;
- }
- for (i = 0; i < count; i++) {
- data->pairwise_cipher |= wpa_selector_to_bitfield(pos);
- pos += WPA_SELECTOR_LEN;
- left -= WPA_SELECTOR_LEN;
- }
- } else if (left == 1) {
- wpa_printf(MSG_DEBUG, "%s: ie too short (for key mgmt)",
- __func__);
- return -5;
- }
-
- if (left >= 2) {
- data->key_mgmt = 0;
- count = WPA_GET_LE16(pos);
- pos += 2;
- left -= 2;
- if (count == 0 || left < count * WPA_SELECTOR_LEN) {
- wpa_printf(MSG_DEBUG, "%s: ie count botch (key mgmt), "
- "count %u left %u", __func__, count, left);
- return -6;
- }
- for (i = 0; i < count; i++) {
- data->key_mgmt |= wpa_key_mgmt_to_bitfield(pos);
- pos += WPA_SELECTOR_LEN;
- left -= WPA_SELECTOR_LEN;
- }
- } else if (left == 1) {
- wpa_printf(MSG_DEBUG, "%s: ie too short (for capabilities)",
- __func__);
- return -7;
- }
-
- if (left >= 2) {
- data->capabilities = WPA_GET_LE16(pos);
- pos += 2;
- left -= 2;
- }
-
- if (left > 0) {
- wpa_printf(MSG_DEBUG, "%s: ie has %u trailing bytes - ignored",
- __func__, left);
- }
-
- return 0;
-}
-
-
-#ifdef CONFIG_IEEE80211R
-
-/**
- * wpa_derive_pmk_r0 - Derive PMK-R0 and PMKR0Name
- *
- * IEEE Std 802.11r-2008 - 8.5.1.5.3
- */
-void wpa_derive_pmk_r0(const u8 *xxkey, size_t xxkey_len,
- const u8 *ssid, size_t ssid_len,
- const u8 *mdid, const u8 *r0kh_id, size_t r0kh_id_len,
- const u8 *s0kh_id, u8 *pmk_r0, u8 *pmk_r0_name)
-{
- u8 buf[1 + WPA_MAX_SSID_LEN + MOBILITY_DOMAIN_ID_LEN + 1 +
- FT_R0KH_ID_MAX_LEN + ETH_ALEN];
- u8 *pos, r0_key_data[48], hash[32];
- const u8 *addr[2];
- size_t len[2];
-
- /*
- * R0-Key-Data = KDF-384(XXKey, "FT-R0",
- * SSIDlength || SSID || MDID || R0KHlength ||
- * R0KH-ID || S0KH-ID)
- * XXKey is either the second 256 bits of MSK or PSK.
- * PMK-R0 = L(R0-Key-Data, 0, 256)
- * PMK-R0Name-Salt = L(R0-Key-Data, 256, 128)
- */
- if (ssid_len > WPA_MAX_SSID_LEN || r0kh_id_len > FT_R0KH_ID_MAX_LEN)
- return;
- pos = buf;
- *pos++ = ssid_len;
- os_memcpy(pos, ssid, ssid_len);
- pos += ssid_len;
- os_memcpy(pos, mdid, MOBILITY_DOMAIN_ID_LEN);
- pos += MOBILITY_DOMAIN_ID_LEN;
- *pos++ = r0kh_id_len;
- os_memcpy(pos, r0kh_id, r0kh_id_len);
- pos += r0kh_id_len;
- os_memcpy(pos, s0kh_id, ETH_ALEN);
- pos += ETH_ALEN;
-
- sha256_prf(xxkey, xxkey_len, "FT-R0", buf, pos - buf,
- r0_key_data, sizeof(r0_key_data));
- os_memcpy(pmk_r0, r0_key_data, PMK_LEN);
-
- /*
- * PMKR0Name = Truncate-128(SHA-256("FT-R0N" || PMK-R0Name-Salt)
- */
- addr[0] = (const u8 *) "FT-R0N";
- len[0] = 6;
- addr[1] = r0_key_data + PMK_LEN;
- len[1] = 16;
-
- sha256_vector(2, addr, len, hash);
- os_memcpy(pmk_r0_name, hash, WPA_PMK_NAME_LEN);
-}
-
-
-/**
- * wpa_derive_pmk_r1_name - Derive PMKR1Name
- *
- * IEEE Std 802.11r-2008 - 8.5.1.5.4
- */
-void wpa_derive_pmk_r1_name(const u8 *pmk_r0_name, const u8 *r1kh_id,
- const u8 *s1kh_id, u8 *pmk_r1_name)
-{
- u8 hash[32];
- const u8 *addr[4];
- size_t len[4];
-
- /*
- * PMKR1Name = Truncate-128(SHA-256("FT-R1N" || PMKR0Name ||
- * R1KH-ID || S1KH-ID))
- */
- addr[0] = (const u8 *) "FT-R1N";
- len[0] = 6;
- addr[1] = pmk_r0_name;
- len[1] = WPA_PMK_NAME_LEN;
- addr[2] = r1kh_id;
- len[2] = FT_R1KH_ID_LEN;
- addr[3] = s1kh_id;
- len[3] = ETH_ALEN;
-
- sha256_vector(4, addr, len, hash);
- os_memcpy(pmk_r1_name, hash, WPA_PMK_NAME_LEN);
-}
-
-
-/**
- * wpa_derive_pmk_r1 - Derive PMK-R1 and PMKR1Name from PMK-R0
- *
- * IEEE Std 802.11r-2008 - 8.5.1.5.4
- */
-void wpa_derive_pmk_r1(const u8 *pmk_r0, const u8 *pmk_r0_name,
- const u8 *r1kh_id, const u8 *s1kh_id,
- u8 *pmk_r1, u8 *pmk_r1_name)
-{
- u8 buf[FT_R1KH_ID_LEN + ETH_ALEN];
- u8 *pos;
-
- /* PMK-R1 = KDF-256(PMK-R0, "FT-R1", R1KH-ID || S1KH-ID) */
- pos = buf;
- os_memcpy(pos, r1kh_id, FT_R1KH_ID_LEN);
- pos += FT_R1KH_ID_LEN;
- os_memcpy(pos, s1kh_id, ETH_ALEN);
- pos += ETH_ALEN;
-
- sha256_prf(pmk_r0, PMK_LEN, "FT-R1", buf, pos - buf, pmk_r1, PMK_LEN);
-
- wpa_derive_pmk_r1_name(pmk_r0_name, r1kh_id, s1kh_id, pmk_r1_name);
-}
-
-
-/**
- * wpa_pmk_r1_to_ptk - Derive PTK and PTKName from PMK-R1
- *
- * IEEE Std 802.11r-2008 - 8.5.1.5.5
- */
-void wpa_pmk_r1_to_ptk(const u8 *pmk_r1, const u8 *snonce, const u8 *anonce,
- const u8 *sta_addr, const u8 *bssid,
- const u8 *pmk_r1_name,
- u8 *ptk, size_t ptk_len, u8 *ptk_name)
-{
- u8 buf[2 * WPA_NONCE_LEN + 2 * ETH_ALEN];
- u8 *pos, hash[32];
- const u8 *addr[6];
- size_t len[6];
-
- /*
- * PTK = KDF-PTKLen(PMK-R1, "FT-PTK", SNonce || ANonce ||
- * BSSID || STA-ADDR)
- */
- pos = buf;
- os_memcpy(pos, snonce, WPA_NONCE_LEN);
- pos += WPA_NONCE_LEN;
- os_memcpy(pos, anonce, WPA_NONCE_LEN);
- pos += WPA_NONCE_LEN;
- os_memcpy(pos, bssid, ETH_ALEN);
- pos += ETH_ALEN;
- os_memcpy(pos, sta_addr, ETH_ALEN);
- pos += ETH_ALEN;
-
- sha256_prf(pmk_r1, PMK_LEN, "FT-PTK", buf, pos - buf, ptk, ptk_len);
-
- /*
- * PTKName = Truncate-128(SHA-256(PMKR1Name || "FT-PTKN" || SNonce ||
- * ANonce || BSSID || STA-ADDR))
- */
- addr[0] = pmk_r1_name;
- len[0] = WPA_PMK_NAME_LEN;
- addr[1] = (const u8 *) "FT-PTKN";
- len[1] = 7;
- addr[2] = snonce;
- len[2] = WPA_NONCE_LEN;
- addr[3] = anonce;
- len[3] = WPA_NONCE_LEN;
- addr[4] = bssid;
- len[4] = ETH_ALEN;
- addr[5] = sta_addr;
- len[5] = ETH_ALEN;
-
- sha256_vector(6, addr, len, hash);
- os_memcpy(ptk_name, hash, WPA_PMK_NAME_LEN);
-}
-
-#endif /* CONFIG_IEEE80211R */
-
-
-/**
- * rsn_pmkid - Calculate PMK identifier
- * @pmk: Pairwise master key
- * @pmk_len: Length of pmk in bytes
- * @aa: Authenticator address
- * @spa: Supplicant address
- * @pmkid: Buffer for PMKID
- * @use_sha256: Whether to use SHA256-based KDF
- *
- * IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy
- * PMKID = HMAC-SHA1-128(PMK, "PMK Name" || AA || SPA)
- */
-void rsn_pmkid(const u8 *pmk, size_t pmk_len, const u8 *aa, const u8 *spa,
- u8 *pmkid, int use_sha256)
-{
- char *title = "PMK Name";
- const u8 *addr[3];
- const size_t len[3] = { 8, ETH_ALEN, ETH_ALEN };
- unsigned char hash[SHA256_MAC_LEN];
-
- addr[0] = (u8 *) title;
- addr[1] = aa;
- addr[2] = spa;
-
-#ifdef CONFIG_IEEE80211W
- if (use_sha256)
- hmac_sha256_vector(pmk, pmk_len, 3, addr, len, hash);
- else
-#endif /* CONFIG_IEEE80211W */
- hmac_sha1_vector(pmk, pmk_len, 3, addr, len, hash);
- os_memcpy(pmkid, hash, PMKID_LEN);
-}
-
-
-/**
- * wpa_cipher_txt - Convert cipher suite to a text string
- * @cipher: Cipher suite (WPA_CIPHER_* enum)
- * Returns: Pointer to a text string of the cipher suite name
- */
-const char * wpa_cipher_txt(int cipher)
-{
- switch (cipher) {
- case WPA_CIPHER_NONE:
- return "NONE";
- case WPA_CIPHER_WEP40:
- return "WEP-40";
- case WPA_CIPHER_WEP104:
- return "WEP-104";
- case WPA_CIPHER_TKIP:
- return "TKIP";
- case WPA_CIPHER_CCMP:
- return "CCMP";
- case WPA_CIPHER_CCMP | WPA_CIPHER_TKIP:
- return "CCMP+TKIP";
- default:
- return "UNKNOWN";
- }
-}
-
-
-/**
- * wpa_key_mgmt_txt - Convert key management suite to a text string
- * @key_mgmt: Key management suite (WPA_KEY_MGMT_* enum)
- * @proto: WPA/WPA2 version (WPA_PROTO_*)
- * Returns: Pointer to a text string of the key management suite name
- */
-const char * wpa_key_mgmt_txt(int key_mgmt, int proto)
-{
- switch (key_mgmt) {
- case WPA_KEY_MGMT_IEEE8021X:
- if (proto == (WPA_PROTO_RSN | WPA_PROTO_WPA))
- return "WPA2+WPA/IEEE 802.1X/EAP";
- return proto == WPA_PROTO_RSN ?
- "WPA2/IEEE 802.1X/EAP" : "WPA/IEEE 802.1X/EAP";
- case WPA_KEY_MGMT_PSK:
- if (proto == (WPA_PROTO_RSN | WPA_PROTO_WPA))
- return "WPA2-PSK+WPA-PSK";
- return proto == WPA_PROTO_RSN ?
- "WPA2-PSK" : "WPA-PSK";
- case WPA_KEY_MGMT_NONE:
- return "NONE";
- case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
- return "IEEE 802.1X (no WPA)";
-#ifdef CONFIG_IEEE80211R
- case WPA_KEY_MGMT_FT_IEEE8021X:
- return "FT-EAP";
- case WPA_KEY_MGMT_FT_PSK:
- return "FT-PSK";
-#endif /* CONFIG_IEEE80211R */
-#ifdef CONFIG_IEEE80211W
- case WPA_KEY_MGMT_IEEE8021X_SHA256:
- return "WPA2-EAP-SHA256";
- case WPA_KEY_MGMT_PSK_SHA256:
- return "WPA2-PSK-SHA256";
-#endif /* CONFIG_IEEE80211W */
- default:
- return "UNKNOWN";
- }
-}
-
-
-int wpa_compare_rsn_ie(int ft_initial_assoc,
- const u8 *ie1, size_t ie1len,
- const u8 *ie2, size_t ie2len)
-{
- if (ie1 == NULL || ie2 == NULL)
- return -1;
-
- if (ie1len == ie2len && os_memcmp(ie1, ie2, ie1len) == 0)
- return 0; /* identical IEs */
-
-#ifdef CONFIG_IEEE80211R
- if (ft_initial_assoc) {
- struct wpa_ie_data ie1d, ie2d;
- /*
- * The PMKID-List in RSN IE is different between Beacon/Probe
- * Response/(Re)Association Request frames and EAPOL-Key
- * messages in FT initial mobility domain association. Allow
- * for this, but verify that other parts of the RSN IEs are
- * identical.
- */
- if (wpa_parse_wpa_ie_rsn(ie1, ie1len, &ie1d) < 0 ||
- wpa_parse_wpa_ie_rsn(ie2, ie2len, &ie2d) < 0)
- return -1;
- if (ie1d.proto == ie2d.proto &&
- ie1d.pairwise_cipher == ie2d.pairwise_cipher &&
- ie1d.group_cipher == ie2d.group_cipher &&
- ie1d.key_mgmt == ie2d.key_mgmt &&
- ie1d.capabilities == ie2d.capabilities &&
- ie1d.mgmt_group_cipher == ie2d.mgmt_group_cipher)
- return 0;
- }
-#endif /* CONFIG_IEEE80211R */
-
- return -1;
-}
-
-
-#ifdef CONFIG_IEEE80211R
-int wpa_insert_pmkid(u8 *ies, size_t ies_len, const u8 *pmkid)
-{
- u8 *start, *end, *rpos, *rend;
- int added = 0;
-
- start = ies;
- end = ies + ies_len;
-
- while (start < end) {
- if (*start == WLAN_EID_RSN)
- break;
- start += 2 + start[1];
- }
- if (start >= end) {
- wpa_printf(MSG_ERROR, "FT: Could not find RSN IE in "
- "IEs data");
- return -1;
- }
- wpa_hexdump(MSG_DEBUG, "FT: RSN IE before modification",
- start, 2 + start[1]);
-
- /* Find start of PMKID-Count */
- rpos = start + 2;
- rend = rpos + start[1];
-
- /* Skip Version and Group Data Cipher Suite */
- rpos += 2 + 4;
- /* Skip Pairwise Cipher Suite Count and List */
- rpos += 2 + WPA_GET_LE16(rpos) * RSN_SELECTOR_LEN;
- /* Skip AKM Suite Count and List */
- rpos += 2 + WPA_GET_LE16(rpos) * RSN_SELECTOR_LEN;
-
- if (rpos == rend) {
- /* Add RSN Capabilities */
- os_memmove(rpos + 2, rpos, end - rpos);
- *rpos++ = 0;
- *rpos++ = 0;
- } else {
- /* Skip RSN Capabilities */
- rpos += 2;
- if (rpos > rend) {
- wpa_printf(MSG_ERROR, "FT: Could not parse RSN IE in "
- "IEs data");
- return -1;
- }
- }
-
- if (rpos == rend) {
- /* No PMKID-Count field included; add it */
- os_memmove(rpos + 2 + PMKID_LEN, rpos, end - rpos);
- WPA_PUT_LE16(rpos, 1);
- rpos += 2;
- os_memcpy(rpos, pmkid, PMKID_LEN);
- added += 2 + PMKID_LEN;
- start[1] += 2 + PMKID_LEN;
- } else {
- /* PMKID-Count was included; use it */
- if (WPA_GET_LE16(rpos) != 0) {
- wpa_printf(MSG_ERROR, "FT: Unexpected PMKID "
- "in RSN IE in EAPOL-Key data");
- return -1;
- }
- WPA_PUT_LE16(rpos, 1);
- rpos += 2;
- os_memmove(rpos + PMKID_LEN, rpos, end - rpos);
- os_memcpy(rpos, pmkid, PMKID_LEN);
- added += PMKID_LEN;
- start[1] += PMKID_LEN;
- }
-
- wpa_hexdump(MSG_DEBUG, "FT: RSN IE after modification "
- "(PMKID inserted)", start, 2 + start[1]);
-
- return added;
-}
-#endif /* CONFIG_IEEE80211R */
diff --git a/hostapd-0.8/src/common/wpa_common.h b/hostapd-0.8/src/common/wpa_common.h
deleted file mode 100644
index fe79cee..0000000
--- a/hostapd-0.8/src/common/wpa_common.h
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * WPA definitions shared between hostapd and wpa_supplicant
- * Copyright (c) 2002-2008, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef WPA_COMMON_H
-#define WPA_COMMON_H
-
-#define WPA_MAX_SSID_LEN 32
-
-/* IEEE 802.11i */
-#define PMKID_LEN 16
-#define PMK_LEN 32
-#define WPA_REPLAY_COUNTER_LEN 8
-#define WPA_NONCE_LEN 32
-#define WPA_KEY_RSC_LEN 8
-#define WPA_GMK_LEN 32
-#define WPA_GTK_MAX_LEN 32
-
-#define WPA_SELECTOR_LEN 4
-#define WPA_VERSION 1
-#define RSN_SELECTOR_LEN 4
-#define RSN_VERSION 1
-
-#define RSN_SELECTOR(a, b, c, d) \
- ((((u32) (a)) << 24) | (((u32) (b)) << 16) | (((u32) (c)) << 8) | \
- (u32) (d))
-
-#define WPA_AUTH_KEY_MGMT_NONE RSN_SELECTOR(0x00, 0x50, 0xf2, 0)
-#define WPA_AUTH_KEY_MGMT_UNSPEC_802_1X RSN_SELECTOR(0x00, 0x50, 0xf2, 1)
-#define WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X RSN_SELECTOR(0x00, 0x50, 0xf2, 2)
-#define WPA_CIPHER_SUITE_NONE RSN_SELECTOR(0x00, 0x50, 0xf2, 0)
-#define WPA_CIPHER_SUITE_WEP40 RSN_SELECTOR(0x00, 0x50, 0xf2, 1)
-#define WPA_CIPHER_SUITE_TKIP RSN_SELECTOR(0x00, 0x50, 0xf2, 2)
-#if 0
-#define WPA_CIPHER_SUITE_WRAP RSN_SELECTOR(0x00, 0x50, 0xf2, 3)
-#endif
-#define WPA_CIPHER_SUITE_CCMP RSN_SELECTOR(0x00, 0x50, 0xf2, 4)
-#define WPA_CIPHER_SUITE_WEP104 RSN_SELECTOR(0x00, 0x50, 0xf2, 5)
-
-
-#define RSN_AUTH_KEY_MGMT_UNSPEC_802_1X RSN_SELECTOR(0x00, 0x0f, 0xac, 1)
-#define RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X RSN_SELECTOR(0x00, 0x0f, 0xac, 2)
-#ifdef CONFIG_IEEE80211R
-#define RSN_AUTH_KEY_MGMT_FT_802_1X RSN_SELECTOR(0x00, 0x0f, 0xac, 3)
-#define RSN_AUTH_KEY_MGMT_FT_PSK RSN_SELECTOR(0x00, 0x0f, 0xac, 4)
-#endif /* CONFIG_IEEE80211R */
-#define RSN_AUTH_KEY_MGMT_802_1X_SHA256 RSN_SELECTOR(0x00, 0x0f, 0xac, 5)
-#define RSN_AUTH_KEY_MGMT_PSK_SHA256 RSN_SELECTOR(0x00, 0x0f, 0xac, 6)
-#define RSN_AUTH_KEY_MGMT_TPK_HANDSHAKE RSN_SELECTOR(0x00, 0x0f, 0xac, 7)
-
-#define RSN_CIPHER_SUITE_NONE RSN_SELECTOR(0x00, 0x0f, 0xac, 0)
-#define RSN_CIPHER_SUITE_WEP40 RSN_SELECTOR(0x00, 0x0f, 0xac, 1)
-#define RSN_CIPHER_SUITE_TKIP RSN_SELECTOR(0x00, 0x0f, 0xac, 2)
-#if 0
-#define RSN_CIPHER_SUITE_WRAP RSN_SELECTOR(0x00, 0x0f, 0xac, 3)
-#endif
-#define RSN_CIPHER_SUITE_CCMP RSN_SELECTOR(0x00, 0x0f, 0xac, 4)
-#define RSN_CIPHER_SUITE_WEP104 RSN_SELECTOR(0x00, 0x0f, 0xac, 5)
-#ifdef CONFIG_IEEE80211W
-#define RSN_CIPHER_SUITE_AES_128_CMAC RSN_SELECTOR(0x00, 0x0f, 0xac, 6)
-#endif /* CONFIG_IEEE80211W */
-#define RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED RSN_SELECTOR(0x00, 0x0f, 0xac, 7)
-
-/* EAPOL-Key Key Data Encapsulation
- * GroupKey and PeerKey require encryption, otherwise, encryption is optional.
- */
-#define RSN_KEY_DATA_GROUPKEY RSN_SELECTOR(0x00, 0x0f, 0xac, 1)
-#if 0
-#define RSN_KEY_DATA_STAKEY RSN_SELECTOR(0x00, 0x0f, 0xac, 2)
-#endif
-#define RSN_KEY_DATA_MAC_ADDR RSN_SELECTOR(0x00, 0x0f, 0xac, 3)
-#define RSN_KEY_DATA_PMKID RSN_SELECTOR(0x00, 0x0f, 0xac, 4)
-#ifdef CONFIG_PEERKEY
-#define RSN_KEY_DATA_SMK RSN_SELECTOR(0x00, 0x0f, 0xac, 5)
-#define RSN_KEY_DATA_NONCE RSN_SELECTOR(0x00, 0x0f, 0xac, 6)
-#define RSN_KEY_DATA_LIFETIME RSN_SELECTOR(0x00, 0x0f, 0xac, 7)
-#define RSN_KEY_DATA_ERROR RSN_SELECTOR(0x00, 0x0f, 0xac, 8)
-#endif /* CONFIG_PEERKEY */
-#ifdef CONFIG_IEEE80211W
-#define RSN_KEY_DATA_IGTK RSN_SELECTOR(0x00, 0x0f, 0xac, 9)
-#endif /* CONFIG_IEEE80211W */
-
-#define WPA_OUI_TYPE RSN_SELECTOR(0x00, 0x50, 0xf2, 1)
-
-#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val))
-#define RSN_SELECTOR_GET(a) WPA_GET_BE32((const u8 *) (a))
-
-#define RSN_NUM_REPLAY_COUNTERS_1 0
-#define RSN_NUM_REPLAY_COUNTERS_2 1
-#define RSN_NUM_REPLAY_COUNTERS_4 2
-#define RSN_NUM_REPLAY_COUNTERS_16 3
-
-
-#ifdef _MSC_VER
-#pragma pack(push, 1)
-#endif /* _MSC_VER */
-
-#ifdef CONFIG_IEEE80211W
-#define WPA_IGTK_LEN 16
-#endif /* CONFIG_IEEE80211W */
-
-
-/* IEEE 802.11, 7.3.2.25.3 RSN Capabilities */
-#define WPA_CAPABILITY_PREAUTH BIT(0)
-#define WPA_CAPABILITY_NO_PAIRWISE BIT(1)
-/* B2-B3: PTKSA Replay Counter */
-/* B4-B5: GTKSA Replay Counter */
-#define WPA_CAPABILITY_MFPR BIT(6)
-#define WPA_CAPABILITY_MFPC BIT(7)
-/* B8: Reserved */
-#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9)
-#define WPA_CAPABILITY_SPP_A_MSDU_CAPABLE BIT(10)
-#define WPA_CAPABILITY_SPP_A_MSDU_REQUIRED BIT(11)
-#define WPA_CAPABILITY_PBAC BIT(12)
-#define WPA_CAPABILITY_EXT_KEY_ID_FOR_UNICAST BIT(13)
-/* B14-B15: Reserved */
-
-
-/* IEEE 802.11r */
-#define MOBILITY_DOMAIN_ID_LEN 2
-#define FT_R0KH_ID_MAX_LEN 48
-#define FT_R1KH_ID_LEN 6
-#define WPA_PMK_NAME_LEN 16
-
-
-/* IEEE 802.11, 8.5.2 EAPOL-Key frames */
-#define WPA_KEY_INFO_TYPE_MASK ((u16) (BIT(0) | BIT(1) | BIT(2)))
-#define WPA_KEY_INFO_TYPE_HMAC_MD5_RC4 BIT(0)
-#define WPA_KEY_INFO_TYPE_HMAC_SHA1_AES BIT(1)
-#define WPA_KEY_INFO_TYPE_AES_128_CMAC 3
-#define WPA_KEY_INFO_KEY_TYPE BIT(3) /* 1 = Pairwise, 0 = Group key */
-/* bit4..5 is used in WPA, but is reserved in IEEE 802.11i/RSN */
-#define WPA_KEY_INFO_KEY_INDEX_MASK (BIT(4) | BIT(5))
-#define WPA_KEY_INFO_KEY_INDEX_SHIFT 4
-#define WPA_KEY_INFO_INSTALL BIT(6) /* pairwise */
-#define WPA_KEY_INFO_TXRX BIT(6) /* group */
-#define WPA_KEY_INFO_ACK BIT(7)
-#define WPA_KEY_INFO_MIC BIT(8)
-#define WPA_KEY_INFO_SECURE BIT(9)
-#define WPA_KEY_INFO_ERROR BIT(10)
-#define WPA_KEY_INFO_REQUEST BIT(11)
-#define WPA_KEY_INFO_ENCR_KEY_DATA BIT(12) /* IEEE 802.11i/RSN only */
-#define WPA_KEY_INFO_SMK_MESSAGE BIT(13)
-
-
-struct wpa_eapol_key {
- u8 type;
- /* Note: key_info, key_length, and key_data_length are unaligned */
- u8 key_info[2]; /* big endian */
- u8 key_length[2]; /* big endian */
- u8 replay_counter[WPA_REPLAY_COUNTER_LEN];
- u8 key_nonce[WPA_NONCE_LEN];
- u8 key_iv[16];
- u8 key_rsc[WPA_KEY_RSC_LEN];
- u8 key_id[8]; /* Reserved in IEEE 802.11i/RSN */
- u8 key_mic[16];
- u8 key_data_length[2]; /* big endian */
- /* followed by key_data_length bytes of key_data */
-} STRUCT_PACKED;
-
-/**
- * struct wpa_ptk - WPA Pairwise Transient Key
- * IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy
- */
-struct wpa_ptk {
- u8 kck[16]; /* EAPOL-Key Key Confirmation Key (KCK) */
- u8 kek[16]; /* EAPOL-Key Key Encryption Key (KEK) */
- u8 tk1[16]; /* Temporal Key 1 (TK1) */
- union {
- u8 tk2[16]; /* Temporal Key 2 (TK2) */
- struct {
- u8 tx_mic_key[8];
- u8 rx_mic_key[8];
- } auth;
- } u;
-} STRUCT_PACKED;
-
-
-/* WPA IE version 1
- * 00-50-f2:1 (OUI:OUI type)
- * 0x01 0x00 (version; little endian)
- * (all following fields are optional:)
- * Group Suite Selector (4 octets) (default: TKIP)
- * Pairwise Suite Count (2 octets, little endian) (default: 1)
- * Pairwise Suite List (4 * n octets) (default: TKIP)
- * Authenticated Key Management Suite Count (2 octets, little endian)
- * (default: 1)
- * Authenticated Key Management Suite List (4 * n octets)
- * (default: unspec 802.1X)
- * WPA Capabilities (2 octets, little endian) (default: 0)
- */
-
-struct wpa_ie_hdr {
- u8 elem_id;
- u8 len;
- u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */
- u8 version[2]; /* little endian */
-} STRUCT_PACKED;
-
-
-/* 1/4: PMKID
- * 2/4: RSN IE
- * 3/4: one or two RSN IEs + GTK IE (encrypted)
- * 4/4: empty
- * 1/2: GTK IE (encrypted)
- * 2/2: empty
- */
-
-/* RSN IE version 1
- * 0x01 0x00 (version; little endian)
- * (all following fields are optional:)
- * Group Suite Selector (4 octets) (default: CCMP)
- * Pairwise Suite Count (2 octets, little endian) (default: 1)
- * Pairwise Suite List (4 * n octets) (default: CCMP)
- * Authenticated Key Management Suite Count (2 octets, little endian)
- * (default: 1)
- * Authenticated Key Management Suite List (4 * n octets)
- * (default: unspec 802.1X)
- * RSN Capabilities (2 octets, little endian) (default: 0)
- * PMKID Count (2 octets) (default: 0)
- * PMKID List (16 * n octets)
- * Management Group Cipher Suite (4 octets) (default: AES-128-CMAC)
- */
-
-struct rsn_ie_hdr {
- u8 elem_id; /* WLAN_EID_RSN */
- u8 len;
- u8 version[2]; /* little endian */
-} STRUCT_PACKED;
-
-
-#ifdef CONFIG_PEERKEY
-enum {
- STK_MUI_4WAY_STA_AP = 1,
- STK_MUI_4WAY_STAT_STA = 2,
- STK_MUI_GTK = 3,
- STK_MUI_SMK = 4
-};
-
-enum {
- STK_ERR_STA_NR = 1,
- STK_ERR_STA_NRSN = 2,
- STK_ERR_CPHR_NS = 3,
- STK_ERR_NO_STSL = 4
-};
-#endif /* CONFIG_PEERKEY */
-
-struct rsn_error_kde {
- be16 mui;
- be16 error_type;
-} STRUCT_PACKED;
-
-#ifdef CONFIG_IEEE80211W
-struct wpa_igtk_kde {
- u8 keyid[2];
- u8 pn[6];
- u8 igtk[WPA_IGTK_LEN];
-} STRUCT_PACKED;
-#endif /* CONFIG_IEEE80211W */
-
-#ifdef CONFIG_IEEE80211R
-struct rsn_mdie {
- u8 mobility_domain[MOBILITY_DOMAIN_ID_LEN];
- u8 ft_capab;
-} STRUCT_PACKED;
-
-#define RSN_FT_CAPAB_FT_OVER_DS BIT(0)
-#define RSN_FT_CAPAB_FT_RESOURCE_REQ_SUPP BIT(1)
-
-struct rsn_ftie {
- u8 mic_control[2];
- u8 mic[16];
- u8 anonce[WPA_NONCE_LEN];
- u8 snonce[WPA_NONCE_LEN];
- /* followed by optional parameters */
-} STRUCT_PACKED;
-
-#define FTIE_SUBELEM_R1KH_ID 1
-#define FTIE_SUBELEM_GTK 2
-#define FTIE_SUBELEM_R0KH_ID 3
-#define FTIE_SUBELEM_IGTK 4
-
-struct rsn_rdie {
- u8 id;
- u8 descr_count;
- le16 status_code;
-} STRUCT_PACKED;
-
-#endif /* CONFIG_IEEE80211R */
-
-#ifdef _MSC_VER
-#pragma pack(pop)
-#endif /* _MSC_VER */
-
-
-int wpa_eapol_key_mic(const u8 *key, int ver, const u8 *buf, size_t len,
- u8 *mic);
-void wpa_pmk_to_ptk(const u8 *pmk, size_t pmk_len, const char *label,
- const u8 *addr1, const u8 *addr2,
- const u8 *nonce1, const u8 *nonce2,
- u8 *ptk, size_t ptk_len, int use_sha256);
-
-#ifdef CONFIG_IEEE80211R
-int wpa_ft_mic(const u8 *kck, const u8 *sta_addr, const u8 *ap_addr,
- u8 transaction_seqnum, const u8 *mdie, size_t mdie_len,
- const u8 *ftie, size_t ftie_len,
- const u8 *rsnie, size_t rsnie_len,
- const u8 *ric, size_t ric_len, u8 *mic);
-void wpa_derive_pmk_r0(const u8 *xxkey, size_t xxkey_len,
- const u8 *ssid, size_t ssid_len,
- const u8 *mdid, const u8 *r0kh_id, size_t r0kh_id_len,
- const u8 *s0kh_id, u8 *pmk_r0, u8 *pmk_r0_name);
-void wpa_derive_pmk_r1_name(const u8 *pmk_r0_name, const u8 *r1kh_id,
- const u8 *s1kh_id, u8 *pmk_r1_name);
-void wpa_derive_pmk_r1(const u8 *pmk_r0, const u8 *pmk_r0_name,
- const u8 *r1kh_id, const u8 *s1kh_id,
- u8 *pmk_r1, u8 *pmk_r1_name);
-void wpa_pmk_r1_to_ptk(const u8 *pmk_r1, const u8 *snonce, const u8 *anonce,
- const u8 *sta_addr, const u8 *bssid,
- const u8 *pmk_r1_name,
- u8 *ptk, size_t ptk_len, u8 *ptk_name);
-#endif /* CONFIG_IEEE80211R */
-
-struct wpa_ie_data {
- int proto;
- int pairwise_cipher;
- int group_cipher;
- int key_mgmt;
- int capabilities;
- size_t num_pmkid;
- const u8 *pmkid;
- int mgmt_group_cipher;
-};
-
-
-int wpa_parse_wpa_ie_rsn(const u8 *rsn_ie, size_t rsn_ie_len,
- struct wpa_ie_data *data);
-int wpa_parse_wpa_ie_wpa(const u8 *wpa_ie, size_t wpa_ie_len,
- struct wpa_ie_data *data);
-
-void rsn_pmkid(const u8 *pmk, size_t pmk_len, const u8 *aa, const u8 *spa,
- u8 *pmkid, int use_sha256);
-
-const char * wpa_cipher_txt(int cipher);
-const char * wpa_key_mgmt_txt(int key_mgmt, int proto);
-int wpa_compare_rsn_ie(int ft_initial_assoc,
- const u8 *ie1, size_t ie1len,
- const u8 *ie2, size_t ie2len);
-int wpa_insert_pmkid(u8 *ies, size_t ies_len, const u8 *pmkid);
-
-#endif /* WPA_COMMON_H */
diff --git a/hostapd-0.8/src/common/wpa_ctrl.c b/hostapd-0.8/src/common/wpa_ctrl.c
deleted file mode 100644
index 88d3a02..0000000
--- a/hostapd-0.8/src/common/wpa_ctrl.c
+++ /dev/null
@@ -1,500 +0,0 @@
-/*
- * wpa_supplicant/hostapd control interface library
- * Copyright (c) 2004-2007, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#include "includes.h"
-
-#ifdef CONFIG_CTRL_IFACE
-
-#ifdef CONFIG_CTRL_IFACE_UNIX
-#include
-#endif /* CONFIG_CTRL_IFACE_UNIX */
-
-#ifdef ANDROID
-#include
-#include "private/android_filesystem_config.h"
-#endif /* ANDROID */
-
-#include "wpa_ctrl.h"
-#include "common.h"
-
-
-#if defined(CONFIG_CTRL_IFACE_UNIX) || defined(CONFIG_CTRL_IFACE_UDP)
-#define CTRL_IFACE_SOCKET
-#endif /* CONFIG_CTRL_IFACE_UNIX || CONFIG_CTRL_IFACE_UDP */
-
-
-/**
- * struct wpa_ctrl - Internal structure for control interface library
- *
- * This structure is used by the wpa_supplicant/hostapd control interface
- * library to store internal data. Programs using the library should not touch
- * this data directly. They can only use the pointer to the data structure as
- * an identifier for the control interface connection and use this as one of
- * the arguments for most of the control interface library functions.
- */
-struct wpa_ctrl {
-#ifdef CONFIG_CTRL_IFACE_UDP
- int s;
- struct sockaddr_in local;
- struct sockaddr_in dest;
- char *cookie;
-#endif /* CONFIG_CTRL_IFACE_UDP */
-#ifdef CONFIG_CTRL_IFACE_UNIX
- int s;
- struct sockaddr_un local;
- struct sockaddr_un dest;
-#endif /* CONFIG_CTRL_IFACE_UNIX */
-#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
- HANDLE pipe;
-#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
-};
-
-
-#ifdef CONFIG_CTRL_IFACE_UNIX
-
-#ifndef CONFIG_CTRL_IFACE_CLIENT_DIR
-#define CONFIG_CTRL_IFACE_CLIENT_DIR "/tmp"
-#endif /* CONFIG_CTRL_IFACE_CLIENT_DIR */
-#ifndef CONFIG_CTRL_IFACE_CLIENT_PREFIX
-#define CONFIG_CTRL_IFACE_CLIENT_PREFIX "wpa_ctrl_"
-#endif /* CONFIG_CTRL_IFACE_CLIENT_PREFIX */
-
-
-struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
-{
- struct wpa_ctrl *ctrl;
- static int counter = 0;
- int ret;
- size_t res;
- int tries = 0;
-
- ctrl = os_malloc(sizeof(*ctrl));
- if (ctrl == NULL)
- return NULL;
- os_memset(ctrl, 0, sizeof(*ctrl));
-
- ctrl->s = socket(PF_UNIX, SOCK_DGRAM, 0);
- if (ctrl->s < 0) {
- os_free(ctrl);
- return NULL;
- }
-
- ctrl->local.sun_family = AF_UNIX;
- counter++;
-try_again:
- ret = os_snprintf(ctrl->local.sun_path, sizeof(ctrl->local.sun_path),
- CONFIG_CTRL_IFACE_CLIENT_DIR "/"
- CONFIG_CTRL_IFACE_CLIENT_PREFIX "%d-%d",
- (int) getpid(), counter);
- if (ret < 0 || (size_t) ret >= sizeof(ctrl->local.sun_path)) {
- close(ctrl->s);
- os_free(ctrl);
- return NULL;
- }
- tries++;
- if (bind(ctrl->s, (struct sockaddr *) &ctrl->local,
- sizeof(ctrl->local)) < 0) {
- if (errno == EADDRINUSE && tries < 2) {
- /*
- * getpid() returns unique identifier for this instance
- * of wpa_ctrl, so the existing socket file must have
- * been left by unclean termination of an earlier run.
- * Remove the file and try again.
- */
- unlink(ctrl->local.sun_path);
- goto try_again;
- }
- close(ctrl->s);
- os_free(ctrl);
- return NULL;
- }
-
-#ifdef ANDROID
- chmod(ctrl->local.sun_path, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
- chown(ctrl->local.sun_path, AID_SYSTEM, AID_WIFI);
- /*
- * If the ctrl_path isn't an absolute pathname, assume that
- * it's the name of a socket in the Android reserved namespace.
- * Otherwise, it's a normal UNIX domain socket appearing in the
- * filesystem.
- */
- if (ctrl_path != NULL && *ctrl_path != '/') {
- char buf[21];
- os_snprintf(buf, sizeof(buf), "wpa_%s", ctrl_path);
- if (socket_local_client_connect(
- ctrl->s, buf,
- ANDROID_SOCKET_NAMESPACE_RESERVED,
- SOCK_DGRAM) < 0) {
- close(ctrl->s);
- unlink(ctrl->local.sun_path);
- os_free(ctrl);
- return NULL;
- }
- return ctrl;
- }
-#endif /* ANDROID */
-
- ctrl->dest.sun_family = AF_UNIX;
- res = os_strlcpy(ctrl->dest.sun_path, ctrl_path,
- sizeof(ctrl->dest.sun_path));
- if (res >= sizeof(ctrl->dest.sun_path)) {
- close(ctrl->s);
- os_free(ctrl);
- return NULL;
- }
- if (connect(ctrl->s, (struct sockaddr *) &ctrl->dest,
- sizeof(ctrl->dest)) < 0) {
- close(ctrl->s);
- unlink(ctrl->local.sun_path);
- os_free(ctrl);
- return NULL;
- }
-
- return ctrl;
-}
-
-
-void wpa_ctrl_close(struct wpa_ctrl *ctrl)
-{
- if (ctrl == NULL)
- return;
- unlink(ctrl->local.sun_path);
- if (ctrl->s >= 0)
- close(ctrl->s);
- os_free(ctrl);
-}
-
-#endif /* CONFIG_CTRL_IFACE_UNIX */
-
-
-#ifdef CONFIG_CTRL_IFACE_UDP
-
-struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
-{
- struct wpa_ctrl *ctrl;
- char buf[128];
- size_t len;
-
- ctrl = os_malloc(sizeof(*ctrl));
- if (ctrl == NULL)
- return NULL;
- os_memset(ctrl, 0, sizeof(*ctrl));
-
- ctrl->s = socket(PF_INET, SOCK_DGRAM, 0);
- if (ctrl->s < 0) {
- perror("socket");
- os_free(ctrl);
- return NULL;
- }
-
- ctrl->local.sin_family = AF_INET;
- ctrl->local.sin_addr.s_addr = htonl((127 << 24) | 1);
- if (bind(ctrl->s, (struct sockaddr *) &ctrl->local,
- sizeof(ctrl->local)) < 0) {
- close(ctrl->s);
- os_free(ctrl);
- return NULL;
- }
-
- ctrl->dest.sin_family = AF_INET;
- ctrl->dest.sin_addr.s_addr = htonl((127 << 24) | 1);
- ctrl->dest.sin_port = htons(WPA_CTRL_IFACE_PORT);
- if (connect(ctrl->s, (struct sockaddr *) &ctrl->dest,
- sizeof(ctrl->dest)) < 0) {
- perror("connect");
- close(ctrl->s);
- os_free(ctrl);
- return NULL;
- }
-
- len = sizeof(buf) - 1;
- if (wpa_ctrl_request(ctrl, "GET_COOKIE", 10, buf, &len, NULL) == 0) {
- buf[len] = '\0';
- ctrl->cookie = os_strdup(buf);
- }
-
- return ctrl;
-}
-
-
-void wpa_ctrl_close(struct wpa_ctrl *ctrl)
-{
- close(ctrl->s);
- os_free(ctrl->cookie);
- os_free(ctrl);
-}
-
-#endif /* CONFIG_CTRL_IFACE_UDP */
-
-
-#ifdef CTRL_IFACE_SOCKET
-int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
- char *reply, size_t *reply_len,
- void (*msg_cb)(char *msg, size_t len))
-{
- struct timeval tv;
- int res;
- fd_set rfds;
- const char *_cmd;
- char *cmd_buf = NULL;
- size_t _cmd_len;
-
-#ifdef CONFIG_CTRL_IFACE_UDP
- if (ctrl->cookie) {
- char *pos;
- _cmd_len = os_strlen(ctrl->cookie) + 1 + cmd_len;
- cmd_buf = os_malloc(_cmd_len);
- if (cmd_buf == NULL)
- return -1;
- _cmd = cmd_buf;
- pos = cmd_buf;
- os_strlcpy(pos, ctrl->cookie, _cmd_len);
- pos += os_strlen(ctrl->cookie);
- *pos++ = ' ';
- os_memcpy(pos, cmd, cmd_len);
- } else
-#endif /* CONFIG_CTRL_IFACE_UDP */
- {
- _cmd = cmd;
- _cmd_len = cmd_len;
- }
-
- if (send(ctrl->s, _cmd, _cmd_len, 0) < 0) {
- os_free(cmd_buf);
- return -1;
- }
- os_free(cmd_buf);
-
- for (;;) {
- tv.tv_sec = 10;
- tv.tv_usec = 0;
- FD_ZERO(&rfds);
- FD_SET(ctrl->s, &rfds);
- res = select(ctrl->s + 1, &rfds, NULL, NULL, &tv);
- if (res < 0)
- return res;
- if (FD_ISSET(ctrl->s, &rfds)) {
- res = recv(ctrl->s, reply, *reply_len, 0);
- if (res < 0)
- return res;
- if (res > 0 && reply[0] == '<') {
- /* This is an unsolicited message from
- * wpa_supplicant, not the reply to the
- * request. Use msg_cb to report this to the
- * caller. */
- if (msg_cb) {
- /* Make sure the message is nul
- * terminated. */
- if ((size_t) res == *reply_len)
- res = (*reply_len) - 1;
- reply[res] = '\0';
- msg_cb(reply, res);
- }
- continue;
- }
- *reply_len = res;
- break;
- } else {
- return -2;
- }
- }
- return 0;
-}
-#endif /* CTRL_IFACE_SOCKET */
-
-
-static int wpa_ctrl_attach_helper(struct wpa_ctrl *ctrl, int attach)
-{
- char buf[10];
- int ret;
- size_t len = 10;
-
- ret = wpa_ctrl_request(ctrl, attach ? "ATTACH" : "DETACH", 6,
- buf, &len, NULL);
- if (ret < 0)
- return ret;
- if (len == 3 && os_memcmp(buf, "OK\n", 3) == 0)
- return 0;
- return -1;
-}
-
-
-int wpa_ctrl_attach(struct wpa_ctrl *ctrl)
-{
- return wpa_ctrl_attach_helper(ctrl, 1);
-}
-
-
-int wpa_ctrl_detach(struct wpa_ctrl *ctrl)
-{
- return wpa_ctrl_attach_helper(ctrl, 0);
-}
-
-
-#ifdef CTRL_IFACE_SOCKET
-
-int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len)
-{
- int res;
-
- res = recv(ctrl->s, reply, *reply_len, 0);
- if (res < 0)
- return res;
- *reply_len = res;
- return 0;
-}
-
-
-int wpa_ctrl_pending(struct wpa_ctrl *ctrl)
-{
- struct timeval tv;
- fd_set rfds;
- tv.tv_sec = 0;
- tv.tv_usec = 0;
- FD_ZERO(&rfds);
- FD_SET(ctrl->s, &rfds);
- select(ctrl->s + 1, &rfds, NULL, NULL, &tv);
- return FD_ISSET(ctrl->s, &rfds);
-}
-
-
-int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl)
-{
- return ctrl->s;
-}
-
-#endif /* CTRL_IFACE_SOCKET */
-
-
-#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
-
-#ifndef WPA_SUPPLICANT_NAMED_PIPE
-#define WPA_SUPPLICANT_NAMED_PIPE "WpaSupplicant"
-#endif
-#define NAMED_PIPE_PREFIX TEXT("\\\\.\\pipe\\") TEXT(WPA_SUPPLICANT_NAMED_PIPE)
-
-struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
-{
- struct wpa_ctrl *ctrl;
- DWORD mode;
- TCHAR name[256];
- int i, ret;
-
- ctrl = os_malloc(sizeof(*ctrl));
- if (ctrl == NULL)
- return NULL;
- os_memset(ctrl, 0, sizeof(*ctrl));
-
-#ifdef UNICODE
- if (ctrl_path == NULL)
- ret = _snwprintf(name, 256, NAMED_PIPE_PREFIX);
- else
- ret = _snwprintf(name, 256, NAMED_PIPE_PREFIX TEXT("-%S"),
- ctrl_path);
-#else /* UNICODE */
- if (ctrl_path == NULL)
- ret = os_snprintf(name, 256, NAMED_PIPE_PREFIX);
- else
- ret = os_snprintf(name, 256, NAMED_PIPE_PREFIX "-%s",
- ctrl_path);
-#endif /* UNICODE */
- if (ret < 0 || ret >= 256) {
- os_free(ctrl);
- return NULL;
- }
-
- for (i = 0; i < 10; i++) {
- ctrl->pipe = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0,
- NULL, OPEN_EXISTING, 0, NULL);
- /*
- * Current named pipe server side in wpa_supplicant is
- * re-opening the pipe for new clients only after the previous
- * one is taken into use. This leaves a small window for race
- * conditions when two connections are being opened at almost
- * the same time. Retry if that was the case.
- */
- if (ctrl->pipe != INVALID_HANDLE_VALUE ||
- GetLastError() != ERROR_PIPE_BUSY)
- break;
- WaitNamedPipe(name, 1000);
- }
- if (ctrl->pipe == INVALID_HANDLE_VALUE) {
- os_free(ctrl);
- return NULL;
- }
-
- mode = PIPE_READMODE_MESSAGE;
- if (!SetNamedPipeHandleState(ctrl->pipe, &mode, NULL, NULL)) {
- CloseHandle(ctrl->pipe);
- os_free(ctrl);
- return NULL;
- }
-
- return ctrl;
-}
-
-
-void wpa_ctrl_close(struct wpa_ctrl *ctrl)
-{
- CloseHandle(ctrl->pipe);
- os_free(ctrl);
-}
-
-
-int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
- char *reply, size_t *reply_len,
- void (*msg_cb)(char *msg, size_t len))
-{
- DWORD written;
- DWORD readlen = *reply_len;
-
- if (!WriteFile(ctrl->pipe, cmd, cmd_len, &written, NULL))
- return -1;
-
- if (!ReadFile(ctrl->pipe, reply, *reply_len, &readlen, NULL))
- return -1;
- *reply_len = readlen;
-
- return 0;
-}
-
-
-int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len)
-{
- DWORD len = *reply_len;
- if (!ReadFile(ctrl->pipe, reply, *reply_len, &len, NULL))
- return -1;
- *reply_len = len;
- return 0;
-}
-
-
-int wpa_ctrl_pending(struct wpa_ctrl *ctrl)
-{
- DWORD left;
-
- if (!PeekNamedPipe(ctrl->pipe, NULL, 0, NULL, &left, NULL))
- return -1;
- return left ? 1 : 0;
-}
-
-
-int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl)
-{
- return -1;
-}
-
-#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
-
-#endif /* CONFIG_CTRL_IFACE */
diff --git a/hostapd-0.8/src/common/wpa_ctrl.h b/hostapd-0.8/src/common/wpa_ctrl.h
deleted file mode 100644
index 528cc16..0000000
--- a/hostapd-0.8/src/common/wpa_ctrl.h
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * wpa_supplicant/hostapd control interface library
- * Copyright (c) 2004-2006, Jouni Malinen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
- */
-
-#ifndef WPA_CTRL_H
-#define WPA_CTRL_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* wpa_supplicant control interface - fixed message prefixes */
-
-/** Interactive request for identity/password/pin */
-#define WPA_CTRL_REQ "CTRL-REQ-"
-
-/** Response to identity/password/pin request */
-#define WPA_CTRL_RSP "CTRL-RSP-"
-
-/* Event messages with fixed prefix */
-/** Authentication completed successfully and data connection enabled */
-#define WPA_EVENT_CONNECTED "CTRL-EVENT-CONNECTED "
-/** Disconnected, data connection is not available */
-#define WPA_EVENT_DISCONNECTED "CTRL-EVENT-DISCONNECTED "
-/** Association rejected during connection attempt */
-#define WPA_EVENT_ASSOC_REJECT "CTRL-EVENT-ASSOC-REJECT "
-/** wpa_supplicant is exiting */
-#define WPA_EVENT_TERMINATING "CTRL-EVENT-TERMINATING "
-/** Password change was completed successfully */
-#define WPA_EVENT_PASSWORD_CHANGED "CTRL-EVENT-PASSWORD-CHANGED "
-/** EAP-Request/Notification received */
-#define WPA_EVENT_EAP_NOTIFICATION "CTRL-EVENT-EAP-NOTIFICATION "
-/** EAP authentication started (EAP-Request/Identity received) */
-#define WPA_EVENT_EAP_STARTED "CTRL-EVENT-EAP-STARTED "
-/** EAP method proposed by the server */
-#define WPA_EVENT_EAP_PROPOSED_METHOD "CTRL-EVENT-EAP-PROPOSED-METHOD "
-/** EAP method selected */
-#define WPA_EVENT_EAP_METHOD "CTRL-EVENT-EAP-METHOD "
-/** EAP peer certificate from TLS */
-#define WPA_EVENT_EAP_PEER_CERT "CTRL-EVENT-EAP-PEER-CERT "
-/** EAP TLS certificate chain validation error */
-#define WPA_EVENT_EAP_TLS_CERT_ERROR "CTRL-EVENT-EAP-TLS-CERT-ERROR "
-/** EAP authentication completed successfully */
-#define WPA_EVENT_EAP_SUCCESS "CTRL-EVENT-EAP-SUCCESS "
-/** EAP authentication failed (EAP-Failure received) */
-#define WPA_EVENT_EAP_FAILURE "CTRL-EVENT-EAP-FAILURE "
-/** New scan results available */
-#define WPA_EVENT_SCAN_RESULTS "CTRL-EVENT-SCAN-RESULTS "
-/** wpa_supplicant state change */
-#define WPA_EVENT_STATE_CHANGE "CTRL-EVENT-STATE-CHANGE "
-/** A new BSS entry was added (followed by BSS entry id and BSSID) */
-#define WPA_EVENT_BSS_ADDED "CTRL-EVENT-BSS-ADDED "
-/** A BSS entry was removed (followed by BSS entry id and BSSID) */
-#define WPA_EVENT_BSS_REMOVED "CTRL-EVENT-BSS-REMOVED "
-
-/** WPS overlap detected in PBC mode */
-#define WPS_EVENT_OVERLAP "WPS-OVERLAP-DETECTED "
-/** Available WPS AP with active PBC found in scan results */
-#define WPS_EVENT_AP_AVAILABLE_PBC "WPS-AP-AVAILABLE-PBC "
-/** Available WPS AP with our address as authorized in scan results */
-#define WPS_EVENT_AP_AVAILABLE_AUTH "WPS-AP-AVAILABLE-AUTH "
-/** Available WPS AP with recently selected PIN registrar found in scan results
- */
-#define WPS_EVENT_AP_AVAILABLE_PIN "WPS-AP-AVAILABLE-PIN "
-/** Available WPS AP found in scan results */
-#define WPS_EVENT_AP_AVAILABLE "WPS-AP-AVAILABLE "
-/** A new credential received */
-#define WPS_EVENT_CRED_RECEIVED "WPS-CRED-RECEIVED "
-/** M2D received */
-#define WPS_EVENT_M2D "WPS-M2D "
-/** WPS registration failed after M2/M2D */
-#define WPS_EVENT_FAIL "WPS-FAIL "
-/** WPS registration completed successfully */
-#define WPS_EVENT_SUCCESS "WPS-SUCCESS "
-/** WPS enrollment attempt timed out and was terminated */
-#define WPS_EVENT_TIMEOUT "WPS-TIMEOUT "
-
-#define WPS_EVENT_ENROLLEE_SEEN "WPS-ENROLLEE-SEEN "
-
-#define WPS_EVENT_OPEN_NETWORK "WPS-OPEN-NETWORK "
-
-/* WPS ER events */
-#define WPS_EVENT_ER_AP_ADD "WPS-ER-AP-ADD "
-#define WPS_EVENT_ER_AP_REMOVE "WPS-ER-AP-REMOVE "
-#define WPS_EVENT_ER_ENROLLEE_ADD "WPS-ER-ENROLLEE-ADD "
-#define WPS_EVENT_ER_ENROLLEE_REMOVE "WPS-ER-ENROLLEE-REMOVE "
-#define WPS_EVENT_ER_AP_SETTINGS "WPS-ER-AP-SETTINGS "
-#define WPS_EVENT_ER_SET_SEL_REG "WPS-ER-AP-SET-SEL-REG "
-
-/** P2P device found */
-#define P2P_EVENT_DEVICE_FOUND "P2P-DEVICE-FOUND "
-/** A P2P device requested GO negotiation, but we were not ready to start the
- * negotiation */
-#define P2P_EVENT_GO_NEG_REQUEST "P2P-GO-NEG-REQUEST "
-#define P2P_EVENT_GO_NEG_SUCCESS "P2P-GO-NEG-SUCCESS "
-#define P2P_EVENT_GO_NEG_FAILURE "P2P-GO-NEG-FAILURE "
-#define P2P_EVENT_GROUP_FORMATION_SUCCESS "P2P-GROUP-FORMATION-SUCCESS "
-#define P2P_EVENT_GROUP_FORMATION_FAILURE "P2P-GROUP-FORMATION-FAILURE "
-#define P2P_EVENT_GROUP_STARTED "P2P-GROUP-STARTED "
-#define P2P_EVENT_GROUP_REMOVED "P2P-GROUP-REMOVED "
-#define P2P_EVENT_CROSS_CONNECT_ENABLE "P2P-CROSS-CONNECT-ENABLE "
-#define P2P_EVENT_CROSS_CONNECT_DISABLE "P2P-CROSS-CONNECT-DISABLE "
-/* parameters: */
-#define P2P_EVENT_PROV_DISC_SHOW_PIN "P2P-PROV-DISC-SHOW-PIN "
-/* parameters: */
-#define P2P_EVENT_PROV_DISC_ENTER_PIN "P2P-PROV-DISC-ENTER-PIN "
-/* parameters: */
-#define P2P_EVENT_PROV_DISC_PBC_REQ "P2P-PROV-DISC-PBC-REQ "
-/* parameters: */
-#define P2P_EVENT_PROV_DISC_PBC_RESP "P2P-PROV-DISC-PBC-RESP "
-/* parameters: