mirror of
https://github.com/openvswitch/ovs
synced 2025-10-17 14:28:02 +00:00
Add connection tracking mark support.
This patch adds a new 32-bit metadata field to the connection tracking interface. When a mark is specified as part of the ct action and the connection is committed, the value is saved with the current connection. Subsequent ct lookups with the table specified will expose this metadata as the "ct_mark" field in the flow. For example, to allow new TCP connections from port 1->2 and only allow established connections from port 2->1, and to associate a mark with those connections: table=0,priority=1,action=drop table=0,arp,action=normal table=0,in_port=1,tcp,action=ct(commit,exec(set_field:1->ct_mark)),2 table=0,in_port=2,ct_state=-trk,tcp,action=ct(table=1) table=1,in_port=2,ct_state=+trk,ct_mark=1,tcp,action=1 Signed-off-by: Joe Stringer <joestringer@nicira.com> Acked-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
@@ -104,9 +104,11 @@ struct flow {
|
||||
uint32_t recirc_id; /* Must be exact match. */
|
||||
uint16_t ct_state; /* Connection tracking state. */
|
||||
uint16_t ct_zone; /* Connection tracking zone. */
|
||||
uint32_t ct_mark; /* Connection mark.*/
|
||||
uint8_t pad1[4]; /* Pad to 64 bits. */
|
||||
uint32_t conj_id; /* Conjunction ID. */
|
||||
ofp_port_t actset_output; /* Output port in action set. */
|
||||
uint8_t pad1[2]; /* Pad to 64 bits. */
|
||||
uint8_t pad2[2]; /* Pad to 64 bits. */
|
||||
|
||||
/* L2, Order the same as in the Ethernet header! (64-bit aligned) */
|
||||
struct eth_addr dl_dst; /* Ethernet destination address. */
|
||||
@@ -129,7 +131,7 @@ struct flow {
|
||||
struct eth_addr arp_sha; /* ARP/ND source hardware address. */
|
||||
struct eth_addr arp_tha; /* ARP/ND target hardware address. */
|
||||
ovs_be16 tcp_flags; /* TCP flags. With L3 to avoid matching L4. */
|
||||
ovs_be16 pad2; /* Pad to 64 bits. */
|
||||
ovs_be16 pad3; /* Pad to 64 bits. */
|
||||
|
||||
/* L4 (64-bit aligned) */
|
||||
ovs_be16 tp_src; /* TCP/UDP/SCTP source port. */
|
||||
@@ -155,7 +157,7 @@ BUILD_ASSERT_DECL(sizeof(struct flow_tnl) % sizeof(uint64_t) == 0);
|
||||
|
||||
/* Remember to update FLOW_WC_SEQ when changing 'struct flow'. */
|
||||
BUILD_ASSERT_DECL(offsetof(struct flow, igmp_group_ip4) + sizeof(uint32_t)
|
||||
== sizeof(struct flow_tnl) + 192
|
||||
== sizeof(struct flow_tnl) + 200
|
||||
&& FLOW_WC_SEQ == 34);
|
||||
|
||||
/* Incremental points at which flow classification may be performed in
|
||||
@@ -985,6 +987,7 @@ pkt_metadata_from_flow(struct pkt_metadata *md, const struct flow *flow)
|
||||
md->in_port = flow->in_port;
|
||||
md->ct_state = flow->ct_state;
|
||||
md->ct_zone = flow->ct_zone;
|
||||
md->ct_mark = flow->ct_mark;
|
||||
}
|
||||
|
||||
static inline bool is_ip_any(const struct flow *flow)
|
||||
|
Reference in New Issue
Block a user