1 #ifndef CLICK_IPFIELDINFO_HH
2 #define CLICK_IPFIELDINFO_HH
3 #include <click/nameinfo.hh>
4 #include <click/element.hh>
5 CLICK_DECLS
6 
7 class IPField { public:
8 
IPField()9     IPField()			: _val(-1) { }
IPField(int32_t f)10     IPField(int32_t f)		: _val(f) { }
11     IPField(int proto, int bit_offset, int bit_length);
12 
ok() const13     inline bool ok() const	{ return _val >= 0; }
value() const14     inline int32_t value() const { return _val; }
15 
proto() const16     inline int proto() const	{ return (_val & PROTO_MASK) >> PROTO_SHIFT; }
17 
18     inline int bit_offset() const;
19     inline int bit_length() const;
20 
21     inline int byte_offset() const;
22     inline int byte_length() const;
23 
24     enum {
25 	PROTO_SHIFT = 20,
26 	MAX_PROTO = 0x1FF,
27 	PROTO_MASK = MAX_PROTO << PROTO_SHIFT,
28 
29 	OFFSET_SHIFT = 6,
30 	MAX_OFFSET = 0x1FFF,
31 	OFFSET_MASK = MAX_OFFSET << OFFSET_SHIFT,
32 
33 	LENGTH_SHIFT = 0,
34 	MAX_LENGTH = 0x3F,
35 	LENGTH_MASK = MAX_LENGTH << LENGTH_SHIFT,
36 
37 	BYTES = 0x00080000,
38 	MARKER = 0x40000000
39     };
40 
41     enum {
42 	F_IP_TOS = (8 << OFFSET_SHIFT) | (7 << LENGTH_SHIFT),
43 	F_ICMP_TYPE = (IP_PROTO_ICMP << PROTO_SHIFT) | (7 << LENGTH_SHIFT)
44     };
45 
46     static const char *parse(const char *begin, const char *end, int proto, IPField *result, ErrorHandler *errh, Element *elt = 0);
47     String unparse(Element *elt = 0, bool tcpdump_rules = false);
48 
49   private:
50 
51     int32_t _val;
52 
53 };
54 
55 class IPFieldInfo : public Element { public:
56 
IPFieldInfo()57     IPFieldInfo()			{ }
58 
class_name() const59     const char *class_name() const	{ return "IPFieldInfo"; }
60 
61     static void static_initialize();
62     static void static_cleanup();
63 
64 };
65 
66 
67 inline int
bit_offset() const68 IPField::bit_offset() const
69 {
70     int v = (_val & OFFSET_MASK) >> OFFSET_SHIFT;
71     return (_val & BYTES ? v << 3 : v);
72 }
73 
74 inline int
byte_offset() const75 IPField::byte_offset() const
76 {
77     int v = (_val & OFFSET_MASK) >> OFFSET_SHIFT;
78     return (_val & BYTES ? v : v >> 3);
79 }
80 
81 inline int
bit_length() const82 IPField::bit_length() const
83 {
84     int l = ((_val & LENGTH_MASK) >> LENGTH_SHIFT) + 1;
85     return (_val & BYTES ? l << 3 : l);
86 }
87 
88 inline int
byte_length() const89 IPField::byte_length() const
90 {
91     int l = ((_val & LENGTH_MASK) >> LENGTH_SHIFT) + 1;
92     return (_val & BYTES ? l : l >> 3);
93 }
94 
95 CLICK_ENDDECLS
96 #endif
97