[Click] debug
Sofia Rodriguez
blink_sgirl_182 at hotmail.com
Fri Jun 17 11:45:09 EDT 2011
Hello!:
I have this code that is supposed to create a fake ACK for every received packet and it is entirely based on existing elements. When I tried running it, It gave me fragmentation error and and when I started debugging I realized it receives a packet but does not detect any IP header nor TCP header. I was wondering if you could help me out. Thank you!!
#include <click/config.h>
#include "spoofer.hh"
#include <clicknet/ip.h>
#include <clicknet/tcp.h>
#include <click/confparse.hh>
#include <click/error.hh>
#include <click/glue.hh>
#include <click/packet.hh>
#include <click/straccum.hh>
CLICK_DECLS
Spoofer::Spoofer()
{
}
Spoofer::~Spoofer()
{
}
//unsigned int saddr;
//unsigned int daddr;
int Spoofer::configure(Vector<String> &conf, ErrorHandler *errh){
//Vector<String> args;
//Spoofer* me = (Spoofer *) e;
click_ip iph0;
//unsigned int saddr, daddr;
if(cp_va_kparse(conf, this, errh,
"SRC",cpkP+cpkM,cpIPAddress, &iph0.ip_src,
"DST",cpkP+cpkM,cpIPAddress, &iph0.ip_dst,
cpEnd) < 0)
return -1;
else{
_iph = iph0;
return 0;
}
//Packet *p = me->simple_action();
//me->output(0).push(p);
//return 0;
}
Packet * Spoofer::simple_action(Packet *p){
if(p == NULL)
click_chatter("No PACKEEET");
if (p->has_network_header() == NULL)
click_chatter("No value in net header");
if(p->has_transport_header() == NULL)
click_chatter("No value in TCP header!");
struct click_ip *ip;
struct click_tcp *tcp;
WritablePacket *q = Packet::make(sizeof(*ip) + sizeof(*tcp));
if (q == 0) {
click_chatter("in TCPIPSend: cannot make packet!");
assert(0);
}
struct click_ip *iph ;//= (struct click_ip *) malloc(sizeof(struct click_ip));// = reinterpret_cast<click_ip *>(q->data());
iph = &_iph;
// memcpy((void *) iph, (void *) &_iph, sizeof(struct click_ip));
const click_tcp *tcph = p->tcp_header(); //&p.tcp_header
unsigned short sport;
unsigned short dport;
memset(q->data(), '\0', q->length());
ip = (struct click_ip *) q->data();
tcp = (struct click_tcp *) (ip + 1);
q->set_ip_header(ip, sizeof(click_ip));
// IP fields
ip->ip_v = htons(4);
ip->ip_hl = htons(5);
ip->ip_tos = htons(0);
ip->ip_len = htons(q->length());
ip->ip_id = htons(0);
ip->ip_off = htons(IP_DF);
ip->ip_ttl = htons(255);
ip->ip_p = IP_PROTO_TCP;
ip->ip_sum = 0;
memcpy((void *) &(ip->ip_src), (void *) &(iph->ip_src), 4);
memcpy((void *) &(ip->ip_dst), (void *) &(iph->ip_dst), 4);
ip->ip_sum = click_in_cksum((unsigned char *)ip, sizeof(click_ip));
if (tcph == NULL) {
click_chatter("Skipping non-TCP\n");
return p;
}
click_chatter("TCP!!!!!!!!!!!!!!!!!!!\n");
sport = tcph->th_dport;
dport = tcph->th_sport;
memcpy((void *) &(tcp->th_sport), (void *) &sport, sizeof(sport));
memcpy((void *) &(tcp->th_dport), (void *) &dport, sizeof(dport));
tcp->th_seq = tcph->th_ack;
tcp->th_ack = tcph->th_seq + htonl(1);
tcp->th_off = htons(5);
//tcp->th_flags = 0|1|0|0|0|0;
tcp->th_flags &= 0x10;
tcp->th_win = htons(32120);
tcp->th_sum = htons(0);
tcp->th_urp = htons(0);
// now calculate tcp header cksum
unsigned csum = click_in_cksum((unsigned char *)tcp, sizeof(click_tcp));
tcp->th_sum = click_in_cksum_pseudohdr(csum, ip, sizeof(click_tcp));
//output(0).push(q);
return q;
}
/*
void Spoofer::add_handlers(){
add_write_handler("send", configure, 0);
}
*/
CLICK_ENDDECLS
EXPORT_ELEMENT(Spoofer)
ELEMENT_MT_SAFE(Spoofer)
More information about the click
mailing list