flow_key
err = niu_set_flow_key(np, i, parent->flow_key[index]);
static u64 niu_flowkey_to_ethflow(u64 flow_key)
if (flow_key & FLOW_KEY_L2DA)
if (flow_key & FLOW_KEY_VLAN)
if (flow_key & FLOW_KEY_IPSA)
if (flow_key & FLOW_KEY_IPDA)
if (flow_key & FLOW_KEY_PROTO)
if (flow_key & (FLOW_KEY_L4_BYTE12 << FLOW_KEY_L4_0_SHIFT))
if (flow_key & (FLOW_KEY_L4_BYTE12 << FLOW_KEY_L4_1_SHIFT))
static int niu_ethflow_to_flowkey(u64 ethflow, u64 *flow_key)
*flow_key = key;
nfc->data = niu_flowkey_to_ethflow(np->parent->flow_key[class -
u64 flow_key = 0;
flow_key = np->parent->tcam_key[class -
flow_key |= TCAM_KEY_DISC;
nw64(TCAM_KEY(class - CLASS_CODE_USER_PROG1), flow_key);
np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] = flow_key;
flow_key = np->parent->tcam_key[class -
flow_key &= ~TCAM_KEY_DISC;
flow_key);
flow_key;
if (!niu_ethflow_to_flowkey(nfc->data, &flow_key))
nw64(FLOW_KEY(class - CLASS_CODE_USER_PROG1), flow_key);
np->parent->flow_key[class - CLASS_CODE_USER_PROG1] = flow_key;
p->flow_key[index] = (FLOW_KEY_IPSA |
u64 flow_key[12];
struct sw_flow_key *flow_key,
struct sw_flow_key *flow_key,
flow_key->phy.priority = skb->priority;
flow_key->phy.skb_mark = skb->mark;
err = set_eth_addr(skb, flow_key, nla_data(a),
err = set_ipv4(skb, flow_key, nla_data(a),
err = set_ipv6(skb, flow_key, nla_data(a),
err = set_tcp(skb, flow_key, nla_data(a),
err = set_udp(skb, flow_key, nla_data(a),
err = set_sctp(skb, flow_key, nla_data(a),
err = set_mpls(skb, flow_key, nla_data(a), get_mask(a,
static int set_mpls(struct sk_buff *skb, struct sw_flow_key *flow_key,
flow_key->mpls.lse[0] = lse;
static int set_eth_addr(struct sk_buff *skb, struct sw_flow_key *flow_key,
ether_addr_copy(flow_key->eth.src, eth_hdr(skb)->h_source);
ether_addr_copy(flow_key->eth.dst, eth_hdr(skb)->h_dest);
static int set_ipv4(struct sk_buff *skb, struct sw_flow_key *flow_key,
flow_key->ipv4.addr.src = new_addr;
flow_key->ipv4.addr.dst = new_addr;
flow_key->ip.tos = nh->tos;
flow_key->ip.ttl = nh->ttl;
static int set_ipv6(struct sk_buff *skb, struct sw_flow_key *flow_key,
set_ipv6_addr(skb, flow_key->ip.proto, saddr, masked,
memcpy(&flow_key->ipv6.addr.src, masked,
sizeof(flow_key->ipv6.addr.src));
set_ipv6_addr(skb, flow_key->ip.proto, daddr, masked,
memcpy(&flow_key->ipv6.addr.dst, masked,
sizeof(flow_key->ipv6.addr.dst));
flow_key->ip.tos = ipv6_get_dsfield(nh);
flow_key->ipv6.label =
flow_key->ip.ttl = nh->hop_limit;
static int set_udp(struct sk_buff *skb, struct sw_flow_key *flow_key,
flow_key->tp.src = src;
flow_key->tp.dst = dst;
flow_key->tp.src = src;
flow_key->tp.dst = dst;
static int set_tcp(struct sk_buff *skb, struct sw_flow_key *flow_key,
flow_key->tp.src = src;
flow_key->tp.dst = dst;
static int set_sctp(struct sk_buff *skb, struct sw_flow_key *flow_key,
flow_key->tp.src = sh->source;
flow_key->tp.dst = sh->dest;
#define TUN_METADATA_OPTS(flow_key, opt_len) \
((void *)((flow_key)->tun_opts + TUN_METADATA_OFFSET(opt_len)))
const struct sw_flow_key *flow_key,
if (ipv4_key->ipv4_proto != flow_key->ip.proto)
if (ipv4_key->ipv4_frag != flow_key->ip.frag)
if (ipv6_key->ipv6_proto != flow_key->ip.proto)
if (ipv6_key->ipv6_frag != flow_key->ip.frag)
flow_key->ip.proto != IPPROTO_TCP)
flow_key->ip.proto != IPPROTO_UDP)
flow_key->ip.proto != IPPROTO_SCTP)
struct flow_key flow;
__type(key, struct flow_key);