root/headers/os/net/NetworkDevice.h
/*
 * Copyright 2010, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _NETWORK_DEVICE_H
#define _NETWORK_DEVICE_H


#include <net/if.h>
#include <string.h>


// authentication modes
enum {
        B_NETWORK_AUTHENTICATION_NONE           = 0,
        B_NETWORK_AUTHENTICATION_WEP            = 1,
        B_NETWORK_AUTHENTICATION_WPA            = 2,
        B_NETWORK_AUTHENTICATION_WPA2           = 3,
        B_NETWORK_AUTHENTICATION_EAP            = 4
};

// cipher algorithms
enum {
        B_NETWORK_CIPHER_NONE                           = 0x01,
        B_NETWORK_CIPHER_WEP_40                         = 0x02,
        B_NETWORK_CIPHER_WEP_104                        = 0x04,
        B_NETWORK_CIPHER_TKIP                           = 0x08,
        B_NETWORK_CIPHER_CCMP                           = 0x10,
        B_NETWORK_CIPHER_AES_128_CMAC           = 0x20
};

// key modes
enum {
        B_KEY_MODE_IEEE802_1X                           = 0x0001,
        B_KEY_MODE_PSK                                          = 0x0002,
        B_KEY_MODE_NONE                                         = 0x0004,
        B_KEY_MODE_FT_IEEE802_1X                        = 0x0020,
        B_KEY_MODE_FT_PSK                                       = 0x0040,
        B_KEY_MODE_IEEE802_1X_SHA256            = 0x0080,
        B_KEY_MODE_PSK_SHA256                           = 0x0100,
        B_KEY_MODE_WPS                                          = 0x0200
};

// eap encapsulation method (IEEE 802.1x)
enum {
        B_NETWORK_EAP_ENCAPSULATION_NONE        = 0x0000,
        B_NETWORK_EAP_ENCAPSULATION_PEAP        = 0x0001,
        B_NETWORK_EAP_ENCAPSULATION_TLS         = 0x0002
};


#if defined(__cplusplus) && !defined(_KERNEL_MODE)

#include <NetworkAddress.h>


struct wireless_network {
        char                            name[32];
        BNetworkAddress         address;
        uint8                           noise_level;
        uint8                           signal_strength;
        uint32                          flags;
        uint32                          authentication_mode;
        uint32                          cipher;
        uint32                          group_cipher;
        uint32                          key_mode;

        bool operator==(const wireless_network& other) {
                return strncmp(name, other.name, 32) == 0
                        // ignore address difference
                        && noise_level == other.noise_level
                        && signal_strength == other.signal_strength
                        && flags == other.flags
                        && authentication_mode == other.authentication_mode
                        && cipher == other.cipher
                        && group_cipher == other.group_cipher
                        && key_mode == other.key_mode;
        }
};

// flags
#define B_NETWORK_IS_ENCRYPTED                  0x01
#define B_NETWORK_IS_PERSISTENT                 0x02


class BNetworkDevice {
public:
                                                                BNetworkDevice();
                                                                BNetworkDevice(const char* name);
                                                                ~BNetworkDevice();

                        void                            Unset();
                        void                            SetTo(const char* name);

                        const char*                     Name() const;
                        bool                            Exists() const;
                        uint32                          Index() const;

                        uint32                          Flags() const;
                        bool                            HasLink() const;

                        int32                           Media() const;
                        status_t                        SetMedia(int32 media);

                        status_t                        GetHardwareAddress(BNetworkAddress& address);

                        bool                            IsEthernet();
                        bool                            IsWireless();

                        status_t                        Control(int option, void* request);

                        status_t                        Scan(bool wait = true,
                                                                        bool forceRescan = true);

                        status_t                        GetNetworks(wireless_network*& networks,
                                                                        uint32& count);
                        status_t                        GetNetwork(const char* name,
                                                                        wireless_network& network);
                        status_t                        GetNetwork(const BNetworkAddress& address,
                                                                        wireless_network& network);

                        status_t                        JoinNetwork(const char* name,
                                                                        const char* password = NULL);
                        status_t                        JoinNetwork(const wireless_network& network,
                                                                        const char* password = NULL);
                        status_t                        JoinNetwork(const BNetworkAddress& address,
                                                                        const char* password = NULL);

                        status_t                        LeaveNetwork(const char* name);
                        status_t                        LeaveNetwork(const wireless_network& network);
                        status_t                        LeaveNetwork(const BNetworkAddress& address);

                        status_t                        GetNextAssociatedNetwork(uint32& cookie,
                                                                        wireless_network& network);
                        status_t                        GetNextAssociatedNetwork(uint32& cookie,
                                                                        BNetworkAddress& address);

private:
                        char                            fName[IF_NAMESIZE];
};

#endif  // __cplusplus && !_KERNEL_MODE

#endif  // _NETWORK_DEVICE_H