// -*- mode: c++; c-basic-offset: 4 -*-
#ifndef CLICK_IPSUMDUMPINFO_HH
#define CLICK_IPSUMDUMPINFO_HH
#include <click/string.hh>
#include <click/straccum.hh>
class Packet;
struct click_ip;
struct click_udp;
struct click_tcp;
CLICK_DECLS
namespace IPSummaryDump {
enum { MAJOR_VERSION = 1, MINOR_VERSION = 2 };
// MINOR_VERSION 0 has W_IP_FRAGOFF fields in multiples of 8 bytes.
// MINOR_VERSION 1 uses 'W' for TCP flag CWR (now we use 'C'), and often
// uses ':' in sack blocks.
struct PacketDesc {
Packet* p;
const click_ip* iph;
const click_udp* udph;
const click_tcp* tcph;
union {
uint32_t v;
const uint8_t *vptr;
};
union {
uint32_t v2;
const uint8_t *end_vptr;
};
StringAccum* sa;
StringAccum* bad_sa;
bool careful_trunc;
bool force_extra_length;
inline PacketDesc(Packet*, StringAccum* sa, StringAccum* bad_sa, bool careful_trunc, bool force_extra_length);
void clear_values() { v = v2 = 0; }
};
struct Field {
const char* name;
int thunk;
void (*prepare)(PacketDesc&);
bool (*extract)(PacketDesc&, int);
void (*outa)(const PacketDesc&, int);
void (*outb)(const PacketDesc&, bool ok, int);
const uint8_t *(*inb)(PacketDesc&, const uint8_t*, const uint8_t*, int);
Field* synonym;
Field* next;
int binary_size() const;
};
extern const Field null_field;
const Field* find_field(const String&, bool likely_synonyms = true);
int register_unparser(const char* name, int thunk, void (*prepare)(PacketDesc&),
bool (*extract)(PacketDesc&, int),
void (*outa)(const PacketDesc&, int),
void (*outb)(const PacketDesc&, bool, int),
const uint8_t *(*inb)(PacketDesc&, const uint8_t*, const uint8_t*, int) = 0);
int register_synonym(const char* name, const char* synonym);
void static_cleanup();
void num_outa(const PacketDesc&, int);
enum { B_TYPEMASK = 0x70000000,
B_0 = 0x00000000,
B_1 = 0x10000000,
B_2 = 0x20000000,
B_4 = 0x30000000,
B_8 = 0x40000000,
B_4NET = 0x50000000,
B_SPECIAL = 0x60000000,
B_NOTALLOWED = 0x70000000 };
void outb(const PacketDesc&, bool ok, int);
const uint8_t *inb(PacketDesc&, const uint8_t*, const uint8_t*, int);
enum { MISSING_IP = 0,
MISSING_IP_TRANSPORT = 1 };
bool field_missing(const PacketDesc&, int what, const char* header_name, int l);
// particular parsers
void ip_prepare(PacketDesc&);
void anno_register_unparsers();
void ip_register_unparsers();
void tcp_register_unparsers();
void udp_register_unparsers();
enum { DO_IPOPT_PADDING = 1,
DO_IPOPT_ROUTE = 2,
DO_IPOPT_TS = 4,
DO_IPOPT_UNKNOWN = 32,
DO_IPOPT_ALL = 0xFFFFFFFFU,
DO_IPOPT_ALL_NOPAD = 0xFFFFFFFEU };
void unparse_ip_opt(StringAccum&, const uint8_t*, int olen, int mask);
void unparse_ip_opt(StringAccum&, const click_ip*, int mask);
void unparse_ip_opt_binary(StringAccum&, const uint8_t*, int olen, int mask);
void unparse_ip_opt_binary(StringAccum&, const click_ip*, int mask);
extern const char tcp_flags_word[];
extern const uint8_t tcp_flag_mapping[256];
enum { DO_TCPOPT_PADDING = 1,
DO_TCPOPT_MSS = 2,
DO_TCPOPT_WSCALE = 4,
DO_TCPOPT_SACK = 8,
DO_TCPOPT_TIMESTAMP = 16,
DO_TCPOPT_UNKNOWN = 32,
DO_TCPOPT_ALL = 0xFFFFFFFFU,
DO_TCPOPT_ALL_NOPAD = 0xFFFFFFFEU,
DO_TCPOPT_NTALL = 0xFFFFFFEEU };
void unparse_tcp_opt(StringAccum&, const uint8_t*, int olen, int mask);
void unparse_tcp_opt(StringAccum&, const click_tcp*, int mask);
void unparse_tcp_opt_binary(StringAccum&, const uint8_t*, int olen, int mask);
void unparse_tcp_opt_binary(StringAccum&, const click_tcp*, int mask);
inline PacketDesc::PacketDesc(Packet* p_, StringAccum* sa_, StringAccum* bad_sa_, bool careful_trunc_, bool force_extra_length_)
: p(p_), iph(0), udph(0), tcph(0), sa(sa_), bad_sa(bad_sa_),
careful_trunc(careful_trunc_), force_extra_length(force_extra_length_)
{
}
}
class IPSummaryDumpInfo { public:
enum Content {
W_NONE, W_TIMESTAMP, W_TIMESTAMP_SEC, W_TIMESTAMP_USEC, W_IP_SRC,
W_IP_DST, W_IP_LEN, W_IP_PROTO, W_IP_ID, W_SPORT,
W_DPORT, W_TCP_SEQ, W_TCP_ACK, W_TCP_FLAGS, W_PAYLOAD_LEN,
W_COUNT, W_IP_FRAG, W_IP_FRAGOFF, W_PAYLOAD, W_LINK,
W_AGGREGATE, W_TCP_SACK, W_TCP_OPT, W_TCP_NTOPT, W_FIRST_TIMESTAMP,
W_TCP_WINDOW, W_IP_OPT, W_IP_TOS, W_IP_TTL, W_TIMESTAMP_USEC1,
W_IP_CAPTURE_LEN, W_TCP_URP, W_NTIMESTAMP, W_FIRST_NTIMESTAMP, W_LAST
};
static int parse_content(const String &);
static int content_binary_size(int);
};
CLICK_ENDDECLS
#endif
syntax highlighted by Code2HTML, v. 0.9.1