]>
Commit | Line | Data |
---|---|---|
6a885fd0 BP |
1 | /* |
2 | * Copyright (c) 2011 Nicira Networks. | |
3 | * | |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at: | |
7 | * | |
8 | * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | * See the License for the specific language governing permissions and | |
14 | * limitations under the License. | |
15 | */ | |
16 | ||
17 | #ifndef META_FLOW_H | |
18 | #define META_FLOW_H 1 | |
19 | ||
20 | #include <netinet/ip6.h> | |
21 | #include "flow.h" | |
22 | #include "packets.h" | |
23 | ||
24 | struct cls_rule; | |
25 | struct ds; | |
26 | ||
27 | /* The comment on each of these indicates the member in "union mf_value" used | |
28 | * to represent its value. */ | |
29 | enum mf_field_id { | |
30 | /* Metadata. */ | |
31 | MFF_TUN_ID, /* be64 */ | |
32 | MFF_IN_PORT, /* be16 */ | |
33 | ||
34 | #if FLOW_N_REGS > 0 | |
35 | MFF_REG0, /* be32 */ | |
36 | #endif | |
37 | #if FLOW_N_REGS > 1 | |
38 | MFF_REG1, /* be32 */ | |
39 | #endif | |
40 | #if FLOW_N_REGS > 2 | |
41 | MFF_REG2, /* be32 */ | |
42 | #endif | |
43 | #if FLOW_N_REGS > 3 | |
44 | MFF_REG3, /* be32 */ | |
45 | #endif | |
46 | #if FLOW_N_REGS > 4 | |
d2c0fed9 JP |
47 | MFF_REG4, /* be32 */ |
48 | #endif | |
49 | #if FLOW_N_REGS > 5 | |
6a885fd0 BP |
50 | #error |
51 | #endif | |
52 | ||
53 | /* L2. */ | |
54 | MFF_ETH_SRC, /* mac */ | |
55 | MFF_ETH_DST, /* mac */ | |
56 | MFF_ETH_TYPE, /* be16 */ | |
57 | ||
58 | MFF_VLAN_TCI, /* be16 */ | |
59 | MFF_VLAN_VID, /* be16 */ | |
60 | MFF_VLAN_PCP, /* u8 */ | |
61 | ||
62 | /* L3. */ | |
63 | MFF_IPV4_SRC, /* be32 */ | |
64 | MFF_IPV4_DST, /* be32 */ | |
65 | ||
66 | MFF_IPV6_SRC, /* ipv6 */ | |
67 | MFF_IPV6_DST, /* ipv6 */ | |
68 | ||
69 | MFF_IP_PROTO, /* u8 (used for IPv4 or IPv6) */ | |
70 | MFF_IP_TOS, /* u8 (used for IPv4 or IPv6) */ | |
7257b535 | 71 | MFF_IP_FRAG, /* u8 (used for IPv4 or IPv6) */ |
6a885fd0 BP |
72 | |
73 | MFF_ARP_OP, /* be16 */ | |
74 | MFF_ARP_SPA, /* be32 */ | |
75 | MFF_ARP_TPA, /* be32 */ | |
76 | MFF_ARP_SHA, /* mac */ | |
77 | MFF_ARP_THA, /* mac */ | |
78 | ||
79 | /* L4. */ | |
80 | MFF_TCP_SRC, /* be16 (used for IPv4 or IPv6) */ | |
81 | MFF_TCP_DST, /* be16 (used for IPv4 or IPv6) */ | |
82 | ||
83 | MFF_UDP_SRC, /* be16 (used for IPv4 or IPv6) */ | |
84 | MFF_UDP_DST, /* be16 (used for IPv4 or IPv6) */ | |
85 | ||
86 | MFF_ICMP_TYPE, /* u8 (used for IPv4 or IPv6) */ | |
87 | MFF_ICMP_CODE, /* u8 (used for IPv4 or IPv6) */ | |
88 | ||
89 | /* ICMPv6 Neighbor Discovery. */ | |
90 | MFF_ND_TARGET, /* ipv6 */ | |
91 | MFF_ND_SLL, /* mac */ | |
92 | MFF_ND_TLL, /* mac */ | |
93 | ||
94 | MFF_N_IDS | |
95 | }; | |
96 | ||
97 | /* Prerequisites for matching a field. | |
98 | * | |
99 | * A field may only be matched if the correct lower-level protocols are also | |
100 | * matched. For example, the TCP port may be matched only if the Ethernet type | |
101 | * matches ETH_TYPE_IP and the IP protocol matches IPPROTO_TCP. */ | |
102 | enum mf_prereqs { | |
103 | MFP_NONE, | |
104 | ||
105 | /* L2 requirements. */ | |
106 | MFP_ARP, | |
107 | MFP_IPV4, | |
108 | MFP_IPV6, | |
109 | MFP_IP_ANY, | |
110 | ||
111 | /* L2+L3 requirements. */ | |
112 | MFP_TCP, /* On IPv4 or IPv6. */ | |
113 | MFP_UDP, /* On IPv4 or IPv6. */ | |
114 | MFP_ICMPV6, | |
115 | MFP_ICMP_ANY, | |
116 | ||
117 | /* L2+L3+L4 requirements. */ | |
118 | MFP_ND, | |
119 | MFP_ND_SOLICIT, | |
120 | MFP_ND_ADVERT | |
121 | }; | |
122 | ||
123 | /* Forms of partial-field masking allowed for a field. | |
124 | * | |
125 | * Every field may be masked as a whole. */ | |
126 | enum mf_maskable { | |
127 | MFM_NONE, /* No sub-field masking. */ | |
128 | MFM_FULLY, /* Every bit is individually maskable. */ | |
129 | MFM_CIDR, /* Contiguous low-order bits may be masked. */ | |
130 | MFM_MCAST /* Byte 0, bit 0 is separately maskable. */ | |
131 | }; | |
132 | ||
133 | /* How to format or parse a field's value. */ | |
134 | enum mf_string { | |
135 | /* Integer formats. | |
136 | * | |
137 | * The particular MFS_* constant sets the output format. On input, either | |
138 | * decimal or hexadecimal (prefixed with 0x) is accepted. */ | |
139 | MFS_DECIMAL, | |
140 | MFS_HEXADECIMAL, | |
141 | ||
142 | /* Other formats. */ | |
143 | MFS_ETHERNET, | |
144 | MFS_IPV4, | |
145 | MFS_IPV6, | |
7257b535 BP |
146 | MFS_OFP_PORT, /* An OpenFlow port number or name. */ |
147 | MFS_FRAG /* no, yes, first, later, not_later */ | |
6a885fd0 BP |
148 | }; |
149 | ||
150 | struct mf_field { | |
151 | /* Identification. */ | |
152 | enum mf_field_id id; /* MFF_*. */ | |
153 | const char *name; /* Name of this field, e.g. "eth_type". */ | |
154 | const char *extra_name; /* Alternate name, e.g. "dl_type", or NULL. */ | |
155 | ||
156 | /* Size. | |
157 | * | |
158 | * Most fields have n_bytes * 8 == n_bits. There are only two exceptions | |
159 | * currently: "dl_vlan" is 2 bytes but only 12 bits, and "dl_vlan_pcp" is | |
160 | * 1 byte but only 3 bits. */ | |
161 | unsigned int n_bytes; /* Width of the field in bytes. */ | |
162 | unsigned int n_bits; /* Number of significant bits in field. */ | |
163 | ||
164 | /* Properties. */ | |
165 | enum mf_maskable maskable; | |
166 | flow_wildcards_t fww_bit; /* Either 0 or exactly one FWW_* bit. */ | |
167 | enum mf_string string; | |
168 | enum mf_prereqs prereqs; | |
169 | uint32_t nxm_header; /* An NXM_* constant (a few fields have 0). */ | |
170 | }; | |
171 | ||
172 | /* The representation of a field's value. */ | |
173 | union mf_value { | |
174 | uint8_t u8; | |
175 | ovs_be16 be16; | |
176 | ovs_be32 be32; | |
177 | ovs_be64 be64; | |
178 | uint8_t mac[ETH_ADDR_LEN]; | |
179 | struct in6_addr ipv6; | |
180 | }; | |
181 | ||
182 | /* Finding mf_fields. */ | |
183 | const struct mf_field *mf_from_id(enum mf_field_id); | |
184 | const struct mf_field *mf_from_name(const char *name); | |
185 | ||
186 | /* Inspecting wildcarded bits. */ | |
187 | bool mf_is_all_wild(const struct mf_field *, const struct flow_wildcards *); | |
188 | ||
189 | bool mf_is_mask_valid(const struct mf_field *, const union mf_value *mask); | |
190 | void mf_get_mask(const struct mf_field *, const struct flow_wildcards *, | |
191 | union mf_value *mask); | |
192 | ||
193 | /* Prerequisites. */ | |
194 | bool mf_are_prereqs_ok(const struct mf_field *, const struct flow *); | |
195 | void mf_force_prereqs(const struct mf_field *, struct cls_rule *); | |
196 | ||
197 | /* Field values. */ | |
198 | bool mf_is_value_valid(const struct mf_field *, const union mf_value *value); | |
199 | ||
200 | void mf_get_value(const struct mf_field *, const struct flow *, | |
201 | union mf_value *value); | |
202 | void mf_set_value(const struct mf_field *, const union mf_value *value, | |
203 | struct cls_rule *); | |
204 | ||
205 | void mf_get(const struct mf_field *, const struct cls_rule *, | |
206 | union mf_value *value, union mf_value *mask); | |
207 | void mf_set(const struct mf_field *, | |
208 | const union mf_value *value, const union mf_value *mask, | |
209 | struct cls_rule *); | |
210 | void mf_set_subfield(const struct mf_field *, uint64_t value, unsigned int ofs, | |
211 | unsigned int n_bits, struct cls_rule *); | |
212 | ||
213 | void mf_set_wild(const struct mf_field *, struct cls_rule *); | |
214 | ||
215 | void mf_random_value(const struct mf_field *, union mf_value *value); | |
216 | ||
217 | /* Parsing and formatting. */ | |
218 | char *mf_parse(const struct mf_field *, const char *, | |
219 | union mf_value *value, union mf_value *mask); | |
220 | char *mf_parse_value(const struct mf_field *, const char *, union mf_value *); | |
221 | void mf_format(const struct mf_field *, | |
222 | const union mf_value *value, const union mf_value *mask, | |
223 | struct ds *); | |
224 | ||
225 | #endif /* meta-flow.h */ |