net: flow_dissector: add support for dissection of tcp flags
Add support for dissection of tcp flags. Uses similar function call to tcp dissection function as arp, mpls and others. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Acked-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2a7f38c538
commit
ac4bb5de27
|
@ -157,6 +157,14 @@ struct flow_dissector_key_eth_addrs {
|
||||||
unsigned char src[ETH_ALEN];
|
unsigned char src[ETH_ALEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct flow_dissector_key_tcp:
|
||||||
|
* @flags: flags
|
||||||
|
*/
|
||||||
|
struct flow_dissector_key_tcp {
|
||||||
|
__be16 flags;
|
||||||
|
};
|
||||||
|
|
||||||
enum flow_dissector_key_id {
|
enum flow_dissector_key_id {
|
||||||
FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */
|
FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */
|
||||||
FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
|
FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
|
||||||
|
@ -177,6 +185,7 @@ enum flow_dissector_key_id {
|
||||||
FLOW_DISSECTOR_KEY_ENC_CONTROL, /* struct flow_dissector_key_control */
|
FLOW_DISSECTOR_KEY_ENC_CONTROL, /* struct flow_dissector_key_control */
|
||||||
FLOW_DISSECTOR_KEY_ENC_PORTS, /* struct flow_dissector_key_ports */
|
FLOW_DISSECTOR_KEY_ENC_PORTS, /* struct flow_dissector_key_ports */
|
||||||
FLOW_DISSECTOR_KEY_MPLS, /* struct flow_dissector_key_mpls */
|
FLOW_DISSECTOR_KEY_MPLS, /* struct flow_dissector_key_mpls */
|
||||||
|
FLOW_DISSECTOR_KEY_TCP, /* struct flow_dissector_key_tcp */
|
||||||
|
|
||||||
FLOW_DISSECTOR_KEY_MAX,
|
FLOW_DISSECTOR_KEY_MAX,
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/if_ether.h>
|
#include <linux/if_ether.h>
|
||||||
#include <linux/mpls.h>
|
#include <linux/mpls.h>
|
||||||
|
#include <linux/tcp.h>
|
||||||
#include <net/flow_dissector.h>
|
#include <net/flow_dissector.h>
|
||||||
#include <scsi/fc/fc_fcoe.h>
|
#include <scsi/fc/fc_fcoe.h>
|
||||||
|
|
||||||
|
@ -342,6 +343,30 @@ __skb_flow_dissect_gre(const struct sk_buff *skb,
|
||||||
return FLOW_DISSECT_RET_OUT_PROTO_AGAIN;
|
return FLOW_DISSECT_RET_OUT_PROTO_AGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
__skb_flow_dissect_tcp(const struct sk_buff *skb,
|
||||||
|
struct flow_dissector *flow_dissector,
|
||||||
|
void *target_container, void *data, int thoff, int hlen)
|
||||||
|
{
|
||||||
|
struct flow_dissector_key_tcp *key_tcp;
|
||||||
|
struct tcphdr *th, _th;
|
||||||
|
|
||||||
|
if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_TCP))
|
||||||
|
return;
|
||||||
|
|
||||||
|
th = __skb_header_pointer(skb, thoff, sizeof(_th), data, hlen, &_th);
|
||||||
|
if (!th)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (unlikely(__tcp_hdrlen(th) < sizeof(_th)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
key_tcp = skb_flow_dissector_target(flow_dissector,
|
||||||
|
FLOW_DISSECTOR_KEY_TCP,
|
||||||
|
target_container);
|
||||||
|
key_tcp->flags = (*(__be16 *) &tcp_flag_word(th) & htons(0x0FFF));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __skb_flow_dissect - extract the flow_keys struct and return it
|
* __skb_flow_dissect - extract the flow_keys struct and return it
|
||||||
* @skb: sk_buff to extract the flow from, can be NULL if the rest are specified
|
* @skb: sk_buff to extract the flow from, can be NULL if the rest are specified
|
||||||
|
@ -683,6 +708,10 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
|
||||||
case IPPROTO_MPLS:
|
case IPPROTO_MPLS:
|
||||||
proto = htons(ETH_P_MPLS_UC);
|
proto = htons(ETH_P_MPLS_UC);
|
||||||
goto mpls;
|
goto mpls;
|
||||||
|
case IPPROTO_TCP:
|
||||||
|
__skb_flow_dissect_tcp(skb, flow_dissector, target_container,
|
||||||
|
data, nhoff, hlen);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue