Commit 09d62172 authored by Eelco Chaudron's avatar Eelco Chaudron Committed by Jakub Kicinski

net: openvswitch: fix TTL decrement exception action execution

Currently, the exception actions are not processed correctly as the wrong
dataset is passed. This change fixes this, including the misleading
comment.

In addition, a check was added to make sure we work on an IPv4 packet,
and not just assume if it's not IPv6 it's IPv4.

This was all tested using OVS with patch,
https://patchwork.ozlabs.org/project/openvswitch/list/?series=21639,
applied and sending packets with a TTL of 1 (and 0), both with IPv4
and IPv6.

Fixes: 69929d4c ("net: openvswitch: fix TTL decrement action netlink message format")
Signed-off-by: default avatarEelco Chaudron <echaudro@redhat.com>
Link: https://lore.kernel.org/r/160733569860.3007.12938188180387116741.stgit@wsfd-netdev64.ntdv.lab.eng.bos.redhat.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 7bca5021
...@@ -959,16 +959,13 @@ static int dec_ttl_exception_handler(struct datapath *dp, struct sk_buff *skb, ...@@ -959,16 +959,13 @@ static int dec_ttl_exception_handler(struct datapath *dp, struct sk_buff *skb,
struct sw_flow_key *key, struct sw_flow_key *key,
const struct nlattr *attr, bool last) const struct nlattr *attr, bool last)
{ {
/* The first action is always 'OVS_DEC_TTL_ATTR_ARG'. */ /* The first attribute is always 'OVS_DEC_TTL_ATTR_ACTION'. */
struct nlattr *dec_ttl_arg = nla_data(attr); struct nlattr *actions = nla_data(attr);
if (nla_len(dec_ttl_arg)) { if (nla_len(actions))
struct nlattr *actions = nla_data(dec_ttl_arg); return clone_execute(dp, skb, key, 0, nla_data(actions),
nla_len(actions), last, false);
if (actions)
return clone_execute(dp, skb, key, 0, nla_data(actions),
nla_len(actions), last, false);
}
consume_skb(skb); consume_skb(skb);
return 0; return 0;
} }
...@@ -1212,7 +1209,7 @@ static int execute_dec_ttl(struct sk_buff *skb, struct sw_flow_key *key) ...@@ -1212,7 +1209,7 @@ static int execute_dec_ttl(struct sk_buff *skb, struct sw_flow_key *key)
return -EHOSTUNREACH; return -EHOSTUNREACH;
key->ip.ttl = --nh->hop_limit; key->ip.ttl = --nh->hop_limit;
} else { } else if (skb->protocol == htons(ETH_P_IP)) {
struct iphdr *nh; struct iphdr *nh;
u8 old_ttl; u8 old_ttl;
......
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