wireless/wapi: Quick port of Wapi wireless services. No build support yet. This also depends on features not supported by NuttX. This is a work in progress.

This commit is contained in:
Gregory Nutt 2017-04-10 13:28:32 -06:00
parent cfc71db80c
commit eeb143415a
13 changed files with 3612 additions and 0 deletions

647
include/wireless/wapi.h Normal file
View File

@ -0,0 +1,647 @@
/****************************************************************************
* apps/include/wireless/wapi.h
*
* Copyright (c) 2010, Volkan YAZICI <volkan.yazici@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - 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.
*
* 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.
*
****************************************************************************/
#ifndef __APPS_INCLUDE_WIRELESS_WAPI_H
#define __APPS_INCLUDE_WIRELESS_WAPI_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <netinet/in.h>
#include <sys/socket.h>
#include <net/ethernet.h>
#include <linux/wireless.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Maximum allowed ESSID size. */
#define WAPI_ESSID_MAX_SIZE IW_ESSID_MAX_SIZE
/* Path to /proc/net/wireless. (Requires procfs mounted.) */
#define WAPI_PROC_NET_WIRELESS "/proc/net/wireless"
/* Path to /proc/net/route. (Requires procfs mounted.) */
#define WAPI_PROC_NET_ROUTE "/proc/net/route"
/* Buffer size while reading lines from PROC_NET_ files. */
#define WAPI_PROC_LINE_SIZE 1024
/****************************************************************************
* Public Types
****************************************************************************/
/* Generic linked list (dummy) decleration. (No definition!) */
typedef struct wapi_list_t wapi_list_t;
/* Frequency flags. */
typedef enum
{
WAPI_FREQ_AUTO = IW_FREQ_AUTO,
WAPI_FREQ_FIXED = IW_FREQ_FIXED
} wapi_freq_flag_t;
/* Route target types. */
typedef enum
{
WAPI_ROUTE_TARGET_NET, /* The target is a network. */
WAPI_ROUTE_TARGET_HOST /* The target is a host. */
} wapi_route_target_t;
/* ESSID flags. */
typedef enum
{
WAPI_ESSID_ON,
WAPI_ESSID_OFF
} wapi_essid_flag_t;
/* Supported operation modes. */
typedef enum
{
WAPI_MODE_AUTO = IW_MODE_AUTO, /* Driver decides. */
WAPI_MODE_ADHOC = IW_MODE_ADHOC, /* Single cell network. */
WAPI_MODE_MANAGED = IW_MODE_INFRA, /* Multi cell network, roaming, ... */
WAPI_MODE_MASTER = IW_MODE_MASTER, /* Synchronisation master or access point. */
WAPI_MODE_REPEAT = IW_MODE_REPEAT, /* Wireless repeater, forwarder. */
WAPI_MODE_SECOND = IW_MODE_SECOND, /* Secondary master/repeater, backup. */
WAPI_MODE_MONITOR = IW_MODE_MONITOR /* Passive monitor, listen only. */
} wapi_mode_t;
/* Bitrate flags.
*
* At the moment, unicast (IW_BITRATE_UNICAST) and broadcast
* (IW_BITRATE_BROADCAST) bitrate flags are not supported.
*/
typedef enum
{
WAPI_BITRATE_AUTO,
WAPI_BITRATE_FIXED
} wapi_bitrate_flag_t;
/* Transmit power (txpower) flags. */
typedef enum
{
WAPI_TXPOWER_DBM, /* Value is in dBm. */
WAPI_TXPOWER_MWATT, /* Value is in mW. */
WAPI_TXPOWER_RELATIVE /* Value is in arbitrary units. */
} wapi_txpower_flag_t;
/* Linked list container for strings. */
typedef struct wapi_string_t
{
FAR struct wapi_string_t *next;
FAR char *data;
} wapi_string_t;
/* Linked list container for scan results. */
typedef struct wapi_scan_info_t
{
FAR struct wapi_scan_info_t *next;
struct ether_addr ap;
int has_essid;
char essid[WAPI_ESSID_MAX_SIZE + 1];
wapi_essid_flag_t essid_flag;
int has_freq;
double freq;
int has_mode;
wapi_mode_t mode;
int has_bitrate;
int bitrate;
} wapi_scan_info_t;
/* Linked list container for routing table rows. */
typedef struct wapi_route_info_t
{
FAR struct wapi_route_info_t *next;
FAR char *ifname;
struct in_addr dest;
struct in_addr gw;
unsigned int flags;/* See RTF_* in net/route.h for available values. */
unsigned int refcnt;
unsigned int use;
unsigned int metric;
struct in_addr netmask;
unsigned int mtu;
unsigned int window;
unsigned int irtt;
} wapi_route_info_t;
/* A generic linked list container. For functions taking wapi_list_t type of
* argument, caller is resposible for releasing allocated memory.
*/
struct wapi_list_t
{
union wapi_list_head_t
{
FAR wapi_string_t *string;
FAR wapi_scan_info_t *scan;
FAR wapi_route_info_t *route;
} head;
};
/****************************************************************************
* Public Data
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/* Frequency flag names. */
EXTERN FAR const char *g_wapi_freq_flags[];
/* ESSID flag names. */
EXTERN FAR const char *g_wapi_essid_flags[];
/* Supported operation mode names. */
EXTERN FAR const char *g_wapi_modes[];
/* Bitrate flag names. */
EXTERN FAR const char *g_wapi_bitrate_flags[];
/* Transmit power flag names. */
EXTERN FAR const char *g_wapi_txpower_flags[];
/****************************************************************************
* Public Function Prototyppes
****************************************************************************/
/****************************************************************************
* Name: wapi_get_ifup
*
* Description:
* Gets the interface up status.
*
* Input Parameters:
* is_up Set to 0, if up; 1, otherwise.
*
****************************************************************************/
int wapi_get_ifup(int sock, const char *ifname, int *is_up);
/****************************************************************************
* Name: wapi_set_ifup
*
* Description:
* Activates the interface.
*
****************************************************************************/
int wapi_set_ifup(int sock, const char *ifname);
/****************************************************************************
* Name: wapi_set_ifdown
*
* Description:
* Shuts down the interface.
*
****************************************************************************/
int wapi_set_ifdown(int sock, const char *ifname);
/****************************************************************************
* Name: wapi_get_ip
*
* Description:
* Gets IP address of the given network interface.
*
****************************************************************************/
int wapi_get_ip(int sock, const char *ifname, struct in_addr *addr);
/****************************************************************************
* Name: wapi_set_ip
*
* Description:
* Sets IP adress of the given network interface.
*
****************************************************************************/
int wapi_set_ip(int sock, const char *ifname, const struct in_addr *addr);
/****************************************************************************
* Name: wapi_get_netmask
*
* Description:
* Gets netmask of the given network interface.
*
****************************************************************************/
int wapi_get_netmask(int sock, const char *ifname, struct in_addr *addr);
/****************************************************************************
* Name: wapi_set_netmask
*
* Description:
* Sets netmask of the given network interface.
*
****************************************************************************/
int wapi_set_netmask(int sock, const char *ifname, const struct in_addr *addr);
/****************************************************************************
* Name: wapi_get_routes
*
* Description:
* Parses routing table rows from WAPI_PROC_NET_ROUTE.
*
* Input Parameters:
* list - Pushes collected wapi_route_info_t into this list.
*
****************************************************************************/
int wapi_get_routes(wapi_list_t * list);
/****************************************************************************
* Name: wapi_add_route_gw
*
* Description:
* Adds gateway for the given target network.
*
****************************************************************************/
int wapi_add_route_gw(int sock, wapi_route_target_t targettype,
FAR const struct in_addr *target,
FAR const struct in_addr *netmask,
FAR const struct in_addr *gw);
/****************************************************************************
* Name: wapi_del_route_gw
*
* Description:
* Deletes gateway for the given target network.
*
****************************************************************************/
int wapi_del_route_gw(int sock, wapi_route_target_t targettype,
FAR const struct in_addr *target,
FAR const struct in_addr *netmask,
FAR const struct in_addr *gw);
/****************************************************************************
* Name: wapi_get_we_version
*
* Description:
* Gets kernel WE (Wireless Extensions) version.
*
* Input Parameters:
* we_version Set to we_version_compiled of range information.
*
* Returned Value:
* Zero on success.
*
****************************************************************************/
int wapi_get_we_version(int sock, const char *ifname, FAR int *we_version);
/****************************************************************************
* Name: wapi_get_freq
*
* Description:
* Gets the operating frequency of the device.
*
****************************************************************************/
int wapi_get_freq(int sock, FAR const char *ifname, FAR double *freq,
FAR wapi_freq_flag_t *flag);
/****************************************************************************
* Name: wapi_set_freq
*
* Description:
* Sets the operating frequency of the device.
*
****************************************************************************/
int wapi_set_freq(int sock, FARconst char *ifname, double freq,
wapi_freq_flag_t flag);
/****************************************************************************
* Name: wapi_freq2chan
*
* Description:
* Finds corresponding channel for the supplied freq.
*
* Returned Value:
* 0, on success; -2, if not found; otherwise, ioctl() return value.
*
****************************************************************************/
int wapi_freq2chan(int sock, FAR const char *ifname, double freq,
FAR int *chan);
/****************************************************************************
* Name: wapi_chan2freq
*
* Description:
* Finds corresponding frequency for the supplied chan.
*
* Returned Value:
* 0, on success; -2, if not found; otherwise, ioctl() return value.
*
****************************************************************************/
int wapi_chan2freq(int sock, FAR const char *ifname, int chan,
FAR double *freq);
/****************************************************************************
* Name: wapi_get_essid
*
* Description:
* Gets ESSID of the device.
*
* Input Parameters:
* essid - Used to store the ESSID of the device. Buffer must have
* enough space to store WAPI_ESSID_MAX_SIZE+1 characters.
*
****************************************************************************/
int wapi_get_essid(int sock, FAR const char *ifname, FAR char *essid,
FAR wapi_essid_flag_t *flag);
/****************************************************************************
* Name: wapi_set_essid
*
* Description:
* Sets ESSID of the device.
*
* essid At most WAPI_ESSID_MAX_SIZE characters are read.
*
****************************************************************************/
int wapi_set_essid(int sock, FAR const char *ifname, FAR const char *essid,
wapi_essid_flag_t flag);
/****************************************************************************
* Name: wapi_get_mode
*
* Description:
* Gets the operating mode of the device.
*
****************************************************************************/
int wapi_get_mode(int sock, FAR const char *ifname, FAR wapi_mode_t *mode);
/****************************************************************************
* Name: wapi_set_mode
*
* Description:
* Sets the operating mode of the device.
*
****************************************************************************/
int wapi_set_mode(int sock, FAR const char *ifname, wapi_mode_t mode);
/****************************************************************************
* Name: wapi_make_broad_ether
*
* Description:
* Creates an ethernet broadcast address.
*
****************************************************************************/
int wapi_make_broad_ether(FAR struct ether_addr *sa);
/****************************************************************************
* Name: wapi_make_null_ether
*
* Description:
* Creates an ethernet NULL address.
*
****************************************************************************/
int wapi_make_null_ether(FAR struct ether_addr *sa);
/****************************************************************************
* Name: wapi_get_ap
*
* Description:
* Gets access point address of the device.
*
* Input Parameters:
* ap - Set the to MAC address of the device. (For "any", a broadcast
* ethernet address; for "off", a null ethernet address is used.)
*
****************************************************************************/
int wapi_get_ap(int sock, FAR const char *ifname, FAR struct ether_addr *ap);
/****************************************************************************
* Name: wapi_set_ap
*
* Description:
* Sets access point address of the device.
*
****************************************************************************/
int wapi_set_ap(int sock, FAR const char *ifname,
FAR const struct ether_addr *ap);
/****************************************************************************
* Name: wapi_get_bitrate
*
* Description:
* Gets bitrate of the device.
*
****************************************************************************/
int wapi_get_bitrate(int sock, FAR const char *ifname,
FAR int *bitrate, FAR wapi_bitrate_flag_t *flag);
/****************************************************************************
* Name: wapi_set_bitrate
*
* Description:
* Sets bitrate of the device.
*
****************************************************************************/
int wapi_set_bitrate(int sock, FAR const char *ifname, int bitrate,
wapi_bitrate_flag_t flag);
/****************************************************************************
* Name: wapi_dbm2mwatt
*
* Description:
* Converts a value in dBm to a value in milliWatt.
*
****************************************************************************/
int wapi_dbm2mwatt(int dbm);
/****************************************************************************
* Name: wapi_mwatt2dbm
*
* Description:
* Converts a value in milliWatt to a value in dBm.
*
****************************************************************************/
int wapi_mwatt2dbm(int mwatt);
/****************************************************************************
* Name: wapi_get_txpower
*
* Description:
* Gets txpower of the device.
*
****************************************************************************/
int wapi_get_txpower(int sock, FAR const char *ifname, FAR int *power,
FAR wapi_txpower_flag_t *flag);
/****************************************************************************
* Name: wapi_set_txpower
*
* Description:
* Sets txpower of the device.
*
****************************************************************************/
int wapi_set_txpower(int sock, FAR const char *ifname, int power,
wapi_txpower_flag_t flag);
/****************************************************************************
* Name: wapi_if_add
*
* Description:
* Creates a virtual interface with name for interface ifname.
*
****************************************************************************/
int wapi_if_add(int sock, FAR const char *ifname, FAR const char *name,
wapi_mode_t mode);
/****************************************************************************
* Name: wapi_if_del
*
* Description:
* Deletes a virtual interface with name.
*
****************************************************************************/
int wapi_if_del(int sock, FAR const char *ifname);
/****************************************************************************
* Name: wapi_make_socket
*
* Description:
* Creates an AF_INET socket to be used in ioctl() calls.
*
* Returned Value:
* Non-negative on success.
*
****************************************************************************/
int wapi_make_socket(void);
/****************************************************************************
* Name: wapi_get_ifnames
*
* Description:
* Parses WAPI_PROC_NET_WIRELESS.
*
* Returned Value:
* list Pushes collected wapi_string_t into this list.
*
****************************************************************************/
int wapi_get_ifnames(FAR wapi_list_t *list);
/****************************************************************************
* Name: wapi_scan_init
*
* Description:
* Starts a scan on the given interface. Root privileges are required to start a
* scan.
*
****************************************************************************/
int wapi_scan_init(int sock, const char *ifname);
/****************************************************************************
* Name: wapi_scan_stat
*
* Description:
* Checks the status of the scan process.
*
* Returned Value:
* Zero, if data is ready; 1, if data is not ready; negative on failure.
*
****************************************************************************/
int wapi_scan_stat(int sock, FAR const char *ifname);
/****************************************************************************
* Name: wapi_scan_coll
*
* Description:
* Collects the results of a scan process.
*
* Input Parameters:
* aps - Pushes collected wapi_scan_info_t into this list.
*
****************************************************************************/
int wapi_scan_coll(int sock, FAR const char *ifname, FAR wapi_list_t *aps);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __APPS_INCLUDE_WIRELESS_WAPI_H */

