Skip to content

Commit 518d8a2

Browse files
ogerlitzdavem330
authored andcommitted
net/flow_dissector: add support for dissection of misc ip header fields
Add support for dissection of ip tos and ttl and ipv6 traffic-class and hoplimit. Both are dissected into the same struct. Uses similar call to ip dissection function as with tcp, arp and others. Signed-off-by: Or Gerlitz <[email protected]> Reviewed-by: Jiri Pirko <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent f4d0166 commit 518d8a2

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

include/net/flow_dissector.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,16 @@ struct flow_dissector_key_tcp {
165165
__be16 flags;
166166
};
167167

168+
/**
169+
* struct flow_dissector_key_ip:
170+
* @tos: tos
171+
* @ttl: ttl
172+
*/
173+
struct flow_dissector_key_ip {
174+
__u8 tos;
175+
__u8 ttl;
176+
};
177+
168178
enum flow_dissector_key_id {
169179
FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */
170180
FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
@@ -186,6 +196,7 @@ enum flow_dissector_key_id {
186196
FLOW_DISSECTOR_KEY_ENC_PORTS, /* struct flow_dissector_key_ports */
187197
FLOW_DISSECTOR_KEY_MPLS, /* struct flow_dissector_key_mpls */
188198
FLOW_DISSECTOR_KEY_TCP, /* struct flow_dissector_key_tcp */
199+
FLOW_DISSECTOR_KEY_IP, /* struct flow_dissector_key_ip */
189200

190201
FLOW_DISSECTOR_KEY_MAX,
191202
};

net/core/flow_dissector.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,40 @@ __skb_flow_dissect_tcp(const struct sk_buff *skb,
367367
key_tcp->flags = (*(__be16 *) &tcp_flag_word(th) & htons(0x0FFF));
368368
}
369369

370+
static void
371+
__skb_flow_dissect_ipv4(const struct sk_buff *skb,
372+
struct flow_dissector *flow_dissector,
373+
void *target_container, void *data, const struct iphdr *iph)
374+
{
375+
struct flow_dissector_key_ip *key_ip;
376+
377+
if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_IP))
378+
return;
379+
380+
key_ip = skb_flow_dissector_target(flow_dissector,
381+
FLOW_DISSECTOR_KEY_IP,
382+
target_container);
383+
key_ip->tos = iph->tos;
384+
key_ip->ttl = iph->ttl;
385+
}
386+
387+
static void
388+
__skb_flow_dissect_ipv6(const struct sk_buff *skb,
389+
struct flow_dissector *flow_dissector,
390+
void *target_container, void *data, const struct ipv6hdr *iph)
391+
{
392+
struct flow_dissector_key_ip *key_ip;
393+
394+
if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_IP))
395+
return;
396+
397+
key_ip = skb_flow_dissector_target(flow_dissector,
398+
FLOW_DISSECTOR_KEY_IP,
399+
target_container);
400+
key_ip->tos = ipv6_get_dsfield(iph);
401+
key_ip->ttl = iph->hop_limit;
402+
}
403+
370404
/**
371405
* __skb_flow_dissect - extract the flow_keys struct and return it
372406
* @skb: sk_buff to extract the flow from, can be NULL if the rest are specified
@@ -469,6 +503,9 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
469503
}
470504
}
471505

506+
__skb_flow_dissect_ipv4(skb, flow_dissector,
507+
target_container, data, iph);
508+
472509
if (flags & FLOW_DISSECTOR_F_STOP_AT_L3)
473510
goto out_good;
474511

@@ -514,6 +551,9 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
514551
goto out_good;
515552
}
516553

554+
__skb_flow_dissect_ipv6(skb, flow_dissector,
555+
target_container, data, iph);
556+
517557
if (flags & FLOW_DISSECTOR_F_STOP_AT_L3)
518558
goto out_good;
519559

0 commit comments

Comments
 (0)