[PATCH net v1] ip_gre: Reject enabling collect metadata through changelink

Xuanqiang Luo posted 1 patch 1 week ago
There is a newer version of this series
net/ipv4/ip_gre.c | 6 ++++++
1 file changed, 6 insertions(+)
[PATCH net v1] ip_gre: Reject enabling collect metadata through changelink
Posted by Xuanqiang Luo 1 week ago
From: Xuanqiang Luo <luoxuanqiang@kylinos.cn>

ipgre_netlink_parms() can enable collect_md on an existing GRE, GRETAP
or ERSPAN device. Unlike newlink, changelink does not enforce metadata
tunnel uniqueness. Converting a non-metadata device can therefore
replace the metadata receive entry for another device of the same type
in the same netns. Deleting either device then clears the shared entry,
breaking metadata receive lookup for the surviving device.

If parameter validation fails after collect_md is set, deleting the
modified device can also clear an entry it never owned.

Reject enabling metadata mode in both changelink callbacks before any
encapsulation or tunnel parameters are modified. Allow requests that
repeat the metadata attribute on an existing metadata device.

Fixes: 2e15ea390e6f ("ip_gre: Add support to collect tunnel metadata.")
Signed-off-by: Xuanqiang Luo <luoxuanqiang@kylinos.cn>
---
The state change on failure can be reproduced without an existing
metadata tunnel (output abbreviated):

  # ip link add g1 type gre local 192.0.2.1 remote 192.0.2.2
  # ip -d link show g1
      link/gre 192.0.2.1 peer 192.0.2.2 ...
      gre remote 192.0.2.2 local 192.0.2.1 ...

  # ip link set g1 type gre external
  RTNETLINK answers: Invalid argument

  # ip -d link show g1
      link/none c0:00:02:01 peer c0:00:02:02 ...
      gre external remote 192.0.2.2 local 192.0.2.1 ...

  # ip link del g1

The request fails, but collect_md and the device type have already
changed.

If another metadata tunnel exists, deleting this device can clear its
collect_md_tun entry. A successful conversion can overwrite that entry.

 net/ipv4/ip_gre.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 82309efd417e0..7b1b0f17f60b9 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -1464,6 +1464,9 @@ static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
 	if (!rtnl_dev_link_net_capable(dev, t->net))
 		return -EPERM;
 
+	if (data && data[IFLA_GRE_COLLECT_METADATA] && !t->collect_md)
+		return -EOPNOTSUPP;
+
 	err = ipgre_newlink_encap_setup(dev, data);
 	if (err)
 		return err;
@@ -1496,6 +1499,9 @@ static int erspan_changelink(struct net_device *dev, struct nlattr *tb[],
 	if (!rtnl_dev_link_net_capable(dev, t->net))
 		return -EPERM;
 
+	if (data && data[IFLA_GRE_COLLECT_METADATA] && !t->collect_md)
+		return -EOPNOTSUPP;
+
 	err = ipgre_newlink_encap_setup(dev, data);
 	if (err)
 		return err;

base-commit: c9151088f1674fd29ff26a20f5fc687acf53a2f0
-- 
2.43.0
Re: [PATCH net v1] ip_gre: Reject enabling collect metadata through changelink
Posted by Ido Schimmel 4 days, 16 hours ago
On Thu, Sep 17, 2026 at 05:50:16PM +0800, Xuanqiang Luo wrote:
> diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
> index 82309efd417e0..7b1b0f17f60b9 100644
> --- a/net/ipv4/ip_gre.c
> +++ b/net/ipv4/ip_gre.c
> @@ -1464,6 +1464,9 @@ static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
>  	if (!rtnl_dev_link_net_capable(dev, t->net))
>  		return -EPERM;
>  
> +	if (data && data[IFLA_GRE_COLLECT_METADATA] && !t->collect_md)
> +		return -EOPNOTSUPP;
> +
>  	err = ipgre_newlink_encap_setup(dev, data);
>  	if (err)
>  		return err;
> @@ -1496,6 +1499,9 @@ static int erspan_changelink(struct net_device *dev, struct nlattr *tb[],
>  	if (!rtnl_dev_link_net_capable(dev, t->net))
>  		return -EPERM;
>  
> +	if (data && data[IFLA_GRE_COLLECT_METADATA] && !t->collect_md)
> +		return -EOPNOTSUPP;

Both functions have extack, so please add a rejection message to make it
clear to user space. Something like:

"Enabling collect_md on an existing device is not supported"

Also, I assume you audited other tunnels and confirmed that they don't
suffer from this problem?

> +
>  	err = ipgre_newlink_encap_setup(dev, data);
>  	if (err)
>  		return err;
> 
> base-commit: c9151088f1674fd29ff26a20f5fc687acf53a2f0
> -- 
> 2.43.0
Re: [PATCH net v1] ip_gre: Reject enabling collect metadata through changelink
Posted by Xuanqiang Luo 3 days, 23 hours ago
在 2026/9/20 18:26, Ido Schimmel 写道:
> On Thu, Sep 17, 2026 at 05:50:16PM +0800, Xuanqiang Luo wrote:
>> diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
>> index 82309efd417e0..7b1b0f17f60b9 100644
>> --- a/net/ipv4/ip_gre.c
>> +++ b/net/ipv4/ip_gre.c
>> @@ -1464,6 +1464,9 @@ static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
>>   	if (!rtnl_dev_link_net_capable(dev, t->net))
>>   		return -EPERM;
>>   
>> +	if (data && data[IFLA_GRE_COLLECT_METADATA] && !t->collect_md)
>> +		return -EOPNOTSUPP;
>> +
>>   	err = ipgre_newlink_encap_setup(dev, data);
>>   	if (err)
>>   		return err;
>> @@ -1496,6 +1499,9 @@ static int erspan_changelink(struct net_device *dev, struct nlattr *tb[],
>>   	if (!rtnl_dev_link_net_capable(dev, t->net))
>>   		return -EPERM;
>>   
>> +	if (data && data[IFLA_GRE_COLLECT_METADATA] && !t->collect_md)
>> +		return -EOPNOTSUPP;
> 
> Both functions have extack, so please add a rejection message to make it
> clear to user space. Something like:
> 
> "Enabling collect_md on an existing device is not supported"

Thanks for the suggestion!

I'll address this in v2.

> 
> Also, I assume you audited other tunnels and confirmed that they don't
> suffer from this problem?
> 

Yes, I checked the relevant paths in other tunnels and found no
similar issues.

Thanks,
Xuanqiang