6
wireless/wapi/.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
/.built
/.depend
/Make.dep
/*.src
/*.obj
/*.lst

23
wireless/wapi/LICENSE Normal file
View File

@ -0,0 +1,23 @@
Copyright (c) 2010, Volkan YAZICI <volkan.yazici@gmail.com>
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
- 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.
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.

42
wireless/wapi/README Normal file
View File

@ -0,0 +1,42 @@
`_`_`_`_____`_____`__`
|`|`|`|``_``|``_``|``|
|`|`|`|`````|```__|``|
|_____|__|__|__|``|__|
WAPI (Wireless API) provides an easy-to-use function set to configure wireless
network interfaces on a GNU/Linux system. One can think WAPI as a lightweight C
API for iwconfig, wlanconfig, ifconfig, and route commands. (But it is not a
thin wrapper for these command line tools.) It is designed to be used in
wireless heteregenous network research projects and supported by BWRC (Berkeley
Wireless Research Center) and WISERLAB (Wireless Information Systems Engineering
Research Laboratory at Özyeğin University).
For source codes, see http://github.com/vy/wapi. The most recent version of the
documentation is (hopefully) always available at http://vy.github.com/wapi.
--- L I C E N S E --------------------------------------------------------------
Copyright (c) 2010, Volkan YAZICI <volkan.yazici@gmail.com>
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
- 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.
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.

View File

@ -0,0 +1,118 @@
/****************************************************************************
* apps/wireless/wapi/examples/ifadd.c
*
* Copyright (c) 2010, Volkan YAZICI <volkan.yazici@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - 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.
*
* 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "include/wireless/wapi.h"
/****************************************************************************
* Private Functions
****************************************************************************/
static int parse_wapi_mode(FAR const char *s, FAR wapi_mode_t * mode)
{
int ret = 0;
if (!strcmp(s, "auto"))
{
*mode = WAPI_MODE_AUTO;
else if (!strcmp(s, "adhoc"))
{
*mode = WAPI_MODE_ADHOC;
}
else if (!strcmp(s, "managed"))
{
*mode = WAPI_MODE_MANAGED;
}
else if (!strcmp(s, "master"))
{
*mode = WAPI_MODE_MASTER;
}
else if (!strcmp(s, "repeat"))
{
*mode = WAPI_MODE_REPEAT;
}
else if (!strcmp(s, "second"))
{
*mode = WAPI_MODE_SECOND;
}
else if (!strcmp(s, "monitor"))
{
*mode = WAPI_MODE_MONITOR;
}
else
{
ret = 1;
}
return ret;
}
/****************************************************************************
* Public Functions
****************************************************************************/
#ifdef CONFIG_BUILD_KERNEL
int main(int argc, FAR char *argv[])
#else
int ifadd_main(int argc, char *argv[])
#endif
{
wapi_mode_t mode;
FAR const char *ifname;
FAR const char *name;
int ret;
if (argc != 4)
{
fprintf(stderr, "Usage: %s <IFNAME> <NAME> <MODE>\n", argv[0]);
return EXIT_FAILURE;
}
ifname = argv[1];
name = argv[2];
if (parse_wapi_mode(argv[3], &mode))
{
fprintf(stderr, "Unknown mode: %s!\n", argv[3]);
return EXIT_FAILURE;
}
ret = wapi_if_add(-1, ifname, name, mode);
fprintf(stderr, "wapi_if_add(): ret: %d\n", ret);
return ret;
}

View File

@ -0,0 +1,62 @@
/****************************************************************************
* apps/wireless/wapi/examples/ifdel.c
*
* Copyright (c) 2010, Volkan YAZICI <volkan.yazici@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - 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.
*
* 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "include/wireless/wapi.h"
/****************************************************************************
* Public Functions
****************************************************************************/
#ifdef CONFIG_BUILD_KERNEL
int main(int argc, FAR char *argv[])
#else
int ifdel_main(int argc, char *argv[])
#endif
{
int ret;
if (argc != 2)
{
fprintf(stderr, "Usage: %s <IFNAME>\n", argv[0]);
return EXIT_FAILURE;
}
ret = wapi_if_del(-1, argv[1]);
fprintf(stderr, "wapi_if_del(): ret: %d\n", ret);
return ret;
}

View File

@ -0,0 +1,35 @@
/****************************************************************************
* apps/wireless/wapi/examples/sample.c
*
* Copyright (c) 2010, Volkan YAZICI <volkan.yazici@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - 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.
*
* 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include "sample.c"

View File

@ -0,0 +1,36 @@
/****************************************************************************
* apps/wireless/wapi/examples/sample.c
*
* Copyright (c) 2010, Volkan YAZICI <volkan.yazici@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - 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.
*
* 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#define ENABLE_SET
#include "sample.c"

View File

@ -0,0 +1,410 @@
/****************************************************************************
* apps/wireless/wapi/examples/sample.c
*
* Copyright (c) 2010, Volkan YAZICI <volkan.yazici@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - 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.
*
* 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "include/wireless/wapi.h"
/* Gets current configuration of the @a ifname using WAPI accessors and prints
* them in a pretty fashion with their corresponding return values. If a getter
* succeeds, we try to set that property with the same value to test the setters
* as well.
*/
static void conf(int sock, FAR const char *ifname)
{
int ret;
struct in_addr addr;
double freq;
wapi_freq_flag_t freq_flag;
char essid[WAPI_ESSID_MAX_SIZE + 1];
wapi_essid_flag_t essid_flag;
wapi_mode_t mode;
struct ether_addr ap;
int bitrate;
wapi_bitrate_flag_t bitrate_flag;
int txpower;
wapi_txpower_flag_t txpower_flag;
/* Get ip */
bzero(&addr, sizeof(struct in_addr));
ret = wapi_get_ip(sock, ifname, &addr);
printf("wapi_get_ip(): ret: %d", ret);
if (ret >= 0)
{
printf(", ip: %s", inet_ntoa(addr));
#ifdef ENABLE_SET
/* set ip (Make sure sin.sin_family is set to AF_INET.) */
ret = wapi_set_ip(sock, ifname, &addr);
printf("\nwapi_set_ip(): ret: %d", ret);
#endif
}
putchar('\n');
/* Get netmask */
bzero(&addr, sizeof(struct in_addr));
ret = wapi_get_netmask(sock, ifname, &addr);
printf("wapi_get_netmask(): ret: %d", ret);
if (ret >= 0)
{
printf(", netmask: %s", inet_ntoa(addr));
#ifdef ENABLE_SET
/* set netmask (Make sure sin.sin_family is set to AF_INET.) */
ret = wapi_set_netmask(sock, ifname, &addr);
printf("\nwapi_set_netmask(): ret: %d", ret);
#endif
}
putchar('\n');
/* Get freq */
ret = wapi_get_freq(sock, ifname, &freq, &freq_flag);
printf("wapi_get_freq(): ret: %d", ret);
if (ret >= 0)
{
int chan;
double tmpfreq;
printf(", freq: %g, freq_flag: %s", freq, g_wapi_freq_flags[freq_flag]);
ret = wapi_freq2chan(sock, ifname, freq, &chan);
printf("\nwapi_freq2chan(): ret: %d", ret);
if (ret >= 0)
{
printf(", chan: %d", chan);
}
ret = wapi_chan2freq(sock, ifname, chan, &tmpfreq);
printf("\nwapi_chan2freq(): ret: %d", ret);
if (ret >= 0)
{
printf(", freq: %g", tmpfreq);
}
#ifdef ENABLE_SET
/* Set freq */
ret = wapi_set_freq(sock, ifname, freq, freq_flag);
printf("\nwapi_set_freq(): ret: %d", ret);
#endif
}
putchar('\n');
/* Get essid */
ret = wapi_get_essid(sock, ifname, essid, &essid_flag);
printf("wapi_get_essid(): ret: %d", ret);
if (ret >= 0)
{
printf(", essid: %s, essid_flag: %s",
essid, g_wapi_essid_flags[essid_flag]);
#ifdef ENABLE_SET
/* Set essid */
ret = wapi_set_essid(sock, ifname, essid, essid_flag);
printf("\nwapi_set_essid(): ret: %d", ret);
#endif
}
putchar('\n');
/* Get operating mode */
ret = wapi_get_mode(sock, ifname, &mode);
printf("wapi_get_mode(): ret: %d", ret);
if (ret >= 0)
{
printf(", mode: %s", g_wapi_modes[mode]);
#ifdef ENABLE_SET
/* Set operating mode */
ret = wapi_set_mode(sock, ifname, mode);
printf("\nwapi_set_mode(): ret: %d", ret);
#endif
}
putchar('\n');
/* Get ap */
ret = wapi_get_ap(sock, ifname, &ap);
printf("wapi_get_ap(): ret: %d", ret);
if (ret >= 0)
{
printf(", ap: %02X:%02X:%02X:%02X:%02X:%02X",
ap.ether_addr_octet[0], ap.ether_addr_octet[1],
ap.ether_addr_octet[2], ap.ether_addr_octet[3],
ap.ether_addr_octet[4], ap.ether_addr_octet[5]);
#ifdef ENABLE_SET
/* Set ap */
ret = wapi_set_ap(sock, ifname, &ap);
printf("\nwapi_set_ap(): ret: %d", ret);
#endif
}
putchar('\n');
/* Get bitrate */
ret = wapi_get_bitrate(sock, ifname, &bitrate, &bitrate_flag);
printf("wapi_get_bitrate(): ret: %d", ret);
if (ret >= 0)
{
printf(", bitrate: %d, bitrate_flag: %s", bitrate,
g_wapi_bitrate_flags[bitrate_flag]);
#ifdef ENABLE_SET
/* Set bitrate */
ret = wapi_set_bitrate(sock, ifname, bitrate, bitrate_flag);
printf("\nwapi_set_bitrate(): ret: %d", ret);
#endif
}
putchar('\n');
/* Get txpower */
ret = wapi_get_txpower(sock, ifname, &txpower, &txpower_flag);
printf("wapi_get_txpower(): ret: %d", ret);
if (ret >= 0)
{
printf(", txpower: %d, txpower_flag: %s",
txpower, g_wapi_txpower_flags[txpower_flag]);
#ifdef ENABLE_SET
/* Set txpower */
ret = wapi_set_txpower(sock, ifname, txpower, txpower_flag);
printf("\nwapi_set_txpower(): ret: %d", ret);
#endif
}
putchar('\n');
}
/* Scans available APs in the range using given @a ifname interface. (Requires
* root privileges to start a scan.)
*/
static void scan(int sock, FAR const char *ifname)
{
int sleepdur = 1;
int sleeptries = 5;
wapi_list_t list;
FAR wapi_scan_info_t *info;
int ret;
/* Start scan */
ret = wapi_scan_init(sock, ifname);
printf("wapi_scan_init(): ret: %d\n", ret);
/* Wait for completion */
do
{
sleep(sleepdur);
ret = wapi_scan_stat(sock, ifname);
printf("wapi_scan_stat(): ret: %d, sleeptries: %d\n", ret, sleeptries);
}
while (--sleeptries > 0 && ret > 0);
if (ret < 0)
{
return;
}
/* Collect results */
bzero(&list, sizeof(wapi_list_t));
ret = wapi_scan_coll(sock, ifname, &list);
printf("wapi_scan_coll(): ret: %d\n", ret);
/* Print found aps */
for (info = list.head.scan; info; info = info->next)
{
printf(">> %02x:%02x:%02x:%02x:%02x:%02x %s\n",
info->ap.ether_addr_octet[0], info->ap.ether_addr_octet[1],
info->ap.ether_addr_octet[2], info->ap.ether_addr_octet[3],
info->ap.ether_addr_octet[4], info->ap.ether_addr_octet[5],
(info->has_essid ? info->essid : ""));
}
/* Free ap list */
info = list.head.scan;
while (info)
{
FAR wapi_scan_info_t *temp;
temp = info->next;
free(info);
info = temp;
}
}
/****************************************************************************
* Public Functions
****************************************************************************/
#ifdef CONFIG_BUILD_KERNEL
int main(int argc, FAR char *argv[])
#else
int wapi_main(int argc, char *argv[])
#endif
{
FAR const char *ifname;
wapi_list_t list;
int ret;
int sock;
/* Check command line args */
if (argc != 2)
{
fprintf(stderr, "Usage: %s <IFNAME>\n", argv[0]);
return EXIT_FAILURE;
}
ifname = argv[1];
/* Get ifnames */
bzero(&list, sizeof(wapi_list_t));
ret = wapi_get_ifnames(&list);
printf("wapi_get_ifnames(): ret: %d", ret);
if (ret >= 0)
{
FAR wapi_string_t *str;
/* Print ifnames */
printf(", ifnames:");
for (str = list.head.string; str; str = str->next)
{
printf(" %s", str->data);
}
/* Free ifnames */
str = list.head.string;
while (str)
{
FAR wapi_string_t *tmp;
tmp = str->next;
free(str->data);
free(str);
str = tmp;
}
}
putchar('\n');
/* Get routes */
bzero(&list, sizeof(wapi_list_t));
ret = wapi_get_routes(&list);
printf("wapi_get_routes(): ret: %d\n", ret);
if (ret >= 0)
{
wapi_route_info_t *ri;
/* Print route */
for (ri = list.head.route; ri; ri = ri->next)
{
printf(">> dest: %s, gw: %s, netmask: %s\n",
inet_ntoa(ri->dest), inet_ntoa(ri->gw),
inet_ntoa(ri->netmask));
}
/* Free routes */
ri = list.head.route;
while (ri)
{
FAR wapi_route_info_t *tmpri;
tmpri = ri->next;
free(ri->ifname);
free(ri);
ri = tmpri;
}
}
/* Make a comm. sock. */
sock = wapi_make_socket();
printf("wapi_make_socket(): sock: %d\n", sock);
/* List conf */
printf("\nconf\n");
printf("------------\n");
conf(sock, ifname);
/* Scan aps */
printf("\nscan\n");
printf("----\n");
scan(sock, ifname);
/* Close comm. sock. */
close(sock);
return EXIT_SUCCESS;
}

425
wireless/wapi/src/network.c Normal file
View File

@ -0,0 +1,425 @@
/****************************************************************************
* apps/wireless/wapi/examples/network.c
*
* Copyright (c) 2010, Volkan YAZICI <volkan.yazici@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - 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.
*
* 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <net/route.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include "util.h"
#include "include/wireless/wapi.h"
/****************************************************************************
* Private Functions
****************************************************************************/
static int wapi_get_addr(int sock, FAR const char *ifname, int cmd,
FAR struct in_addr *addr)
{
struct ifreq ifr;
int ret;
WAPI_VALIDATE_PTR(addr);
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if ((ret = ioctl(sock, cmd, &ifr)) >= 0)
{
struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
memcpy(addr, &sin->sin_addr, sizeof(struct in_addr));
}
else
{
WAPI_IOCTL_STRERROR(cmd);
}
return ret;
}
static int wapi_set_addr(int sock, FAR const char *ifname, int cmd,
FAR const struct in_addr *addr)
{
struct sockaddr_in sin;
struct ifreq ifr;
int ret;
WAPI_VALIDATE_PTR(addr);
sin.sin_family = AF_INET;
memcpy(&sin.sin_addr, addr, sizeof(struct in_addr));
memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr_in));
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if ((ret = ioctl(sock, cmd, &ifr)) < 0)
{
WAPI_IOCTL_STRERROR(cmd);
}
return ret;
}
static int wapi_act_route_gw(int sock, int act,
wapi_route_target_t targettype,
FAR const struct in_addr *target,
FAR const struct in_addr *netmask,
FAR const struct in_addr *gw)
{
int ret;
struct rtentry rt;
FAR struct sockaddr_in *sin;
/* Clean out rtentry. */
bzero(&rt, sizeof(struct rtentry));
/* Set target. */
sin = (struct sockaddr_in *)&rt.rt_dst;
sin->sin_family = AF_INET;
memcpy(&sin->sin_addr, target, sizeof(struct in_addr));
/* Set netmask. */
sin = (struct sockaddr_in *)&rt.rt_genmask;
sin->sin_family = AF_INET;
memcpy(&sin->sin_addr, netmask, sizeof(struct in_addr));
/* Set gateway. */
sin = (struct sockaddr_in *)&rt.rt_gateway;
sin->sin_family = AF_INET;
memcpy(&sin->sin_addr, gw, sizeof(struct in_addr));
/* Set rt_flags. */
rt.rt_flags = RTF_UP | RTF_GATEWAY;
if (targettype == WAPI_ROUTE_TARGET_HOST)
{
rt.rt_flags |= RTF_HOST;
}
if ((ret = ioctl(sock, act, &rt)) < 0)
{
WAPI_IOCTL_STRERROR(act);
}
return ret;
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: wapi_get_ifup
*
* Description:
* Gets the interface up status.
*
* Input Parameters:
* is_up Set to 0, if up; 1, otherwise.
*
****************************************************************************/
int wapi_get_ifup(int sock, FAR const char *ifname, FAR int *is_up)
{
struct ifreq ifr;
int ret;
WAPI_VALIDATE_PTR(is_up);
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if ((ret = ioctl(sock, SIOCGIFFLAGS, &ifr)) >= 0)
{
*is_up = (ifr.ifr_flags & IFF_UP) == IFF_UP;
}
else
{
WAPI_IOCTL_STRERROR(SIOCGIFFLAGS);
}
return ret;
}
/****************************************************************************
* Name: wapi_set_ifup
*
* Description:
* Activates the interface.
*
****************************************************************************/
int wapi_set_ifup(int sock, FAR const char *ifname)
{
struct ifreq ifr;
int ret;
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if ((ret = ioctl(sock, SIOCGIFFLAGS, &ifr)) >= 0)
{
ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
ret = ioctl(sock, SIOCSIFFLAGS, &ifr);
}
else
{
WAPI_IOCTL_STRERROR(SIOCGIFFLAGS);
}
return ret;
}
/****************************************************************************
* Name: wapi_set_ifdown
*
* Description:
* Shuts down the interface.
*
****************************************************************************/
int wapi_set_ifdown(int sock, FAR const char *ifname)
{
struct ifreq ifr;
int ret;
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if ((ret = ioctl(sock, SIOCGIFFLAGS, &ifr)) >= 0)
{
ifr.ifr_flags &= ~IFF_UP;
ret = ioctl(sock, SIOCSIFFLAGS, &ifr);
}
else
{
WAPI_IOCTL_STRERROR(SIOCGIFFLAGS);
}
return ret;
}
/****************************************************************************
* Name: wapi_get_ip
*
* Description:
* Gets IP address of the given network interface.
*
****************************************************************************/
int wapi_get_ip(int sock, FAR const char *ifname, FAR struct in_addr *addr)
{
return wapi_get_addr(sock, ifname, SIOCGIFADDR, addr);
}
/****************************************************************************
* Name: wapi_set_ip
*
* Description:
* Sets IP adress of the given network interface.
*
****************************************************************************/
int wapi_set_ip(int sock, FAR const char *ifname,
FAR const struct in_addr *addr)
{
return wapi_set_addr(sock, ifname, SIOCSIFADDR, addr);
}
/****************************************************************************
* Name: wapi_set_netmask
*
* Description:
* Sets netmask of the given network interface.
*
****************************************************************************/
int wapi_get_netmask(int sock, FAR const char *ifname,
FAR struct in_addr *addr)
{
return wapi_get_addr(sock, ifname, SIOCGIFNETMASK, addr);
}
/****************************************************************************
* Name: wapi_set_netmask
*
* Description:
* Sets netmask of the given network interface.
*
****************************************************************************/
int wapi_set_netmask(int sock, FAR const char *ifname,
FAR const struct in_addr *addr)
{
return wapi_set_addr(sock, ifname, SIOCSIFNETMASK, addr);
}
/****************************************************************************
* Name: wapi_get_routes
*
* Description:
* Parses routing table rows from WAPI_PROC_NET_ROUTE.
*
* Input Parameters:
* list - Pushes collected wapi_route_info_t into this list.
*
****************************************************************************/
int wapi_get_routes(FAR wapi_list_t *list)
{
FAR FILE *fp;
int ret;
size_t bufsiz = WAPI_PROC_LINE_SIZE * sizeof(char);
char buf[WAPI_PROC_LINE_SIZE];
WAPI_VALIDATE_PTR(list);
/* Open file for reading. */
fp = fopen(WAPI_PROC_NET_ROUTE, "r");
if (!fp)
{
WAPI_STRERROR("fopen(\"%s\", \"r\")", WAPI_PROC_NET_ROUTE);
return -1;
}
/* Skip header line. */
if (!fgets(buf, bufsiz, fp))
{
WAPI_ERROR("Invalid \"%s\" content!\n", WAPI_PROC_NET_ROUTE);
return -1;
}
/* Read lines. */
ret = 0;
while (fgets(buf, bufsiz, fp))
{
wapi_route_info_t *ri;
char ifname[WAPI_PROC_LINE_SIZE];
int refcnt, use, metric, mtu, window, irtt;
unsigned int dest, gw, flags, netmask;
/* Allocate route row buffer. */
ri = malloc(sizeof(wapi_route_info_t));
if (!ri)
{
WAPI_STRERROR("malloc()");
ret = -1;
break;
}
/* Read and tokenize fields. */
sscanf(buf, "%s\t" /* ifname */
"%x\t" /* dest */
"%x\t" /* gw */
"%x\t" /* flags */
"%d\t" /* refcnt */
"%d\t" /* use */
"%d\t" /* metric */
"%x\t" /* mask */
"%d\t" /* mtu */
"%d\t" /* window */
"%d\t", /* irtt */
ifname, &dest, &gw, &flags, &refcnt, &use, &metric, &netmask, &mtu,
&window, &irtt);
/* Allocate "ifname". */
ri->ifname = malloc((strlen(ifname) + 1) * sizeof(char));
if (!ri->ifname)
{
WAPI_STRERROR("malloc()");
free(ri);
ret = -1;
break;
}
/* Copy fields. */
sprintf(ri->ifname, "%s", ifname);
ri->dest.s_addr = dest;
ri->gw.s_addr = gw;
ri->flags = flags;
ri->refcnt = refcnt;
ri->use = use;
ri->metric = metric;
ri->netmask.s_addr = netmask;
ri->mtu = mtu;
ri->window = window;
ri->irtt = irtt;
/* Push parsed node to the list. */
ri->next = list->head.route;
list->head.route = ri;
}
/* Close file. */
fclose(fp);
return 0;
}
/****************************************************************************
* Name: wapi_add_route_gw
*
* Description:
* Adds gateway for the given target network.
*
****************************************************************************/
int wapi_add_route_gw(int sock, wapi_route_target_t targettype,
FAR const struct in_addr *target,
FAR const struct in_addr *netmask,
FAR const struct in_addr *gw)
{
return wapi_act_route_gw(sock, SIOCADDRT, targettype, target, netmask, gw);
}
/****************************************************************************
* Name: wapi_del_route_gw
*
* Description:
* Deletes gateway for the given target network.
*
****************************************************************************/
int wapi_del_route_gw(int sock, wapi_route_target_t targettype,
FAR const struct in_addr *target,
FAR const struct in_addr *netmask,
FAR const struct in_addr *gw)
{
return wapi_act_route_gw(sock, SIOCDELRT, targettype, target, netmask, gw);
}

235
wireless/wapi/src/util.c Normal file
View File

@ -0,0 +1,235 @@
/****************************************************************************
* apps/wireless/wapi/src/util.c
*
* Copyright (c) 2010, Volkan YAZICI <volkan.yazici@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - 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.
*
* 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include "include/wireless/wapi.h"
#include "util.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#define WAPI_IOCTL_COMMAND_NAMEBUFSIZ 128 /* Is fairly enough to print an
* integer. */
/****************************************************************************
* Public Functions
****************************************************************************/
static char g_ioctl_command_namebuf[WAPI_IOCTL_COMMAND_NAMEBUFSIZ];
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: wapi_make_socket
*
* Description:
* Creates an AF_INET socket to be used in ioctl() calls.
*
* Returned Value:
* Non-negative on success.
*
****************************************************************************/
int wapi_make_socket(void)
{
return socket(AF_INET, SOCK_DGRAM, 0);
}
/****************************************************************************
* Name: wapi_get_ifnames
*
* Description:
* Parses WAPI_PROC_NET_WIRELESS.
*
* Returned Value:
* list Pushes collected wapi_string_t into this list.
*
****************************************************************************/
int wapi_get_ifnames(FAR wapi_list_t *list)
{
FILE *fp;
int ret;
size_t tmpsize = WAPI_PROC_LINE_SIZE * sizeof(char);
char tmp[WAPI_PROC_LINE_SIZE];
WAPI_VALIDATE_PTR(list);
/* Open file for reading. */
fp = fopen(WAPI_PROC_NET_WIRELESS, "r");
if (!fp)
{
WAPI_STRERROR("fopen(\"%s\", \"r\")", WAPI_PROC_NET_WIRELESS);
return -1;
}
/* Skip first two lines. */
if (!fgets(tmp, tmpsize, fp) || !fgets(tmp, tmpsize, fp))
{
WAPI_ERROR("Invalid \"%s\" content!\n", WAPI_PROC_NET_WIRELESS);
return -1;
}
/* Iterate over available lines. */
ret = 0;
while (fgets(tmp, tmpsize, fp))
{
char *beg;
char *end;
wapi_string_t *string;
/* Locate the interface name region. */
for (beg = tmp; *beg && isspace(*beg); beg++);
for (end = beg; *end && *end != ':'; end++);
/* Allocate both wapi_string_t and char vector. */
string = malloc(sizeof(wapi_string_t));
if (string)
{
string->data = malloc(end - beg + sizeof(char));
}
if (!string || !string->data)
{
WAPI_STRERROR("malloc()");
ret = -1;
break;
}
/* Copy region into the buffer. */
snprintf(string->data, (end - beg + sizeof(char)), "%s", beg);
/* Push string into the list. */
string->next = list->head.string;
list->head.string = string;
}
fclose(fp);
return ret;
}
/****************************************************************************
* Name: wapi_get_ifnames
*
* Description:
* Return name string for IOCTL command
*
* Returned Value:
* Name string for IOCTL command
*
****************************************************************************/
FAR const char *wapi_ioctl_command_name(int cmd)
{
switch (cmd)
{
case SIOCADDRT:
return "SIOCADDRT";
case SIOCDELRT:
return "SIOCDELRT";
case SIOCGIFADDR:
return "SIOCGIFADDR";
case SIOCGIWAP:
return "SIOCGIWAP";
case SIOCGIWESSID:
return "SIOCGIWESSID";
case SIOCGIWFREQ:
return "SIOCGIWFREQ";
case SIOCGIWMODE:
return "SIOCGIWMODE";
case SIOCGIWRANGE:
return "SIOCGIWRANGE";
case SIOCGIWRATE:
return "SIOCGIWRATE";
case SIOCGIWSCAN:
return "SIOCGIWSCAN";
case SIOCGIWTXPOW:
return "SIOCGIWTXPOW";
case SIOCSIFADDR:
return "SIOCSIFADDR";
case SIOCSIWAP:
return "SIOCSIWAP";
case SIOCSIWESSID:
return "SIOCSIWESSID";
case SIOCSIWFREQ:
return "SIOCSIWFREQ";
case SIOCSIWMODE:
return "SIOCSIWMODE";
case SIOCSIWRATE:
return "SIOCSIWRATE";
case SIOCSIWSCAN:
return "SIOCSIWSCAN";
case SIOCSIWTXPOW:
return "SIOCSIWTXPOW";
default:
snprintf(g_ioctl_command_namebuf, WAPI_IOCTL_COMMAND_NAMEBUFSIZ,
"0x%x", cmd);
return g_ioctl_command_namebuf;
}
}

75
wireless/wapi/src/util.h Normal file
View File

@ -0,0 +1,75 @@
/****************************************************************************
* apps/wireless/wapi/src/util.h
*
* Copyright (c) 2010, Volkan YAZICI <volkan.yazici@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - 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.
*
* 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.
*
****************************************************************************/
#ifndef __APPS_WIRELESS_WAPI_SRC_UTIL_H
#define __APPS_WIRELESS_WAPI_SRC_UTIL_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <string.h>
#include <errno.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#define WAPI_IOCTL_STRERROR(cmd) \
fprintf( \
stderr, "%s:%d:%s():ioctl(%s): %s\n", \
__FILE__, __LINE__, __func__, \
wapi_ioctl_command_name(cmd), strerror(errno))
#define WAPI_STRERROR(fmt, ...) \
fprintf( \
stderr, "%s:%d:%s():" fmt ": %s\n", \
__FILE__, __LINE__, __func__, \
## __VA_ARGS__, strerror(errno))
#define WAPI_ERROR(fmt, ...) \
fprintf( \
stderr, "%s:%d:%s(): " fmt , \
__FILE__, __LINE__, __func__, ## __VA_ARGS__)
#define WAPI_VALIDATE_PTR(ptr) \
if (!ptr) \
{ \
WAPI_ERROR("Null pointer: %s.\n", #ptr); \
return -1; \
}
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
FAR const char *wapi_ioctl_command_name(int cmd);
#endif /* __APPS_WIRELESS_WAPI_SRC_UTIL_H */

1498
wireless/wapi/src/wireless.c Normal file

File diff suppressed because it is too large Load Diff