Matching Network Service Header (NSH)
Network Service Header (NSH) provides a mechanism for metadata exchange along the instantiated service paths. The NSH is the Service Function Chaining (SFC) encapsulation required to support the SFC architecture (defined in RFC 7665).
NSH, a data-plane protocol can be matched now using the existed item: RTE_FLOW_ITEM_TYPE_NSH. Currently this is supported ONLY when NSH follows VXLAN-GPE, and the “l3_vxlan_en=1”
and “dv_flow_en=1”
(Default) is set.
NSH fields matching is not supported.
To match on NSH to port_id 1:
flow create 0 transfer group 0 pattern eth / end actions count / jump group 1 / end
flow create 0 transfer group 1 pattern eth / ipv6 / udp dst is 250 / vxlan-gpe / nsh / eth / end actions port_id id 1 / end
struct rte_flow_attr attr = {0
};
struct rte_flow_item pattern[MAX_PATTERNS_NUM] = {0
};
struct rte_flow_action action[MAX_ACTIONS_NUM] = {0
};
struct rte_flow_action_port_id port_id = {.id = 1
};
struct rte_flow_item_udp spec = {0
};
struct rte_flow_item_udp mask = {0
};
struct rte_flow *flow = NULL;
struct rte_flow_error error;
uint16_t port = 0
;
int
ret;
attr.transfer = 1
;
attr.group = 1
;
attr.priority = 0
;
pattern[0
].type = RTE_FLOW_ITEM_TYPE_ETH;
pattern[1
].type = RTE_FLOW_ITEM_TYPE_IPV6;
pattern[2
].type = RTE_FLOW_ITEM_TYPE_UDP;
spec.hdr.dst_port = RTE_BE16(250
);
mask.hdr.dst_port = RTE_BE16(0xffff
);
pattern[2
].spec = &spec;
pattern[2
].mask = &mask;
pattern[3
].type = RTE_FLOW_ITEM_TYPE_VXLAN_GPE;
pattern[4
].type = RTE_FLOW_ITEM_TYPE_NSH;
pattern[5
].type = RTE_FLOW_ITEM_TYPE_ETH;
pattern[6
].type = RTE_FLOW_ITEM_TYPE_END;
action[0
].type = RTE_FLOW_ACTION_TYPE_PORT_ID;
action[0
].conf = &port_id;
action[1
].type = RTE_FLOW_ACTION_TYPE_END;
ret = rte_flow_validate(port, &attr, pattern, action, &error);
if
(!ret)
flow = rte_flow_create(port, &attr, pattern, action, &error);
return
flow;