53
53
#ifndef OPENFLOW_12_H
54
54
#define OPENFLOW_12_H 1
56
#include "openflow/openflow-1.1.h"
56
#include <openflow/openflow-1.1.h>
58
58
/* Error type for experimenter error messages. */
59
59
#define OFPET12_EXPERIMENTER 0xffff
63
* The high order bit differentiate reserved classes from member classes.
64
* Classes 0x0000 to 0x7FFF are member classes, allocated by ONF.
65
* Classes 0x8000 to 0xFFFE are reserved classes, reserved for standardisation.
67
enum ofp12_oxm_class {
68
OFPXMC12_NXM_0 = 0x0000, /* Backward compatibility with NXM */
69
OFPXMC12_NXM_1 = 0x0001, /* Backward compatibility with NXM */
70
OFPXMC12_OPENFLOW_BASIC = 0x8000, /* Basic class for OpenFlow */
71
OFPXMC12_EXPERIMENTER = 0xffff, /* Experimenter class */
74
/* OXM Flow match field types for OpenFlow basic class. */
75
enum oxm12_ofb_match_fields {
76
OFPXMT12_OFB_IN_PORT, /* Switch input port. */
77
OFPXMT12_OFB_IN_PHY_PORT, /* Switch physical input port. */
78
OFPXMT12_OFB_METADATA, /* Metadata passed between tables. */
79
OFPXMT12_OFB_ETH_DST, /* Ethernet destination address. */
80
OFPXMT12_OFB_ETH_SRC, /* Ethernet source address. */
81
OFPXMT12_OFB_ETH_TYPE, /* Ethernet frame type. */
82
OFPXMT12_OFB_VLAN_VID, /* VLAN id. */
83
OFPXMT12_OFB_VLAN_PCP, /* VLAN priority. */
84
OFPXMT12_OFB_IP_DSCP, /* IP DSCP (6 bits in ToS field). */
85
OFPXMT12_OFB_IP_ECN, /* IP ECN (2 bits in ToS field). */
86
OFPXMT12_OFB_IP_PROTO, /* IP protocol. */
87
OFPXMT12_OFB_IPV4_SRC, /* IPv4 source address. */
88
OFPXMT12_OFB_IPV4_DST, /* IPv4 destination address. */
89
OFPXMT12_OFB_TCP_SRC, /* TCP source port. */
90
OFPXMT12_OFB_TCP_DST, /* TCP destination port. */
91
OFPXMT12_OFB_UDP_SRC, /* UDP source port. */
92
OFPXMT12_OFB_UDP_DST, /* UDP destination port. */
93
OFPXMT12_OFB_SCTP_SRC, /* SCTP source port. */
94
OFPXMT12_OFB_SCTP_DST, /* SCTP destination port. */
95
OFPXMT12_OFB_ICMPV4_TYPE, /* ICMP type. */
96
OFPXMT12_OFB_ICMPV4_CODE, /* ICMP code. */
97
OFPXMT12_OFB_ARP_OP, /* ARP opcode. */
98
OFPXMT12_OFB_ARP_SPA, /* ARP source IPv4 address. */
99
OFPXMT12_OFB_ARP_TPA, /* ARP target IPv4 address. */
100
OFPXMT12_OFB_ARP_SHA, /* ARP source hardware address. */
101
OFPXMT12_OFB_ARP_THA, /* ARP target hardware address. */
102
OFPXMT12_OFB_IPV6_SRC, /* IPv6 source address. */
103
OFPXMT12_OFB_IPV6_DST, /* IPv6 destination address. */
104
OFPXMT12_OFB_IPV6_FLABEL, /* IPv6 Flow Label */
105
OFPXMT12_OFB_ICMPV6_TYPE, /* ICMPv6 type. */
106
OFPXMT12_OFB_ICMPV6_CODE, /* ICMPv6 code. */
107
OFPXMT12_OFB_IPV6_ND_TARGET, /* Target address for ND. */
108
OFPXMT12_OFB_IPV6_ND_SLL, /* Source link-layer for ND. */
109
OFPXMT12_OFB_IPV6_ND_TLL, /* Target link-layer for ND. */
110
OFPXMT12_OFB_MPLS_LABEL, /* MPLS label. */
111
OFPXMT12_OFB_MPLS_TC, /* MPLS TC. */
112
#define OFPXMT12_MASK ((1ULL << (OFPXMT12_OFB_MPLS_TC + 1)) - 1)
114
/* Following added in OpenFlow 1.3 */
115
OFPXMT13_OFB_MPLS_BOS, /* MPLS BoS bit. */
116
OFPXMT13_OFB_PBB_ISID, /* PBB I-SID. */
117
OFPXMT13_OFB_TUNNEL_ID, /* Logical Port Metadata */
118
OFPXMT13_OFB_IPV6_EXTHDR, /* IPv6 Extension Header pseudo-field */
119
#define OFPXMT13_MASK ((1ULL << (OFPXMT13_OFB_IPV6_EXTHDR + 1)) - 1)
121
/* Following added in OpenFlow 1.4. */
122
OFPXMT14_OFB_PBB_UCA = 41, /* PBB UCA header field. */
123
#define OFPXMT14_MASK (1ULL << OFPXMT14_OFB_PBB_UCA)
125
/* Following added in OpenFlow 1.5. */
126
OFPXMT15_OFB_TCP_FLAGS = 42, /* TCP flags. */
127
#define OFPXMT15_MASK (1ULL << OFPXMT15_OFB_TCP_FLAGS)
130
/* OXM implementation makes use of NXM as they are the same format
131
* with different field definitions
134
#define OXM_HEADER(FIELD, LENGTH) \
135
NXM_HEADER(OFPXMC12_OPENFLOW_BASIC, FIELD, LENGTH)
136
#define OXM_HEADER_W(FIELD, LENGTH) \
137
NXM_HEADER_W(OFPXMC12_OPENFLOW_BASIC, FIELD, LENGTH)
139
#define IS_OXM_HEADER(header) (NXM_VENDOR(header) == OFPXMC12_OPENFLOW_BASIC)
141
#define OXM_OF_IN_PORT OXM_HEADER (OFPXMT12_OFB_IN_PORT, 4)
142
#define OXM_OF_IN_PHY_PORT OXM_HEADER (OFPXMT12_OFB_IN_PHY_PORT, 4)
143
#define OXM_OF_METADATA OXM_HEADER (OFPXMT12_OFB_METADATA, 8)
144
#define OXM_OF_ETH_DST OXM_HEADER (OFPXMT12_OFB_ETH_DST, 6)
145
#define OXM_OF_ETH_DST_W OXM_HEADER_W (OFPXMT12_OFB_ETH_DST, 6)
146
#define OXM_OF_ETH_SRC OXM_HEADER (OFPXMT12_OFB_ETH_SRC, 6)
147
#define OXM_OF_ETH_SRC_W OXM_HEADER_W (OFPXMT12_OFB_ETH_SRC, 6)
148
#define OXM_OF_ETH_TYPE OXM_HEADER (OFPXMT12_OFB_ETH_TYPE, 2)
149
#define OXM_OF_VLAN_VID OXM_HEADER (OFPXMT12_OFB_VLAN_VID, 2)
150
#define OXM_OF_VLAN_VID_W OXM_HEADER_W (OFPXMT12_OFB_VLAN_VID, 2)
151
#define OXM_OF_VLAN_PCP OXM_HEADER (OFPXMT12_OFB_VLAN_PCP, 1)
152
#define OXM_OF_IP_DSCP OXM_HEADER (OFPXMT12_OFB_IP_DSCP, 1)
153
#define OXM_OF_IP_ECN OXM_HEADER (OFPXMT12_OFB_IP_ECN, 1)
154
#define OXM_OF_IP_PROTO OXM_HEADER (OFPXMT12_OFB_IP_PROTO, 1)
155
#define OXM_OF_IPV4_SRC OXM_HEADER (OFPXMT12_OFB_IPV4_SRC, 4)
156
#define OXM_OF_IPV4_SRC_W OXM_HEADER_W (OFPXMT12_OFB_IPV4_SRC, 4)
157
#define OXM_OF_IPV4_DST OXM_HEADER (OFPXMT12_OFB_IPV4_DST, 4)
158
#define OXM_OF_IPV4_DST_W OXM_HEADER_W (OFPXMT12_OFB_IPV4_DST, 4)
159
#define OXM_OF_TCP_SRC OXM_HEADER (OFPXMT12_OFB_TCP_SRC, 2)
160
#define OXM_OF_TCP_DST OXM_HEADER (OFPXMT12_OFB_TCP_DST, 2)
161
#define OXM_OF_UDP_SRC OXM_HEADER (OFPXMT12_OFB_UDP_SRC, 2)
162
#define OXM_OF_UDP_DST OXM_HEADER (OFPXMT12_OFB_UDP_DST, 2)
163
#define OXM_OF_SCTP_SRC OXM_HEADER (OFPXMT12_OFB_SCTP_SRC, 2)
164
#define OXM_OF_SCTP_DST OXM_HEADER (OFPXMT12_OFB_SCTP_DST, 2)
165
#define OXM_OF_ICMPV4_TYPE OXM_HEADER (OFPXMT12_OFB_ICMPV4_TYPE, 1)
166
#define OXM_OF_ICMPV4_CODE OXM_HEADER (OFPXMT12_OFB_ICMPV4_CODE, 1)
167
#define OXM_OF_ARP_OP OXM_HEADER (OFPXMT12_OFB_ARP_OP, 2)
168
#define OXM_OF_ARP_SPA OXM_HEADER (OFPXMT12_OFB_ARP_SPA, 4)
169
#define OXM_OF_ARP_SPA_W OXM_HEADER_W (OFPXMT12_OFB_ARP_SPA, 4)
170
#define OXM_OF_ARP_TPA OXM_HEADER (OFPXMT12_OFB_ARP_TPA, 4)
171
#define OXM_OF_ARP_TPA_W OXM_HEADER_W (OFPXMT12_OFB_ARP_TPA, 4)
172
#define OXM_OF_ARP_SHA OXM_HEADER (OFPXMT12_OFB_ARP_SHA, 6)
173
#define OXM_OF_ARP_SHA_W OXM_HEADER_W (OFPXMT12_OFB_ARP_SHA, 6)
174
#define OXM_OF_ARP_THA OXM_HEADER (OFPXMT12_OFB_ARP_THA, 6)
175
#define OXM_OF_ARP_THA_W OXM_HEADER_W (OFPXMT12_OFB_ARP_THA, 6)
176
#define OXM_OF_IPV6_SRC OXM_HEADER (OFPXMT12_OFB_IPV6_SRC, 16)
177
#define OXM_OF_IPV6_SRC_W OXM_HEADER_W (OFPXMT12_OFB_IPV6_SRC, 16)
178
#define OXM_OF_IPV6_DST OXM_HEADER (OFPXMT12_OFB_IPV6_DST, 16)
179
#define OXM_OF_IPV6_DST_W OXM_HEADER_W (OFPXMT12_OFB_IPV6_DST, 16)
180
#define OXM_OF_IPV6_FLABEL OXM_HEADER (OFPXMT12_OFB_IPV6_FLABEL, 4)
181
#define OXM_OF_IPV6_FLABEL_W OXM_HEADER_W (OFPXMT12_OFB_IPV6_FLABEL, 4)
182
#define OXM_OF_ICMPV6_TYPE OXM_HEADER (OFPXMT12_OFB_ICMPV6_TYPE, 1)
183
#define OXM_OF_ICMPV6_CODE OXM_HEADER (OFPXMT12_OFB_ICMPV6_CODE, 1)
184
#define OXM_OF_IPV6_ND_TARGET OXM_HEADER (OFPXMT12_OFB_IPV6_ND_TARGET, 16)
185
#define OXM_OF_IPV6_ND_SLL OXM_HEADER (OFPXMT12_OFB_IPV6_ND_SLL, 6)
186
#define OXM_OF_IPV6_ND_TLL OXM_HEADER (OFPXMT12_OFB_IPV6_ND_TLL, 6)
187
#define OXM_OF_MPLS_LABEL OXM_HEADER (OFPXMT12_OFB_MPLS_LABEL, 4)
188
#define OXM_OF_MPLS_TC OXM_HEADER (OFPXMT12_OFB_MPLS_TC, 1)
189
#define OXM_OF_MPLS_BOS OXM_HEADER (OFPXMT13_OFB_MPLS_BOS, 1)
190
#define OXM_OF_PBB_ISID OXM_HEADER (OFPXMT12_OFB_PBB_ISID, 3)
191
#define OXM_OF_PBB_ISID_W OXM_HEADER_W (OFPXMT12_OFB_PBB_ISID, 3)
192
#define OXM_OF_TUNNEL_ID OXM_HEADER (OFPXMT13_OFB_TUNNEL_ID, 8)
193
#define OXM_OF_TUNNEL_ID_W OXM_HEADER_W (OFPXMT13_OFB_TUNNEL_ID, 8)
194
#define OXM_OF_IPV6_EXTHDR OXM_HEADER (OFPXMT13_OFB_IPV6_EXTHDR, 2)
195
#define OXM_OF_IPV6_EXTHDR_W OXM_HEADER_W (OFPXMT13_OFB_IPV6_EXTHDR, 2)
196
#define OXM_OF_PBB_UCA OXM_HEADER (OFPXMT14_OFB_PBB_UCA, 1)
197
#define OXM_OF_TCP_FLAGS OXM_HEADER (OFPXMT15_OFB_TCP_FLAGS, 2)
198
#define OXM_OF_TCP_FLAGS_W OXM_HEADER_W (OFPXMT15_OFB_TCP_FLAGS, 2)
200
61
/* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
201
62
* special conditions.