flow_dissect: use programable dissector in skb_flow_dissect and friends
Signed-off-by: Jiri Pirko <jiri@resnulli.us> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
fbff949e3b
commit
06635a35d1
@@ -22,7 +22,7 @@ int enic_addfltr_5t(struct enic *enic, struct flow_keys *keys, u16 rq)
|
||||
int res;
|
||||
struct filter data;
|
||||
|
||||
switch (keys->ip_proto) {
|
||||
switch (keys->basic.ip_proto) {
|
||||
case IPPROTO_TCP:
|
||||
data.u.ipv4.protocol = PROTO_TCP;
|
||||
break;
|
||||
@@ -33,10 +33,10 @@ int enic_addfltr_5t(struct enic *enic, struct flow_keys *keys, u16 rq)
|
||||
return -EPROTONOSUPPORT;
|
||||
};
|
||||
data.type = FILTER_IPV4_5TUPLE;
|
||||
data.u.ipv4.src_addr = ntohl(keys->src);
|
||||
data.u.ipv4.dst_addr = ntohl(keys->dst);
|
||||
data.u.ipv4.src_port = ntohs(keys->port16[0]);
|
||||
data.u.ipv4.dst_port = ntohs(keys->port16[1]);
|
||||
data.u.ipv4.src_addr = ntohl(keys->addrs.src);
|
||||
data.u.ipv4.dst_addr = ntohl(keys->addrs.dst);
|
||||
data.u.ipv4.src_port = ntohs(keys->ports.port16[0]);
|
||||
data.u.ipv4.dst_port = ntohs(keys->ports.port16[1]);
|
||||
data.u.ipv4.flags = FILTER_FIELDS_IPV4_5TUPLE;
|
||||
|
||||
spin_lock_bh(&enic->devcmd_lock);
|
||||
@@ -158,11 +158,11 @@ static struct enic_rfs_fltr_node *htbl_key_search(struct hlist_head *h,
|
||||
struct enic_rfs_fltr_node *tpos;
|
||||
|
||||
hlist_for_each_entry(tpos, h, node)
|
||||
if (tpos->keys.src == k->src &&
|
||||
tpos->keys.dst == k->dst &&
|
||||
tpos->keys.ports == k->ports &&
|
||||
tpos->keys.ip_proto == k->ip_proto &&
|
||||
tpos->keys.n_proto == k->n_proto)
|
||||
if (tpos->keys.addrs.src == k->addrs.src &&
|
||||
tpos->keys.addrs.dst == k->addrs.dst &&
|
||||
tpos->keys.ports.ports == k->ports.ports &&
|
||||
tpos->keys.basic.ip_proto == k->basic.ip_proto &&
|
||||
tpos->keys.basic.n_proto == k->basic.n_proto)
|
||||
return tpos;
|
||||
return NULL;
|
||||
}
|
||||
@@ -177,9 +177,10 @@ int enic_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
|
||||
int res, i;
|
||||
|
||||
enic = netdev_priv(dev);
|
||||
res = skb_flow_dissect(skb, &keys);
|
||||
if (!res || keys.n_proto != htons(ETH_P_IP) ||
|
||||
(keys.ip_proto != IPPROTO_TCP && keys.ip_proto != IPPROTO_UDP))
|
||||
res = skb_flow_dissect_flow_keys(skb, &keys);
|
||||
if (!res || keys.basic.n_proto != htons(ETH_P_IP) ||
|
||||
(keys.basic.ip_proto != IPPROTO_TCP &&
|
||||
keys.basic.ip_proto != IPPROTO_UDP))
|
||||
return -EPROTONOSUPPORT;
|
||||
|
||||
tbl_idx = skb_get_hash_raw(skb) & ENIC_RFS_FLW_MASK;
|
||||
|
@@ -334,7 +334,7 @@ static int enic_grxclsrule(struct enic *enic, struct ethtool_rxnfc *cmd)
|
||||
n = htbl_fltr_search(enic, (u16)fsp->location);
|
||||
if (!n)
|
||||
return -EINVAL;
|
||||
switch (n->keys.ip_proto) {
|
||||
switch (n->keys.basic.ip_proto) {
|
||||
case IPPROTO_TCP:
|
||||
fsp->flow_type = TCP_V4_FLOW;
|
||||
break;
|
||||
@@ -346,16 +346,16 @@ static int enic_grxclsrule(struct enic *enic, struct ethtool_rxnfc *cmd)
|
||||
break;
|
||||
}
|
||||
|
||||
fsp->h_u.tcp_ip4_spec.ip4src = n->keys.src;
|
||||
fsp->h_u.tcp_ip4_spec.ip4src = n->keys.addrs.src;
|
||||
fsp->m_u.tcp_ip4_spec.ip4src = (__u32)~0;
|
||||
|
||||
fsp->h_u.tcp_ip4_spec.ip4dst = n->keys.dst;
|
||||
fsp->h_u.tcp_ip4_spec.ip4dst = n->keys.addrs.dst;
|
||||
fsp->m_u.tcp_ip4_spec.ip4dst = (__u32)~0;
|
||||
|
||||
fsp->h_u.tcp_ip4_spec.psrc = n->keys.port16[0];
|
||||
fsp->h_u.tcp_ip4_spec.psrc = n->keys.ports.port16[0];
|
||||
fsp->m_u.tcp_ip4_spec.psrc = (__u16)~0;
|
||||
|
||||
fsp->h_u.tcp_ip4_spec.pdst = n->keys.port16[1];
|
||||
fsp->h_u.tcp_ip4_spec.pdst = n->keys.ports.port16[1];
|
||||
fsp->m_u.tcp_ip4_spec.pdst = (__u16)~0;
|
||||
|
||||
fsp->ring_cookie = n->rq_id;
|
||||
|
Reference in New Issue
Block a user