Page MenuHomec4science

changeip.cc
No OneTemporary

File Metadata

Created
Sat, Jul 5, 03:56

changeip.cc

#include <click/config.h>
#include "changeip.hh"
CLICK_DECLS
ChangeIP::ChangeIP()
{
}
ChangeIP::~ChangeIP()
{
}
int
ChangeIP::configure(Vector<String> &conf, ErrorHandler *errh)
{
_offset = 0;
_active = false;
if (Args(conf, this, errh)
.read("OFFSET", _offset)
.complete() < 0)
return -1;
return 0;
}
int
ChangeIP::initialize(ErrorHandler *)
{
return 0;
}
Packet *
ChangeIP::simple_action(Packet *p)
{
if(_active) {
click_ip *ip = (click_ip *) (p->data()+_offset);
if(_src!=IPAddress()) {
ip->ip_src = _src;
}
if(_dst!=IPAddress()) {
ip->ip_dst = _dst;
}
}
return p;
}
int
ChangeIP::bool_handler(const String &s, Element *e, void *arg,
ErrorHandler *errh) {
ChangeIP *elmt = (ChangeIP *)e;
int b;
if(!cp_integer(s, &b))
return errh->error("Arg must be 0 or 1");
if (!(b == 0 || b == 1))
return errh->error("Arg must be 0 or 1");
if(((intptr_t) arg) == 0)
elmt->set_active(b==1);
return 0;
}
int
ChangeIP::ip_handler(const String &s, Element *e, void *arg,
ErrorHandler *errh) {
ChangeIP *elmt = (ChangeIP *)e;
IPAddress ip;
if(cp_ip_address(s, &ip)) {
if(((intptr_t) arg) == 0)
elmt->set_src(ip);
if(((intptr_t) arg) == 1)
elmt->set_dst(ip);
}
else {
if(((intptr_t) arg) == 0)
elmt->set_src(IPAddress());
if(((intptr_t) arg) == 1)
elmt->set_dst(IPAddress());
}
return 0;
}
void ChangeIP::add_handlers() {
add_write_handler("active", bool_handler, 0);
add_write_handler("src", ip_handler, 0);
add_write_handler("dst", ip_handler, 1);
}
CLICK_ENDDECLS
EXPORT_ELEMENT(ChangeIP)
ELEMENT_MT_SAFE(ChangeIP)

Event Timeline