|
@@ -42,33 +42,29 @@ nfp_flower_compile_meta_tci(struct nfp_flower_meta_two *frame,
|
|
struct tc_cls_flower_offload *flow, u8 key_type,
|
|
struct tc_cls_flower_offload *flow, u8 key_type,
|
|
bool mask_version)
|
|
bool mask_version)
|
|
{
|
|
{
|
|
|
|
+ struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
|
|
struct flow_dissector_key_vlan *flow_vlan;
|
|
struct flow_dissector_key_vlan *flow_vlan;
|
|
u16 tmp_tci;
|
|
u16 tmp_tci;
|
|
|
|
|
|
|
|
+ memset(frame, 0, sizeof(struct nfp_flower_meta_two));
|
|
/* Populate the metadata frame. */
|
|
/* Populate the metadata frame. */
|
|
frame->nfp_flow_key_layer = key_type;
|
|
frame->nfp_flow_key_layer = key_type;
|
|
frame->mask_id = ~0;
|
|
frame->mask_id = ~0;
|
|
|
|
|
|
- if (mask_version) {
|
|
|
|
- frame->tci = cpu_to_be16(~0);
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- flow_vlan = skb_flow_dissector_target(flow->dissector,
|
|
|
|
- FLOW_DISSECTOR_KEY_VLAN,
|
|
|
|
- flow->key);
|
|
|
|
-
|
|
|
|
- /* Populate the tci field. */
|
|
|
|
- if (!flow_vlan->vlan_id) {
|
|
|
|
- tmp_tci = 0;
|
|
|
|
- } else {
|
|
|
|
- tmp_tci = FIELD_PREP(NFP_FLOWER_MASK_VLAN_PRIO,
|
|
|
|
- flow_vlan->vlan_priority) |
|
|
|
|
- FIELD_PREP(NFP_FLOWER_MASK_VLAN_VID,
|
|
|
|
- flow_vlan->vlan_id) |
|
|
|
|
- NFP_FLOWER_MASK_VLAN_CFI;
|
|
|
|
|
|
+ if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_VLAN)) {
|
|
|
|
+ flow_vlan = skb_flow_dissector_target(flow->dissector,
|
|
|
|
+ FLOW_DISSECTOR_KEY_VLAN,
|
|
|
|
+ target);
|
|
|
|
+ /* Populate the tci field. */
|
|
|
|
+ if (flow_vlan->vlan_id) {
|
|
|
|
+ tmp_tci = FIELD_PREP(NFP_FLOWER_MASK_VLAN_PRIO,
|
|
|
|
+ flow_vlan->vlan_priority) |
|
|
|
|
+ FIELD_PREP(NFP_FLOWER_MASK_VLAN_VID,
|
|
|
|
+ flow_vlan->vlan_id) |
|
|
|
|
+ NFP_FLOWER_MASK_VLAN_CFI;
|
|
|
|
+ frame->tci = cpu_to_be16(tmp_tci);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- frame->tci = cpu_to_be16(tmp_tci);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
static void
|
|
@@ -99,17 +95,18 @@ nfp_flower_compile_mac(struct nfp_flower_mac_mpls *frame,
|
|
bool mask_version)
|
|
bool mask_version)
|
|
{
|
|
{
|
|
struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
|
|
struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
|
|
- struct flow_dissector_key_eth_addrs *flow_mac;
|
|
|
|
-
|
|
|
|
- flow_mac = skb_flow_dissector_target(flow->dissector,
|
|
|
|
- FLOW_DISSECTOR_KEY_ETH_ADDRS,
|
|
|
|
- target);
|
|
|
|
|
|
+ struct flow_dissector_key_eth_addrs *addr;
|
|
|
|
|
|
memset(frame, 0, sizeof(struct nfp_flower_mac_mpls));
|
|
memset(frame, 0, sizeof(struct nfp_flower_mac_mpls));
|
|
|
|
|
|
- /* Populate mac frame. */
|
|
|
|
- ether_addr_copy(frame->mac_dst, &flow_mac->dst[0]);
|
|
|
|
- ether_addr_copy(frame->mac_src, &flow_mac->src[0]);
|
|
|
|
|
|
+ if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_ETH_ADDRS)) {
|
|
|
|
+ addr = skb_flow_dissector_target(flow->dissector,
|
|
|
|
+ FLOW_DISSECTOR_KEY_ETH_ADDRS,
|
|
|
|
+ target);
|
|
|
|
+ /* Populate mac frame. */
|
|
|
|
+ ether_addr_copy(frame->mac_dst, &addr->dst[0]);
|
|
|
|
+ ether_addr_copy(frame->mac_src, &addr->src[0]);
|
|
|
|
+ }
|
|
|
|
|
|
if (mask_version)
|
|
if (mask_version)
|
|
frame->mpls_lse = cpu_to_be32(~0);
|
|
frame->mpls_lse = cpu_to_be32(~0);
|
|
@@ -121,14 +118,17 @@ nfp_flower_compile_tport(struct nfp_flower_tp_ports *frame,
|
|
bool mask_version)
|
|
bool mask_version)
|
|
{
|
|
{
|
|
struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
|
|
struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
|
|
- struct flow_dissector_key_ports *flow_tp;
|
|
|
|
|
|
+ struct flow_dissector_key_ports *tp;
|
|
|
|
|
|
- flow_tp = skb_flow_dissector_target(flow->dissector,
|
|
|
|
- FLOW_DISSECTOR_KEY_PORTS,
|
|
|
|
- target);
|
|
|
|
|
|
+ memset(frame, 0, sizeof(struct nfp_flower_tp_ports));
|
|
|
|
|
|
- frame->port_src = flow_tp->src;
|
|
|
|
- frame->port_dst = flow_tp->dst;
|
|
|
|
|
|
+ if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_PORTS)) {
|
|
|
|
+ tp = skb_flow_dissector_target(flow->dissector,
|
|
|
|
+ FLOW_DISSECTOR_KEY_PORTS,
|
|
|
|
+ target);
|
|
|
|
+ frame->port_src = tp->src;
|
|
|
|
+ frame->port_dst = tp->dst;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
static void
|
|
@@ -137,25 +137,27 @@ nfp_flower_compile_ipv4(struct nfp_flower_ipv4 *frame,
|
|
bool mask_version)
|
|
bool mask_version)
|
|
{
|
|
{
|
|
struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
|
|
struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
|
|
- struct flow_dissector_key_ipv4_addrs *flow_ipv4;
|
|
|
|
- struct flow_dissector_key_basic *flow_basic;
|
|
|
|
-
|
|
|
|
- flow_ipv4 = skb_flow_dissector_target(flow->dissector,
|
|
|
|
- FLOW_DISSECTOR_KEY_IPV4_ADDRS,
|
|
|
|
- target);
|
|
|
|
-
|
|
|
|
- flow_basic = skb_flow_dissector_target(flow->dissector,
|
|
|
|
- FLOW_DISSECTOR_KEY_BASIC,
|
|
|
|
- target);
|
|
|
|
|
|
+ struct flow_dissector_key_ipv4_addrs *addr;
|
|
|
|
+ struct flow_dissector_key_basic *basic;
|
|
|
|
|
|
- /* Populate IPv4 frame. */
|
|
|
|
- frame->reserved = 0;
|
|
|
|
- frame->ipv4_src = flow_ipv4->src;
|
|
|
|
- frame->ipv4_dst = flow_ipv4->dst;
|
|
|
|
- frame->proto = flow_basic->ip_proto;
|
|
|
|
/* Wildcard TOS/TTL for now. */
|
|
/* Wildcard TOS/TTL for now. */
|
|
- frame->tos = 0;
|
|
|
|
- frame->ttl = 0;
|
|
|
|
|
|
+ memset(frame, 0, sizeof(struct nfp_flower_ipv4));
|
|
|
|
+
|
|
|
|
+ if (dissector_uses_key(flow->dissector,
|
|
|
|
+ FLOW_DISSECTOR_KEY_IPV4_ADDRS)) {
|
|
|
|
+ addr = skb_flow_dissector_target(flow->dissector,
|
|
|
|
+ FLOW_DISSECTOR_KEY_IPV4_ADDRS,
|
|
|
|
+ target);
|
|
|
|
+ frame->ipv4_src = addr->src;
|
|
|
|
+ frame->ipv4_dst = addr->dst;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) {
|
|
|
|
+ basic = skb_flow_dissector_target(flow->dissector,
|
|
|
|
+ FLOW_DISSECTOR_KEY_BASIC,
|
|
|
|
+ target);
|
|
|
|
+ frame->proto = basic->ip_proto;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
static void
|
|
@@ -164,26 +166,27 @@ nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame,
|
|
bool mask_version)
|
|
bool mask_version)
|
|
{
|
|
{
|
|
struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
|
|
struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
|
|
- struct flow_dissector_key_ipv6_addrs *flow_ipv6;
|
|
|
|
- struct flow_dissector_key_basic *flow_basic;
|
|
|
|
-
|
|
|
|
- flow_ipv6 = skb_flow_dissector_target(flow->dissector,
|
|
|
|
- FLOW_DISSECTOR_KEY_IPV6_ADDRS,
|
|
|
|
- target);
|
|
|
|
|
|
+ struct flow_dissector_key_ipv6_addrs *addr;
|
|
|
|
+ struct flow_dissector_key_basic *basic;
|
|
|
|
|
|
- flow_basic = skb_flow_dissector_target(flow->dissector,
|
|
|
|
- FLOW_DISSECTOR_KEY_BASIC,
|
|
|
|
- target);
|
|
|
|
-
|
|
|
|
- /* Populate IPv6 frame. */
|
|
|
|
- frame->reserved = 0;
|
|
|
|
- frame->ipv6_src = flow_ipv6->src;
|
|
|
|
- frame->ipv6_dst = flow_ipv6->dst;
|
|
|
|
- frame->proto = flow_basic->ip_proto;
|
|
|
|
/* Wildcard LABEL/TOS/TTL for now. */
|
|
/* Wildcard LABEL/TOS/TTL for now. */
|
|
- frame->ipv6_flow_label_exthdr = 0;
|
|
|
|
- frame->tos = 0;
|
|
|
|
- frame->ttl = 0;
|
|
|
|
|
|
+ memset(frame, 0, sizeof(struct nfp_flower_ipv6));
|
|
|
|
+
|
|
|
|
+ if (dissector_uses_key(flow->dissector,
|
|
|
|
+ FLOW_DISSECTOR_KEY_IPV6_ADDRS)) {
|
|
|
|
+ addr = skb_flow_dissector_target(flow->dissector,
|
|
|
|
+ FLOW_DISSECTOR_KEY_IPV6_ADDRS,
|
|
|
|
+ target);
|
|
|
|
+ frame->ipv6_src = addr->src;
|
|
|
|
+ frame->ipv6_dst = addr->dst;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) {
|
|
|
|
+ basic = skb_flow_dissector_target(flow->dissector,
|
|
|
|
+ FLOW_DISSECTOR_KEY_BASIC,
|
|
|
|
+ target);
|
|
|
|
+ frame->proto = basic->ip_proto;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow,
|
|
int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow,
|