#ifndef CLICK_DSR_H
#define CLICK_DSR_H
/* #include <netinet/in.h> */
CLICK_DECLS
struct click_dsr { // DSR options header -- exactly one per packet
unsigned char dsr_next_header; // original IP protocol field
unsigned char dsr_reserved;
u_int16_t dsr_len;
};
struct click_dsr_option { // common part of option headers, used for determining type
unsigned char dsr_type;
unsigned char dsr_len;
};
struct DSRHop {
in_addr _ip;
unsigned char _metric;
#define DSR_INVALID_HOP_METRIC 0xFF
#define DSR_INVALID_ROUTE_METRIC 9999
DSRHop(IPAddress i) : _ip(i), _metric(DSR_INVALID_HOP_METRIC) {}
DSRHop(IPAddress i, unsigned char c) : _ip(i), _metric(c) {}
IPAddress ip() const { return IPAddress(_ip); }
};
typedef Vector<DSRHop> DSRRoute;
struct click_dsr_rreq {
unsigned char dsr_type;
unsigned char dsr_len;
u_int16_t dsr_id;
in_addr target;
DSRHop addr[];
unsigned int num_addrs() const {
if ((dsr_len - 6) % sizeof(DSRHop) != 0) click_chatter("click_dsr_rreq::length() -- warning: odd length (%d %d)\n",
dsr_len, sizeof(DSRHop));
return ((dsr_len - 6)/sizeof(DSRHop));
}
unsigned int length() const { return (dsr_len + 2); }
char *next_option() const { return ((char *)this + length()); }
};
struct click_dsr_rrep {
unsigned char dsr_type;
unsigned char dsr_len;
unsigned char dsr_flags;
unsigned char dsr_pad; // for alignment; against the spec
// unsigned short dsr_id; // this doesn't exist in the spec
DSRHop addr[];
unsigned int num_addrs() const {
if ((dsr_len - 1) % sizeof(DSRHop) != 0) click_chatter("click_dsr_rrep::length() -- warning: odd length\n");
return ((dsr_len - 1)/sizeof(DSRHop)); // from the spec, sec 6.3
}
unsigned int length() const { return (dsr_len + 3); }
char *next_option() const { return ((char *)this + length()); }
};
struct click_dsr_rerr {
unsigned char dsr_type;
unsigned char dsr_len;
unsigned char dsr_error;
// #define DSR_RERR_FLAGS_SALVAGE_MASK 0x0F // 00001111
#define DSR_RERR_TYPE_NODE_UNREACHABLE 1
unsigned char dsr_flags;
in_addr dsr_err_src;
in_addr dsr_err_dst;
// type-specific information follows here
unsigned int length() const {
// if (dsr_error == DSR_RERR_TYPE_NODE_UNREACHABLE) return (dsr_len + 2 + 4);
// click_chatter("click_dsr_rerr::length() -- warning: unknown err type %x\n", dsr_error);
return (dsr_len + 2);
}
char *next_option() const { return ((char *)this + length()); }
};
// #define DSR_SR_FLAGS_FIRSTHOPEXT_MASK 0x8000 // 1000000000000000
// #define DSR_SR_FLAGS_LASTHOPEXT_MASK 0x4000 // 0100000000000000
// #define DSR_SR_FLAGS_SALVAGE_MASK 0x03C0 // 0000001111000000
// #define DSR_SR_FLAGS_SEGSLEFT_MASK 0x003F // 0000000000111111
struct click_dsr_source {
unsigned char dsr_type;
unsigned char dsr_len;
// u_int16_t dsr_flags;
unsigned char dsr_salvage;
unsigned char dsr_segsleft;
DSRHop addr[];
unsigned int num_addrs() const {
if ((dsr_len - 2) % sizeof(DSRHop) != 0) click_chatter("click_dsr_source::length() -- warning: odd length\n");
return ((dsr_len - 2) / sizeof(DSRHop));
}
unsigned int length() const { return (dsr_len + 2); }
char *next_option() const { return ((char *)this + length()); }
};
// constants the guy doesn't use
/* Constants used - need to check their values */
// static const int DSR_RREQ_RETRIES = 2;
// static const int DSR_NODE_TRAVERSAL_MS = 40;
// static const int DSR_NET_DIAMETER = 35;
// static const int DSR_NET_TRAVERSAL_MS = 3 * DSR_NODE_TRAVERSAL_MS * DSR_NET_DIAMETER / 2;
// static const int DSR_RREQ_START_TTL = 2;
// static const int DSR_RREQ_INCREMENT_TTL = 2;
// static const int DSR_RREQ_THRESHOLD_TTL = 7;
// static const int DSR_BROADCAST_RECORD_MS = 2 * DSR_NET_TRAVERSAL_MS;
#define DSR_TYPE_RREP 1
#define DSR_TYPE_RREQ 2
#define DSR_TYPE_RERR 3
#define DSR_TYPE_SOURCE_ROUTE 96
// #define DSR_TYPE_ACK 32
// #define DSR_TYPE_AREQ 160
#define IP_PROTO_DSR 200
#define DSR_SALVAGE_LIMIT 4
#define DSR_LAST_HOP_IP_ANNO(p) ((p)->user_anno_u(1))
#define SET_DSR_LAST_HOP_IP_ANNO(p, v) ((p)->set_user_anno_u(1, (v)))
#define DSR_LAST_HOP_ETH_ANNO1(p) ((p)->user_anno_us(9))
#define DSR_LAST_HOP_ETH_ANNO2(p) ((p)->user_anno_us(11))
#define DSR_LAST_HOP_ETH_ANNO3(p) ((p)->user_anno_us(13))
#define SET_DSR_LAST_HOP_ETH_ANNO1(p, v) ((p)->set_user_anno_us( 9, (v)))
#define SET_DSR_LAST_HOP_ETH_ANNO2(p, v) ((p)->set_user_anno_us(11, (v)))
#define SET_DSR_LAST_HOP_ETH_ANNO3(p, v) ((p)->set_user_anno_us(13, (v)))
CLICK_ENDDECLS
#endif
syntax highlighted by Code2HTML, v. 0.9.1