1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 """DNS Message Flags."""
19
20
21
22
23 QR = 0x8000
24
25 AA = 0x0400
26
27 TC = 0x0200
28
29 RD = 0x0100
30
31 RA = 0x0080
32
33 AD = 0x0020
34
35 CD = 0x0010
36
37
38
39
40 DO = 0x8000
41
42 _by_text = {
43 'QR': QR,
44 'AA': AA,
45 'TC': TC,
46 'RD': RD,
47 'RA': RA,
48 'AD': AD,
49 'CD': CD
50 }
51
52 _edns_by_text = {
53 'DO': DO
54 }
55
56
57
58
59
60
61 _by_value = {y: x for x, y in _by_text.items()}
62
63 _edns_by_value = {y: x for x, y in _edns_by_text.items()}
64
65
71
72 _flags_order = _order_flags(_by_value)
73
74 _edns_flags_order = _order_flags(_edns_by_value)
75
76
77 -def _from_text(text, table):
78 flags = 0
79 tokens = text.split()
80 for t in tokens:
81 flags = flags | table[t.upper()]
82 return flags
83
84
85 -def _to_text(flags, table, order):
86 text_flags = []
87 for k, v in order:
88 if flags & k != 0:
89 text_flags.append(v)
90 return ' '.join(text_flags)
91
92
94 """Convert a space-separated list of flag text values into a flags
95 value.
96
97 Returns an ``int``
98 """
99
100 return _from_text(text, _by_text)
101
102
104 """Convert a flags value into a space-separated list of flag text
105 values.
106
107 Returns a ``text``.
108 """
109
110 return _to_text(flags, _by_value, _flags_order)
111
112
113 -def edns_from_text(text):
114 """Convert a space-separated list of EDNS flag text values into a EDNS
115 flags value.
116
117 Returns an ``int``
118 """
119
120 return _from_text(text, _edns_by_text)
121
122
123 -def edns_to_text(flags):
124 """Convert an EDNS flags value into a space-separated list of EDNS flag
125 text values.
126
127 Returns a ``text``.
128 """
129
130 return _to_text(flags, _edns_by_value, _edns_flags_order)
131