mirror of https://gitee.com/openkylin/linux.git
nfp: flower: refactor shared ip header in match offload
Refactored shared ip header code for IPv4 and IPv6 in match offload. Signed-off-by: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Simon Horman <simon.horman@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
90c00f8154
commit
07e1671cfc
|
@ -260,6 +260,13 @@ struct nfp_flower_tp_ports {
|
||||||
__be16 port_dst;
|
__be16 port_dst;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct nfp_flower_ip_ext {
|
||||||
|
u8 tos;
|
||||||
|
u8 proto;
|
||||||
|
u8 ttl;
|
||||||
|
u8 flags;
|
||||||
|
};
|
||||||
|
|
||||||
/* L3 IPv4 details (3W/12B)
|
/* L3 IPv4 details (3W/12B)
|
||||||
* 3 2 1
|
* 3 2 1
|
||||||
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
||||||
|
@ -272,10 +279,7 @@ struct nfp_flower_tp_ports {
|
||||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
*/
|
*/
|
||||||
struct nfp_flower_ipv4 {
|
struct nfp_flower_ipv4 {
|
||||||
u8 tos;
|
struct nfp_flower_ip_ext ip_ext;
|
||||||
u8 proto;
|
|
||||||
u8 ttl;
|
|
||||||
u8 flags;
|
|
||||||
__be32 ipv4_src;
|
__be32 ipv4_src;
|
||||||
__be32 ipv4_dst;
|
__be32 ipv4_dst;
|
||||||
};
|
};
|
||||||
|
@ -284,7 +288,7 @@ struct nfp_flower_ipv4 {
|
||||||
* 3 2 1
|
* 3 2 1
|
||||||
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
||||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
* | DSCP |ECN| protocol | reserved |
|
* | DSCP |ECN| protocol | ttl | flags |
|
||||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
* | ipv6_exthdr | res | ipv6_flow_label |
|
* | ipv6_exthdr | res | ipv6_flow_label |
|
||||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
@ -306,10 +310,7 @@ struct nfp_flower_ipv4 {
|
||||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
*/
|
*/
|
||||||
struct nfp_flower_ipv6 {
|
struct nfp_flower_ipv6 {
|
||||||
u8 tos;
|
struct nfp_flower_ip_ext ip_ext;
|
||||||
u8 proto;
|
|
||||||
u8 ttl;
|
|
||||||
u8 reserved;
|
|
||||||
__be32 ipv6_flow_label_exthdr;
|
__be32 ipv6_flow_label_exthdr;
|
||||||
struct in6_addr ipv6_src;
|
struct in6_addr ipv6_src;
|
||||||
struct in6_addr ipv6_dst;
|
struct in6_addr ipv6_dst;
|
||||||
|
|
|
@ -146,26 +146,15 @@ nfp_flower_compile_tport(struct nfp_flower_tp_ports *frame,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nfp_flower_compile_ipv4(struct nfp_flower_ipv4 *frame,
|
nfp_flower_compile_ip_ext(struct nfp_flower_ip_ext *frame,
|
||||||
struct tc_cls_flower_offload *flow,
|
struct tc_cls_flower_offload *flow,
|
||||||
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 *addr;
|
|
||||||
struct flow_dissector_key_basic *basic;
|
|
||||||
|
|
||||||
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)) {
|
if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) {
|
||||||
|
struct flow_dissector_key_basic *basic;
|
||||||
|
|
||||||
basic = skb_flow_dissector_target(flow->dissector,
|
basic = skb_flow_dissector_target(flow->dissector,
|
||||||
FLOW_DISSECTOR_KEY_BASIC,
|
FLOW_DISSECTOR_KEY_BASIC,
|
||||||
target);
|
target);
|
||||||
|
@ -203,6 +192,28 @@ nfp_flower_compile_ipv4(struct nfp_flower_ipv4 *frame,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nfp_flower_compile_ipv4(struct nfp_flower_ipv4 *frame,
|
||||||
|
struct tc_cls_flower_offload *flow,
|
||||||
|
bool mask_version)
|
||||||
|
{
|
||||||
|
struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
|
||||||
|
struct flow_dissector_key_ipv4_addrs *addr;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
nfp_flower_compile_ip_ext(&frame->ip_ext, flow, mask_version);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame,
|
nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame,
|
||||||
struct tc_cls_flower_offload *flow,
|
struct tc_cls_flower_offload *flow,
|
||||||
|
@ -210,7 +221,6 @@ nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame,
|
||||||
{
|
{
|
||||||
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 *addr;
|
struct flow_dissector_key_ipv6_addrs *addr;
|
||||||
struct flow_dissector_key_basic *basic;
|
|
||||||
|
|
||||||
memset(frame, 0, sizeof(struct nfp_flower_ipv6));
|
memset(frame, 0, sizeof(struct nfp_flower_ipv6));
|
||||||
|
|
||||||
|
@ -223,22 +233,7 @@ nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame,
|
||||||
frame->ipv6_dst = addr->dst;
|
frame->ipv6_dst = addr->dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) {
|
nfp_flower_compile_ip_ext(&frame->ip_ext, flow, mask_version);
|
||||||
basic = skb_flow_dissector_target(flow->dissector,
|
|
||||||
FLOW_DISSECTOR_KEY_BASIC,
|
|
||||||
target);
|
|
||||||
frame->proto = basic->ip_proto;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_IP)) {
|
|
||||||
struct flow_dissector_key_ip *flow_ip;
|
|
||||||
|
|
||||||
flow_ip = skb_flow_dissector_target(flow->dissector,
|
|
||||||
FLOW_DISSECTOR_KEY_IP,
|
|
||||||
target);
|
|
||||||
frame->tos = flow_ip->tos;
|
|
||||||
frame->ttl = flow_ip->ttl;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue