/*
* wirelessinfo.{cc,hh} -- Poor man's arp table
* John Bicket
*
* Copyright (c) 2003 Massachusetts Institute of Technology
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, subject to the conditions
* listed in the Click LICENSE file. These conditions include: you must
* preserve this copyright notice, and you cannot mention the copyright
* holders in advertising related to the Software without their permission.
* The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
* notice is a summary of the Click LICENSE file; the license in that file is
* legally binding.
*/
#include <click/config.h>
#include <click/confparse.hh>
#include <click/error.hh>
#include <click/glue.hh>
#include <click/straccum.hh>
#include <clicknet/ether.h>
#include "wirelessinfo.hh"
CLICK_DECLS
WirelessInfo::WirelessInfo()
: _ssid(""),
_bssid((const unsigned char *) "\000\000\000\000\000\000"),
_channel(-1),
_interval(100),
_wep(false)
{
}
WirelessInfo::~WirelessInfo()
{
}
int
WirelessInfo::configure(Vector<String> &conf, ErrorHandler *errh)
{
int res;
reset();
res = cp_va_parse(conf, this, errh,
cpKeywords,
"SSID", cpString, "ssid", &_ssid,
"BSSID", cpEthernetAddress, "bssid", &_bssid,
"CHANNEL", cpInteger, "channel", &_channel,
"INTERVAL", cpInteger, "interval", &_interval,
"WEP", cpBool, "wep", &_wep,
cpEnd);
return res;
}
enum {H_SSID, H_BSSID, H_CHANNEL, H_INTERVAL, H_WEP, H_RESET};
void
WirelessInfo::reset()
{
_ssid = "";
_channel = -1;
_bssid = EtherAddress();
_interval = 100;
_wep = false;
}
int
WirelessInfo::write_param(const String &in_s, Element *e, void *vparam,
ErrorHandler *errh)
{
WirelessInfo *f = (WirelessInfo *)e;
String s = cp_uncomment(in_s);
switch((intptr_t)vparam) {
case H_SSID: {
f->_ssid = s;
break;
}
case H_BSSID: {
EtherAddress e;
if (!cp_ethernet_address(s, &e))
return errh->error("bssid parameter must be ethernet address");
f->_bssid = e;
break;
}
case H_CHANNEL: {
int m;
if (!cp_integer(s, &m))
return errh->error("channel parameter must be int");
f->_channel = m;
break;
}
case H_INTERVAL: {
int m;
if (!cp_integer(s, &m))
return errh->error("interval parameter must be int");
f->_interval = m;
break;
}
case H_WEP: { //debug
bool wep;
if (!cp_bool(s, &wep))
return errh->error("wep parameter must be boolean");
f->_wep = wep;
break;
}
case H_RESET: f->reset(); break;
}
return 0;
}
String
WirelessInfo::read_param(Element *e, void *thunk)
{
WirelessInfo *td = (WirelessInfo *)e;
switch ((uintptr_t) thunk) {
case H_SSID: return td->_ssid + "\n";
case H_BSSID: return td->_bssid.s() + "\n";
case H_CHANNEL: return String(td->_channel) + "\n";
case H_INTERVAL: return String(td->_interval) + "\n";
case H_WEP: return String(td->_wep) + "\n";
default:
return "\n";
}
}
void
WirelessInfo::add_handlers()
{
add_read_handler("ssid", read_param, (void *) H_SSID);
add_read_handler("bssid", read_param, (void *) H_BSSID);
add_read_handler("channel", read_param, (void *) H_CHANNEL);
add_read_handler("interval", read_param, (void *) H_INTERVAL);
add_read_handler("wep", read_param, (void *) H_WEP);
add_write_handler("ssid", write_param, (void *) H_SSID);
add_write_handler("bssid", write_param, (void *) H_BSSID);
add_write_handler("channel", write_param, (void *) H_CHANNEL);
add_write_handler("interval", write_param, (void *) H_INTERVAL);
add_write_handler("wep", write_param, (void *) H_WEP);
add_write_handler("reset", write_param, (void *) H_RESET);
}
CLICK_ENDDECLS
EXPORT_ELEMENT(WirelessInfo)
syntax highlighted by Code2HTML, v. 0.9.1