⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfc2507d.cc

📁 COPE the first practical network coding scheme which is developped on click
💻 CC
字号:
/* * rfc2507c.{cc,hh} -- element compresses IP headers a la RFC 2507 * Robert Morris * * Copyright (c) 1999-2000 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 "rfc2507d.hh"#include <click/glue.hh>CLICK_DECLSRFC2507d::RFC2507d(){  add_input();  add_output();}RFC2507d::~RFC2507d(){}voidRFC2507d::decode(const u_char * &in, unsigned short &x){  x = ntohs(x);  if(in[0] != 0){    x += *in;    in++;  } else {    in++;    x += (*in << 8);    in++;    x += *in;    in++;  }  x = htons(x);}voidRFC2507d::decode(const u_char * &in, unsigned int &x){  x = ntohl(x);  if(in[0] != 0){    x += *in;    in++;  } else {    in++;    x += (*in << 8);    in++;    x += *in;    in++;  }  x = htonl(x);}Packet *RFC2507d::simple_action(Packet *p){  WritablePacket *q = 0;  if(p->length() < 2)    goto out;  if (p->data()[0] == PT_OTHER) {    q = Packet::make(p->length() - 1);    memcpy(q->data(), p->data() + 1, p->length() - 1);  } else if (p->data()[0] == PT_FULL_HEADER) {    click_chatter("2507d: got full header\n");    int cid = p->data()[1] & 0xff;    if(cid <= 0 || cid >= TCP_SPACE)      goto out;    struct tcpip *ctx = &_ccbs[cid]._context;    memcpy(&(ctx->_ip), p->data() + 2, sizeof(click_ip));    memcpy(&(ctx->_tcp), p->data() + 2 + sizeof(click_ip),           sizeof(struct click_tcp));    q = Packet::make(p->length() - 2);    memcpy(q->data(), p->data() + 2, p->length() - 2);  } else if (p->data()[0] == PT_COMPRESSED_TCP) {    int cid = p->data()[1] & 0xff;    if(cid <= 0 || cid >= TCP_SPACE)      goto out;    struct tcpip *ctx = &_ccbs[cid]._context;    int flags = p->data()[2];    memcpy(&(ctx->_tcp.th_sum), p->data() + 3, 2);    const u_char *in = p->data() + 5;    if(flags & (1 << 4)) /* P */      ctx->_tcp.th_flags |= TH_PUSH;    else      ctx->_tcp.th_flags &= ~TH_PUSH;    if(flags & 1){ /* U */      ctx->_tcp.th_flags |= TH_URG;      decode(in, ctx->_tcp.th_urp);    } else {      ctx->_tcp.th_flags &= ~TH_URG;    }    if(flags & (1 << 1)){ /* W */      decode(in, ctx->_tcp.th_win);    }    if(flags & (1 << 2)){ /* A */      decode(in, ctx->_tcp.th_ack);    }    if(flags & (1 << 3)){ /* S */      decode(in, ctx->_tcp.th_seq);    }    if(flags & (1 << 5)){ /* I */      decode(in, ctx->_ip.ip_id);    } else {      ctx->_ip.ip_id = htons(ntohs(ctx->_ip.ip_id) + 1);    }    int len = p->length() - (in - p->data());    len += sizeof(click_ip) + sizeof(struct click_tcp);    ctx->_ip.ip_len = htons(len);    ctx->_ip.ip_sum = 0;    ctx->_ip.ip_sum = click_in_cksum((unsigned char *) &(ctx->_ip), sizeof(click_ip));    q = Packet::make(len);    memcpy(q->data(), &(ctx->_ip), sizeof(click_ip));    memcpy(q->data() + sizeof(click_ip),           &(ctx->_tcp),           sizeof(struct click_tcp));    memcpy(q->data() + sizeof(click_ip) + sizeof(struct click_tcp),           in,           p->length() - (in - p->data()));  } else {    goto out;  } out:  if(q){    click_ip iph;    struct click_tcp tcph;    memcpy(&iph, q->data(), sizeof(iph));    memcpy(&tcph, q->data() + sizeof(click_ip), sizeof(tcph));    click_chatter("seq %d len %d",                (int)ntohl(tcph.th_seq),                q->length() - sizeof(tcph) - sizeof(iph));        {      char *p = new char[q->length()];      memcpy(p, q->data(), q->length());      // check IP checksum      click_ip *ipp = reinterpret_cast<click_ip *>(p);      int hlen = ipp->ip_hl << 2;      if(click_in_cksum((unsigned char *)ipp, hlen) != 0){        click_chatter(" ip cksum failed");      }      // check TCP checksum; include pseudoheader      int len = ntohs(ipp->ip_len);      // zero ip_v, ip_hl, ip_tos, ip_len, ip_off, ip_ttl      memset(ipp, '\0', 9);      ipp->ip_sum = htons(len - sizeof(click_ip));      if(click_in_cksum((unsigned char *)p, len) != 0){        click_chatter(" tcp cksum failed");      }            delete [] p;    }  }  if(q == 0)    click_chatter("RFC2507d: no q");  p->kill();  return(q);}CLICK_ENDDECLSEXPORT_ELEMENT(RFC2507d)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -