git://git.onelab.eu
/
sliver-openvswitch.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ofp-util: Move ofputil_check_output_port() to ofp-actions, rename.
[sliver-openvswitch.git]
/
lib
/
meta-flow.h
diff --git
a/lib/meta-flow.h
b/lib/meta-flow.h
index
a3f6701
..
c2b0bbc
100644
(file)
--- a/
lib/meta-flow.h
+++ b/
lib/meta-flow.h
@@
-24,13
+24,14
@@
#include "ofp-errors.h"
#include "ofp-util.h"
#include "packets.h"
#include "ofp-errors.h"
#include "ofp-util.h"
#include "packets.h"
+#include "util.h"
struct ds;
struct match;
/* The comment on each of these indicates the member in "union mf_value" used
* to represent its value. */
struct ds;
struct match;
/* The comment on each of these indicates the member in "union mf_value" used
* to represent its value. */
-enum mf_field_id {
+enum
OVS_PACKED_ENUM
mf_field_id {
/* Metadata. */
MFF_TUN_ID, /* be64 */
MFF_TUN_SRC, /* be32 */
/* Metadata. */
MFF_TUN_ID, /* be64 */
MFF_TUN_SRC, /* be32 */
@@
-118,6
+119,8
@@
enum mf_field_id {
/* L4. */
MFF_TCP_SRC, /* be16 (used for IPv4 or IPv6) */
MFF_TCP_DST, /* be16 (used for IPv4 or IPv6) */
/* L4. */
MFF_TCP_SRC, /* be16 (used for IPv4 or IPv6) */
MFF_TCP_DST, /* be16 (used for IPv4 or IPv6) */
+ MFF_TCP_FLAGS, /* be16, 12 bits (4 MSB zeroed,
+ * used for IPv4 or IPv6) */
MFF_UDP_SRC, /* be16 (used for IPv4 or IPv6) */
MFF_UDP_DST, /* be16 (used for IPv4 or IPv6) */
MFF_UDP_SRC, /* be16 (used for IPv4 or IPv6) */
MFF_UDP_DST, /* be16 (used for IPv4 or IPv6) */
@@
-178,7
+181,7
@@
enum mf_field_id {
* A field may only be matched if the correct lower-level protocols are also
* matched. For example, the TCP port may be matched only if the Ethernet type
* matches ETH_TYPE_IP and the IP protocol matches IPPROTO_TCP. */
* A field may only be matched if the correct lower-level protocols are also
* matched. For example, the TCP port may be matched only if the Ethernet type
* matches ETH_TYPE_IP and the IP protocol matches IPPROTO_TCP. */
-enum mf_prereqs {
+enum
OVS_PACKED_ENUM
mf_prereqs {
MFP_NONE,
/* L2 requirements. */
MFP_NONE,
/* L2 requirements. */
@@
-207,13
+210,13
@@
enum mf_prereqs {
/* Forms of partial-field masking allowed for a field.
*
* Every field may be masked as a whole. */
/* Forms of partial-field masking allowed for a field.
*
* Every field may be masked as a whole. */
-enum mf_maskable {
+enum
OVS_PACKED_ENUM
mf_maskable {
MFM_NONE, /* No sub-field masking. */
MFM_FULLY, /* Every bit is individually maskable. */
};
/* How to format or parse a field's value. */
MFM_NONE, /* No sub-field masking. */
MFM_FULLY, /* Every bit is individually maskable. */
};
/* How to format or parse a field's value. */
-enum mf_string {
+enum
OVS_PACKED_ENUM
mf_string {
/* Integer formats.
*
* The particular MFS_* constant sets the output format. On input, either
/* Integer formats.
*
* The particular MFS_* constant sets the output format. On input, either
@@
-329,11
+332,18
@@
union mf_subvalue {
BUILD_ASSERT_DECL(sizeof(union mf_value) == sizeof (union mf_subvalue));
/* Finding mf_fields. */
BUILD_ASSERT_DECL(sizeof(union mf_value) == sizeof (union mf_subvalue));
/* Finding mf_fields. */
-const struct mf_field *mf_from_id(enum mf_field_id);
const struct mf_field *mf_from_name(const char *name);
const struct mf_field *mf_from_nxm_header(uint32_t nxm_header);
const struct mf_field *mf_from_nxm_name(const char *nxm_name);
const struct mf_field *mf_from_name(const char *name);
const struct mf_field *mf_from_nxm_header(uint32_t nxm_header);
const struct mf_field *mf_from_nxm_name(const char *nxm_name);
+static inline const struct mf_field *
+mf_from_id(enum mf_field_id id)
+{
+ extern const struct mf_field mf_fields[MFF_N_IDS];
+ ovs_assert((unsigned int) id < MFF_N_IDS);
+ return &mf_fields[id];
+}
+
/* Inspecting wildcarded bits. */
bool mf_is_all_wild(const struct mf_field *, const struct flow_wildcards *);
/* Inspecting wildcarded bits. */
bool mf_is_all_wild(const struct mf_field *, const struct flow_wildcards *);
@@
-355,6
+365,7
@@
void mf_set_value(const struct mf_field *, const union mf_value *value,
void mf_set_flow_value(const struct mf_field *, const union mf_value *value,
struct flow *);
bool mf_is_zero(const struct mf_field *, const struct flow *);
void mf_set_flow_value(const struct mf_field *, const union mf_value *value,
struct flow *);
bool mf_is_zero(const struct mf_field *, const struct flow *);
+void mf_mask_field(const struct mf_field *, struct flow *);
void mf_get(const struct mf_field *, const struct match *,
union mf_value *value, union mf_value *mask);
void mf_get(const struct mf_field *, const struct match *,
union mf_value *value, union mf_value *mask);