ipv6: ioam: Distinguish input and output for hop-limit
authorJustin Iurman <justin.iurman@uliege.be>
Sun, 3 Oct 2021 18:45:36 +0000 (20:45 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 4 Oct 2021 11:53:35 +0000 (12:53 +0100)
This patch anticipates the support for the IOAM insertion inside in-transit
packets, by making a difference between input and output in order to determine
the right value for its hop-limit (inherited from the IPv6 hop-limit).

Input case: happens before ip6_forward, the IPv6 hop-limit is not decremented
yet -> decrement the IOAM hop-limit to reflect the new hop inside the trace.

Output case: happens after ip6_forward, the IPv6 hop-limit has already been
decremented -> keep the same value for the IOAM hop-limit.

Signed-off-by: Justin Iurman <justin.iurman@uliege.be>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ioam6.h
net/ipv6/exthdrs.c
net/ipv6/ioam6.c

index 3c2993b..3f45ba3 100644 (file)
@@ -56,7 +56,8 @@ static inline struct ioam6_pernet_data *ioam6_pernet(struct net *net)
 struct ioam6_namespace *ioam6_namespace(struct net *net, __be16 id);
 void ioam6_fill_trace_data(struct sk_buff *skb,
                           struct ioam6_namespace *ns,
-                          struct ioam6_trace_hdr *trace);
+                          struct ioam6_trace_hdr *trace,
+                          bool is_input);
 
 int ioam6_init(void);
 void ioam6_exit(void);
index 3a871a0..38ece3b 100644 (file)
@@ -979,7 +979,7 @@ static bool ipv6_hop_ioam(struct sk_buff *skb, int optoff)
                if (!skb_valid_dst(skb))
                        ip6_route_input(skb);
 
-               ioam6_fill_trace_data(skb, ns, trace);
+               ioam6_fill_trace_data(skb, ns, trace, true);
                break;
        default:
                break;
index 5e89610..4e5583d 100644 (file)
@@ -631,7 +631,7 @@ static void __ioam6_fill_trace_data(struct sk_buff *skb,
                                    struct ioam6_namespace *ns,
                                    struct ioam6_trace_hdr *trace,
                                    struct ioam6_schema *sc,
-                                   u8 sclen)
+                                   u8 sclen, bool is_input)
 {
        struct __kernel_sock_timeval ts;
        u64 raw64;
@@ -645,7 +645,7 @@ static void __ioam6_fill_trace_data(struct sk_buff *skb,
        /* hop_lim and node_id */
        if (trace->type.bit0) {
                byte = ipv6_hdr(skb)->hop_limit;
-               if (skb->dev)
+               if (is_input)
                        byte--;
 
                raw32 = dev_net(skb_dst(skb)->dev)->ipv6.sysctl.ioam6_id;
@@ -730,7 +730,7 @@ static void __ioam6_fill_trace_data(struct sk_buff *skb,
        /* hop_lim and node_id (wide) */
        if (trace->type.bit8) {
                byte = ipv6_hdr(skb)->hop_limit;
-               if (skb->dev)
+               if (is_input)
                        byte--;
 
                raw64 = dev_net(skb_dst(skb)->dev)->ipv6.sysctl.ioam6_id_wide;
@@ -786,7 +786,8 @@ static void __ioam6_fill_trace_data(struct sk_buff *skb,
 /* called with rcu_read_lock() */
 void ioam6_fill_trace_data(struct sk_buff *skb,
                           struct ioam6_namespace *ns,
-                          struct ioam6_trace_hdr *trace)
+                          struct ioam6_trace_hdr *trace,
+                          bool is_input)
 {
        struct ioam6_schema *sc;
        u8 sclen = 0;
@@ -822,7 +823,7 @@ void ioam6_fill_trace_data(struct sk_buff *skb,
                return;
        }
 
-       __ioam6_fill_trace_data(skb, ns, trace, sc, sclen);
+       __ioam6_fill_trace_data(skb, ns, trace, sc, sclen, is_input);
        trace->remlen -= trace->nodelen + sclen;
 }