[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