Commit 52d03786 authored by Justin Iurman's avatar Justin Iurman Committed by David S. Miller

ipv6: ioam: Distinguish input and output for hop-limit

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: default avatarJustin Iurman <justin.iurman@uliege.be>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9ac93627
...@@ -56,7 +56,8 @@ static inline struct ioam6_pernet_data *ioam6_pernet(struct net *net) ...@@ -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); struct ioam6_namespace *ioam6_namespace(struct net *net, __be16 id);
void ioam6_fill_trace_data(struct sk_buff *skb, void ioam6_fill_trace_data(struct sk_buff *skb,
struct ioam6_namespace *ns, struct ioam6_namespace *ns,
struct ioam6_trace_hdr *trace); struct ioam6_trace_hdr *trace,
bool is_input);
int ioam6_init(void); int ioam6_init(void);
void ioam6_exit(void); void ioam6_exit(void);
......
...@@ -979,7 +979,7 @@ static bool ipv6_hop_ioam(struct sk_buff *skb, int optoff) ...@@ -979,7 +979,7 @@ static bool ipv6_hop_ioam(struct sk_buff *skb, int optoff)
if (!skb_valid_dst(skb)) if (!skb_valid_dst(skb))
ip6_route_input(skb); ip6_route_input(skb);
ioam6_fill_trace_data(skb, ns, trace); ioam6_fill_trace_data(skb, ns, trace, true);
break; break;
default: default:
break; break;
......
...@@ -631,7 +631,7 @@ static void __ioam6_fill_trace_data(struct sk_buff *skb, ...@@ -631,7 +631,7 @@ static void __ioam6_fill_trace_data(struct sk_buff *skb,
struct ioam6_namespace *ns, struct ioam6_namespace *ns,
struct ioam6_trace_hdr *trace, struct ioam6_trace_hdr *trace,
struct ioam6_schema *sc, struct ioam6_schema *sc,
u8 sclen) u8 sclen, bool is_input)
{ {
struct __kernel_sock_timeval ts; struct __kernel_sock_timeval ts;
u64 raw64; u64 raw64;
...@@ -645,7 +645,7 @@ static void __ioam6_fill_trace_data(struct sk_buff *skb, ...@@ -645,7 +645,7 @@ static void __ioam6_fill_trace_data(struct sk_buff *skb,
/* hop_lim and node_id */ /* hop_lim and node_id */
if (trace->type.bit0) { if (trace->type.bit0) {
byte = ipv6_hdr(skb)->hop_limit; byte = ipv6_hdr(skb)->hop_limit;
if (skb->dev) if (is_input)
byte--; byte--;
raw32 = dev_net(skb_dst(skb)->dev)->ipv6.sysctl.ioam6_id; 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, ...@@ -730,7 +730,7 @@ static void __ioam6_fill_trace_data(struct sk_buff *skb,
/* hop_lim and node_id (wide) */ /* hop_lim and node_id (wide) */
if (trace->type.bit8) { if (trace->type.bit8) {
byte = ipv6_hdr(skb)->hop_limit; byte = ipv6_hdr(skb)->hop_limit;
if (skb->dev) if (is_input)
byte--; byte--;
raw64 = dev_net(skb_dst(skb)->dev)->ipv6.sysctl.ioam6_id_wide; 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, ...@@ -786,7 +786,8 @@ static void __ioam6_fill_trace_data(struct sk_buff *skb,
/* called with rcu_read_lock() */ /* called with rcu_read_lock() */
void ioam6_fill_trace_data(struct sk_buff *skb, void ioam6_fill_trace_data(struct sk_buff *skb,
struct ioam6_namespace *ns, struct ioam6_namespace *ns,
struct ioam6_trace_hdr *trace) struct ioam6_trace_hdr *trace,
bool is_input)
{ {
struct ioam6_schema *sc; struct ioam6_schema *sc;
u8 sclen = 0; u8 sclen = 0;
...@@ -822,7 +823,7 @@ void ioam6_fill_trace_data(struct sk_buff *skb, ...@@ -822,7 +823,7 @@ void ioam6_fill_trace_data(struct sk_buff *skb,
return; 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; trace->remlen -= trace->nodelen + sclen;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment