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