[PATCH 2/3] gtp: select netns based on NL attribute

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Pablo Neira Ayuso pablo at soleta.eu
Tue Nov 17 12:33:17 UTC 2015


On Tue, Nov 17, 2015 at 12:06:19PM +0100, Andreas Schultz wrote:
> This permits a split namespace setup where the GTP transport
> sockets are in one namespace the gtp tunnel interface is in
> another namespace.
> 
> The target namespece is selected by the new GTPA_NET_NS_FD NL
> attributes. It fall back to the netns of the GTP-U sockets if
> the NL attr is not present.
> 
> Signed-off-by: Andreas Schultz <aschultz at tpip.net>
> ---
>  gtp.c    | 35 +++++++++++++++++++++++++++++++----
>  gtp_nl.h |  1 +
>  2 files changed, 32 insertions(+), 4 deletions(-)
> 
> diff --git a/gtp.c b/gtp.c
> index cbe2da1..0a45f53 100644
> --- a/gtp.c
> +++ b/gtp.c
> @@ -740,7 +740,7 @@ static int gtp_encap_enable(struct net_device *dev, struct gtp_instance *gti,
>  static int gtp_newlink(struct net *src_net, struct net_device *dev,
>  			struct nlattr *tb[], struct nlattr *data[])
>  {
> -	struct gtp_net *gn = net_generic(src_net, gtp_net_id);
> +	struct gtp_net *gn;
>  	struct net_device *real_dev;
>  	struct gtp_instance *gti;
>  	int hashsize, err, fd0, fd1;
> @@ -780,6 +780,7 @@ static int gtp_newlink(struct net *src_net, struct net_device *dev,
>  	if (err < 0)
>  		goto err1;
>  
> +	gn = net_generic(dev_net(dev), gtp_net_id);
>  	list_add_rcu(&gti->list, &gn->gtp_instance_list);
>  
>  	netdev_dbg(dev, "registered new interface\n");
> @@ -847,6 +848,19 @@ static struct rtnl_link_ops gtp_link_ops __read_mostly = {
>  	.fill_info	= gtp_fill_info,
>  };
>  
> +static struct net *gtp_genl_get_net(struct net *src_net, struct nlattr *tb[])
> +{
> +	struct net *net;
> +	/* Examine the link attributes and figure out which
> +	 * network namespace we are talking about.
> +	 */
> +	if (tb[GTPA_NET_NS_FD])
> +		net = get_net_ns_by_fd(nla_get_u32(tb[GTPA_NET_NS_FD]));
> +	else
> +		net = get_net(src_net);
> +	return net;
> +}
> +
>  static int gtp_hashtable_new(struct gtp_instance *gti, int hsize)
>  {
>  	int i;
> @@ -1065,7 +1079,7 @@ static int ipv4_pdp_add(struct net_device *dev, struct genl_info *info)
>  
>  static int gtp_genl_tunnel_new(struct sk_buff *skb, struct genl_info *info)
>  {
> -	struct net *net = sock_net(skb->sk);
> +	struct net *net;
>  	struct net_device *dev;
>  
>  	if (!info->attrs[GTPA_VERSION] ||
> @@ -1075,6 +1089,10 @@ static int gtp_genl_tunnel_new(struct sk_buff *skb, struct genl_info *info)
>  	    !info->attrs[GTPA_TID])
>  		return -EINVAL;
>  
> +	net = gtp_genl_get_net(sock_net(skb->sk), info->attrs);
> +	if (IS_ERR(net))
> +		return -EINVAL;

You probably want to propagate the real error reason:

        return PTR_ERR(net);



More information about the OpenBSC mailing list