Wireshark-dev: [Wireshark-dev] roofnet v1
From: Nicola Arnoldi <nicola.arnoldi@xxxxxxxxxxxx>
Date: Tue, 09 Jan 2007 10:55:06 +0100
Hi everybody. The great work Sebastien did about Roofnet dissectors was related to Version 2, which is still far from stable. It should be implemented the V 1 as well, which has some differences between V2. I attach the c++ header, hoping it would be sufficient for you to modify the dissector accordingly. Note that ETHTYPES, which in V2 all started with a 6 (6xx) now start with number 9. (9xx) The message I receive when I try to decode V1 datagrams with the old dissector is something like. Bogus IP header, more payload than told by roofnet...and others. Bye. Nicola
#ifndef CLICK_SRPAKCET_HH
#define CLICK_SRPAKCET_HH
#include <click/ipaddress.hh>
#include <elements/wifi/path.hh>
CLICK_DECLS
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
enum SRCRPacketType { PT_QUERY = 0x01,
PT_REPLY = 0x02,
PT_TOP5_RESULT = 0x03,
PT_DATA = 0x04,
PT_GATEWAY = 0x08
};
enum SRCRPacketFlags {
FLAG_ERROR = (1<<0),
FLAG_UPDATE = (1<<1),
FLAG_TOP5_REQUEST_RESULT = (1<<2),
FLAG_TOP5_BEST_ROUTE = (1<<3),
FLAG_SCHEDULE = (1<<4),
FLAG_SCHEDULE_TOKEN = (1<<5),
FLAG_SCHEDULE_FAKE = (1<<6),
FLAG_ECN = (1<<7)
};
static const uint8_t _sr_version = 0x0b;
// Packet format.
CLICK_SIZE_PACKED_STRUCTURE(
struct srpacket {,
uint8_t _version; /* see _srcr_version */
uint8_t _type; /* see enum SRCRPacketType */
uint8_t _nlinks;
uint8_t _next; // Index of next node who should process this packet.
uint16_t _ttl;
uint16_t _cksum;
uint16_t _flags;
uint16_t _dlen;
/* PT_QUERY
* _qdst is used for the query destination in control packets
* and a extra 32 bit seq number in data packets
*/
uint32_t _qdst;
uint32_t _seq; // seq number
uint32_t _seq2; // another seq number
/* uin32_t ip[_nlinks] */
/* uin32_t metrics[_nlinks] */
/* ip */
/* fwd */
/* rev */
/* seq */
/* ip */
uint32_t _random_from;
uint32_t _random_fwd_metric;
uint32_t _random_rev_metric;
uint32_t _random_seq;
uint16_t _random_age;
uint32_t _random_to;
void set_random_from(IPAddress ip) {
_random_from = ip;
}
void set_random_to(IPAddress ip) {
_random_to = ip;
}
void set_random_fwd_metric(uint32_t m) {
_random_fwd_metric = m;
}
void set_random_rev_metric(uint32_t m) {
_random_rev_metric = m;
}
void set_random_seq(uint32_t s) {
_random_seq = s;
}
void set_random_age(uint32_t s) {
_random_age = s;
}
IPAddress get_random_from() {
return _random_from;
}
IPAddress get_random_to() {
return _random_to;
}
uint32_t get_random_fwd_metric() {
return _random_fwd_metric;
}
uint32_t get_random_rev_metric() {
return _random_rev_metric;
}
uint32_t get_random_seq() {
return _random_seq;
}
uint32_t get_random_age() {
return _random_age;
}
void set_link(int link,
IPAddress a, IPAddress b,
uint32_t fwd, uint32_t rev,
uint32_t seq,
uint32_t age) {
uint32_t *ndx = (uint32_t *) (this+1);
ndx += link * 5;
ndx[0] = a;
ndx[1] = fwd;
ndx[2] = rev;
ndx[3] = seq;
ndx[4] = age;
ndx[5] = b;
}
uint32_t get_link_fwd(int link) {
uint32_t *ndx = (uint32_t *) (this+1);
ndx += link * 5;
return ndx[1];
}
uint32_t get_link_rev(int link) {
uint32_t *ndx = (uint32_t *) (this+1);
ndx += link * 5;
return ndx[2];
}
uint32_t get_link_seq(int link) {
uint32_t *ndx = (uint32_t *) (this+1);
ndx += link * 5;
return ndx[3];
}
uint32_t get_link_age(int link) {
uint32_t *ndx = (uint32_t *) (this+1);
ndx += link * 5;
return ndx[4];
}
IPAddress get_link_node(int link) {
uint32_t *ndx = (uint32_t *) (this+1);
ndx += link * 5;
return ndx[0];
}
void set_link_node(int link, IPAddress ip) {
uint32_t *ndx = (uint32_t *) (this+1);
ndx += link * 5;
ndx[0] = ip;
}
// How long should the packet be?
size_t hlen_wo_data() const { return len_wo_data(_nlinks); }
size_t hlen_with_data() const { return len_with_data(_nlinks, ntohs(_dlen)); }
static size_t len_wo_data(int nlinks) {
return sizeof(struct srpacket) +
sizeof(uint32_t) +
(nlinks) * sizeof(uint32_t) * 5;
}
static size_t len_with_data(int nlinks, int dlen) {
return len_wo_data(nlinks) + dlen;
}
int num_links() {
return _nlinks;
}
int next() {
return _next;
}
Path get_path() {
Path p;
for (int x = 0; x <= num_links(); x++) {
p.push_back(get_link_node(x));
}
return p;
}
void set_data_seq(uint32_t n) {
_qdst = htonl(n);
}
uint32_t data_seq() {
return ntohl(_qdst);
}
void set_seq(uint32_t n) {
_seq = htonl(n);
}
uint32_t seq() {
return ntohl(_seq);
}
void set_seq2(uint32_t n) {
_seq2 = htonl(n);
}
uint32_t seq2() {
return ntohl(_seq2);
}
void set_next(uint8_t n) {
_next = n;
}
void set_num_links(uint8_t n) {
_nlinks = n;
}
void set_data_len(uint16_t len) {
_dlen = htons(len);
}
uint16_t data_len() {
return ntohs(_dlen);
}
void set_flag(uint16_t f) {
uint16_t flags = ntohs(_flags);
_flags = htons(flags | f);
}
bool flag(int f) {
int x = ntohs(_flags);
return x & f;
}
void unset_flag(uint16_t f) {
uint16_t flags = ntohs(_flags);
_flags = htons(flags & !f);
}
/* remember that if you call this you must have set the number of links in this packet! */
u_char *data() { return (((u_char *)this) + len_wo_data(num_links())); }
void set_checksum() {
unsigned int tlen = 0;
if (_type & PT_DATA) {
tlen = hlen_with_data();
} else {
tlen = hlen_wo_data();
}
_cksum = 0;
_cksum = click_in_cksum((unsigned char *) this, tlen);
}
});
#ifndef sr_assert
#define sr_assert(e) ((e) ? (void) 0 : sr_assert_(__FILE__, __LINE__, #e))
#endif /* sr_assert */
inline void
sr_assert_(const char *file, int line, const char *expr)
{
click_chatter("assertion \"%s\" FAILED: file %s, line %d",
expr, file, line);
#ifdef CLICK_USERLEVEL
abort();
#endif
}
CLICK_ENDDECLS
#endif /* CLICK_SRPACKET_HH */
- Follow-Ups:
- Re: [Wireshark-dev] roofnet v1
- From: Sebastien Tandel
- Re: [Wireshark-dev] roofnet v1
- Prev by Date: Re: [Wireshark-dev] text2pcap help needed
- Next by Date: Re: [Wireshark-dev] roofnet v1
- Previous by thread: Re: [Wireshark-dev] text2pcap help needed
- Next by thread: Re: [Wireshark-dev] roofnet v1
- Index(es):