All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/5] Data plane support for IOAM Pre-allocated Trace with IPv6
@ 2020-06-24 19:23 Justin Iurman
  2020-06-24 19:23 ` [PATCH net-next 1/5] ipv6: eh: Introduce removable TLVs Justin Iurman
                   ` (4 more replies)
  0 siblings, 5 replies; 42+ messages in thread
From: Justin Iurman @ 2020-06-24 19:23 UTC (permalink / raw)
  To: netdev; +Cc: davem, justin.iurman

In-situ Operations, Administration, and Maintenance (IOAM) records
operational and telemetry information in a packet while it traverses
a path between two points in an IOAM domain. It is defined in
draft-ietf-ippm-ioam-data-09 [1]. IOAM data fields can be encapsulated
into a variety of protocols. The IPv6 encapsulation is defined in
draft-ietf-ippm-ioam-ipv6-options-01 [2], via extension headers. IOAM
can be used to complement OAM mechanisms based on e.g. ICMP or other
types of probe packets.

This patchset implements support for the Pre-allocated Trace, carried
by a Hop-by-Hop. Therefore, a new IPv6 Hop-by-Hop TLV option is
introduced, see IANA [3]. The three other IOAM options are not included
in this patchset (Incremental Trace, Proof-of-Transit and Edge-to-Edge).
The main idea behind the IOAM Pre-allocated Trace is that a node
pre-allocates some room in packets for IOAM data. Then, each IOAM node
on the path will insert its data. There exist several interesting use-
cases, e.g. Fast failure detection/isolation or Smart service selection.
Another killer use-case is what we have called Cross-Layer Telemetry,
see the demo video on its repository [4], that aims to make the entire
stack (L2/L3 -> L7) visible for distributed tracing tools (e.g. Jaeger),
instead of the current L5 -> L7 limited view. So, basically, this is a
nice feature for the Linux Kernel.

IOAM options must be 4n-aligned. Here is how a Hop-by-Hop looks like
with IOAM:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Next header  |  Hdr Ext Len  |    Padding    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Option Type  |  Opt Data Len |    Reserved   |   IOAM Type   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Namespace-ID          | NodeLen | Flags | RemainingLen|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                IOAM-Trace-Type                |    Reserved   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<-+
|                                                               |  |
|                         node data [0]                         |  |
|                                                               |  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  D
|                                                               |  a
|                         node data [1]                         |  t
|                                                               |  a
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                             ...                               ~  S
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  p
|                                                               |  a
|                         node data [n-1]                       |  c
|                                                               |  e
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  |
|                                                               |  |
|                         node data [n]                         |  |
|                                                               |  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<-+

Namespace-ID represents an IOAM namespace identifier, not to be confused
with Linux namespaces. IOAM namespaces add further context to IOAM
options and associated data, and allow devices which are IOAM capable to
determine whether IOAM needs to be processed, updated or removed. They
can also be used by an operator to distinguish different operational
domains or to identify different sets of devices. Other fields are also
explained in [1] and [2].

This patchset does not provide support for the control plane part, ie
the IOAM encapsulation or inline insertion (ingress node behavior). It
will come as another patch since some design choices still need to be
discussed (talk @ Netdev 0x14). Globally, this patchset contains:

- Patch 1-3: Data plane support for the IOAM Pre-allocated Trace
- Patch 4:   Generic Netlink to configure IOAM from userspace (iproute2)
- Patch 5:   IOAM sysctls documentation

  [1] https://tools.ietf.org/html/draft-ietf-ippm-ioam-data-09
  [2] https://tools.ietf.org/html/draft-ietf-ippm-ioam-ipv6-options-01
  [3] https://www.iana.org/assignments/ipv6-parameters/ipv6-parameters.xhtml#ipv6-parameters-2
  [4] https://github.com/iurmanj/cross-layer-telemetry

Justin Iurman (5):
  ipv6: eh: Introduce removable TLVs
  ipv6: IOAM tunnel decapsulation
  ipv6: ioam: Data plane support for Pre-allocated Trace
  ipv6: ioam: Generic Netlink to configure IOAM
  ipv6: ioam: Documentation for new IOAM sysctls

 Documentation/networking/ioam6-sysctl.rst |  20 +
 Documentation/networking/ip-sysctl.rst    |   5 +
 include/linux/ioam6.h                     |   7 +
 include/linux/ipv6.h                      |   3 +
 include/net/ioam6.h                       |  98 +++
 include/net/netns/ipv6.h                  |   2 +
 include/uapi/linux/in6.h                  |   1 +
 include/uapi/linux/ioam6.h                |  43 ++
 include/uapi/linux/ipv6.h                 |   2 +
 net/ipv6/Makefile                         |   2 +-
 net/ipv6/addrconf.c                       |  20 +
 net/ipv6/af_inet6.c                       |   7 +
 net/ipv6/exthdrs.c                        | 201 +++++-
 net/ipv6/ioam6.c                          | 839 ++++++++++++++++++++++
 net/ipv6/ip6_input.c                      |  22 +
 net/ipv6/sysctl_net_ipv6.c                |   7 +
 16 files changed, 1252 insertions(+), 27 deletions(-)
 create mode 100644 Documentation/networking/ioam6-sysctl.rst
 create mode 100644 include/linux/ioam6.h
 create mode 100644 include/net/ioam6.h
 create mode 100644 include/uapi/linux/ioam6.h
 create mode 100644 net/ipv6/ioam6.c

-- 
2.17.1


^ permalink raw reply	[flat|nested] 42+ messages in thread
* Re: [PATCH net-next 4/5] ipv6: ioam: Generic Netlink to configure IOAM
@ 2020-06-25  0:02 kernel test robot
  0 siblings, 0 replies; 42+ messages in thread
From: kernel test robot @ 2020-06-25  0:02 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 17578 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <20200624192310.16923-5-justin.iurman@uliege.be>
References: <20200624192310.16923-5-justin.iurman@uliege.be>
TO: Justin Iurman <justin.iurman@uliege.be>
TO: netdev(a)vger.kernel.org
CC: davem(a)davemloft.net
CC: justin.iurman(a)uliege.be

Hi Justin,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/Justin-Iurman/Data-plane-support-for-IOAM-Pre-allocated-Trace-with-IPv6/20200625-033536
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 0558c396040734bc1d361919566a581fd41aa539
:::::: branch date: 4 hours ago
:::::: commit date: 4 hours ago
config: microblaze-randconfig-m031-20200624 (attached as .config)
compiler: microblaze-linux-gcc (GCC) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
net/ipv6/ioam6.c:164 ioam6_genl_delns() error: we previously assumed 'ns->schema' could be null (see line 158)
net/ipv6/ioam6.c:358 ioam6_genl_delsc() error: we previously assumed 'sc->ns' could be null (see line 352)

Old smatch warnings:
arch/microblaze/include/asm/thread_info.h:91 current_thread_info() error: uninitialized symbol 'sp'.

# https://github.com/0day-ci/linux/commit/ce303f2d7c40f84739505f1daa7dac53daa6c4c5
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout ce303f2d7c40f84739505f1daa7dac53daa6c4c5
vim +164 net/ipv6/ioam6.c

ce303f2d7c40f8 Justin Iurman 2020-06-24  135  
ce303f2d7c40f8 Justin Iurman 2020-06-24  136  static int ioam6_genl_delns(struct sk_buff *skb, struct genl_info *info)
ce303f2d7c40f8 Justin Iurman 2020-06-24  137  {
ce303f2d7c40f8 Justin Iurman 2020-06-24  138  	struct net *net = genl_info_net(info);
ce303f2d7c40f8 Justin Iurman 2020-06-24  139  	struct ioam6_pernet_data *nsdata;
ce303f2d7c40f8 Justin Iurman 2020-06-24  140  	struct ioam6_namespace *ns;
ce303f2d7c40f8 Justin Iurman 2020-06-24  141  	__be16 ns_id;
ce303f2d7c40f8 Justin Iurman 2020-06-24  142  	int err;
ce303f2d7c40f8 Justin Iurman 2020-06-24  143  
ce303f2d7c40f8 Justin Iurman 2020-06-24  144  	if (!info->attrs[IOAM6_ATTR_NS_ID])
ce303f2d7c40f8 Justin Iurman 2020-06-24  145  		return -EINVAL;
ce303f2d7c40f8 Justin Iurman 2020-06-24  146  
ce303f2d7c40f8 Justin Iurman 2020-06-24  147  	ns_id = cpu_to_be16(nla_get_u16(info->attrs[IOAM6_ATTR_NS_ID]));
ce303f2d7c40f8 Justin Iurman 2020-06-24  148  	nsdata = ioam6_pernet(net);
ce303f2d7c40f8 Justin Iurman 2020-06-24  149  
ce303f2d7c40f8 Justin Iurman 2020-06-24  150  	mutex_lock(&nsdata->lock);
ce303f2d7c40f8 Justin Iurman 2020-06-24  151  
ce303f2d7c40f8 Justin Iurman 2020-06-24  152  	ns = rhashtable_lookup_fast(&nsdata->namespaces, &ns_id, rht_ns_params);
ce303f2d7c40f8 Justin Iurman 2020-06-24  153  	if (!ns) {
ce303f2d7c40f8 Justin Iurman 2020-06-24  154  		err = -ENOENT;
ce303f2d7c40f8 Justin Iurman 2020-06-24  155  		goto out_unlock;
ce303f2d7c40f8 Justin Iurman 2020-06-24  156  	}
ce303f2d7c40f8 Justin Iurman 2020-06-24  157  
ce303f2d7c40f8 Justin Iurman 2020-06-24 @158  	if (ns->schema)
ce303f2d7c40f8 Justin Iurman 2020-06-24  159  		ns->schema->ns = NULL;
ce303f2d7c40f8 Justin Iurman 2020-06-24  160  
ce303f2d7c40f8 Justin Iurman 2020-06-24  161  	err = rhashtable_remove_fast(&nsdata->namespaces, &ns->head,
ce303f2d7c40f8 Justin Iurman 2020-06-24  162  				     rht_ns_params);
ce303f2d7c40f8 Justin Iurman 2020-06-24  163  	if (err) {
ce303f2d7c40f8 Justin Iurman 2020-06-24 @164  		ns->schema->ns = ns;
ce303f2d7c40f8 Justin Iurman 2020-06-24  165  		goto out_unlock;
ce303f2d7c40f8 Justin Iurman 2020-06-24  166  	}
ce303f2d7c40f8 Justin Iurman 2020-06-24  167  
ce303f2d7c40f8 Justin Iurman 2020-06-24  168  	ioam6_ns_release(ns);
ce303f2d7c40f8 Justin Iurman 2020-06-24  169  
ce303f2d7c40f8 Justin Iurman 2020-06-24  170  out_unlock:
ce303f2d7c40f8 Justin Iurman 2020-06-24  171  	mutex_unlock(&nsdata->lock);
ce303f2d7c40f8 Justin Iurman 2020-06-24  172  	return err;
ce303f2d7c40f8 Justin Iurman 2020-06-24  173  }
ce303f2d7c40f8 Justin Iurman 2020-06-24  174  
ce303f2d7c40f8 Justin Iurman 2020-06-24  175  static int __ioam6_genl_dumpns_element(struct ioam6_namespace *ns,
ce303f2d7c40f8 Justin Iurman 2020-06-24  176  				       u32 portid, u32 seq, u32 flags,
ce303f2d7c40f8 Justin Iurman 2020-06-24  177  				       struct sk_buff *skb, u8 cmd)
ce303f2d7c40f8 Justin Iurman 2020-06-24  178  {
ce303f2d7c40f8 Justin Iurman 2020-06-24  179  	void *hdr;
ce303f2d7c40f8 Justin Iurman 2020-06-24  180  	u64 data;
ce303f2d7c40f8 Justin Iurman 2020-06-24  181  
ce303f2d7c40f8 Justin Iurman 2020-06-24  182  	hdr = genlmsg_put(skb, portid, seq, &ioam6_genl_family, flags, cmd);
ce303f2d7c40f8 Justin Iurman 2020-06-24  183  	if (!hdr)
ce303f2d7c40f8 Justin Iurman 2020-06-24  184  		return -ENOMEM;
ce303f2d7c40f8 Justin Iurman 2020-06-24  185  
ce303f2d7c40f8 Justin Iurman 2020-06-24  186  	data = be64_to_cpu(ns->data);
ce303f2d7c40f8 Justin Iurman 2020-06-24  187  
ce303f2d7c40f8 Justin Iurman 2020-06-24  188  	if (nla_put_u16(skb, IOAM6_ATTR_NS_ID, be16_to_cpu(ns->id)) ||
ce303f2d7c40f8 Justin Iurman 2020-06-24  189  	    (data != IOAM6_EMPTY_FIELD_u64 &&
ce303f2d7c40f8 Justin Iurman 2020-06-24  190  	     nla_put_u64_64bit(skb, IOAM6_ATTR_NS_DATA, data, IOAM6_ATTR_PAD)) ||
ce303f2d7c40f8 Justin Iurman 2020-06-24  191  	    (ns->remove_tlv && nla_put_flag(skb, IOAM6_ATTR_NS_POP)) ||
ce303f2d7c40f8 Justin Iurman 2020-06-24  192  	    (ns->schema && nla_put_u32(skb, IOAM6_ATTR_SC_ID, ns->schema->id)))
ce303f2d7c40f8 Justin Iurman 2020-06-24  193  		goto nla_put_failure;
ce303f2d7c40f8 Justin Iurman 2020-06-24  194  
ce303f2d7c40f8 Justin Iurman 2020-06-24  195  	genlmsg_end(skb, hdr);
ce303f2d7c40f8 Justin Iurman 2020-06-24  196  	return 0;
ce303f2d7c40f8 Justin Iurman 2020-06-24  197  
ce303f2d7c40f8 Justin Iurman 2020-06-24  198  nla_put_failure:
ce303f2d7c40f8 Justin Iurman 2020-06-24  199  	genlmsg_cancel(skb, hdr);
ce303f2d7c40f8 Justin Iurman 2020-06-24  200  	return -EMSGSIZE;
ce303f2d7c40f8 Justin Iurman 2020-06-24  201  }
ce303f2d7c40f8 Justin Iurman 2020-06-24  202  
ce303f2d7c40f8 Justin Iurman 2020-06-24  203  static int ioam6_genl_dumpns_start(struct netlink_callback *cb)
ce303f2d7c40f8 Justin Iurman 2020-06-24  204  {
ce303f2d7c40f8 Justin Iurman 2020-06-24  205  	struct net *net = sock_net(cb->skb->sk);
ce303f2d7c40f8 Justin Iurman 2020-06-24  206  	struct ioam6_pernet_data *nsdata;
ce303f2d7c40f8 Justin Iurman 2020-06-24  207  	struct rhashtable_iter *iter;
ce303f2d7c40f8 Justin Iurman 2020-06-24  208  
ce303f2d7c40f8 Justin Iurman 2020-06-24  209  	nsdata = ioam6_pernet(net);
ce303f2d7c40f8 Justin Iurman 2020-06-24  210  	iter = (struct rhashtable_iter *)cb->args[0];
ce303f2d7c40f8 Justin Iurman 2020-06-24  211  
ce303f2d7c40f8 Justin Iurman 2020-06-24  212  	if (!iter) {
ce303f2d7c40f8 Justin Iurman 2020-06-24  213  		iter = kmalloc(sizeof(*iter), GFP_KERNEL);
ce303f2d7c40f8 Justin Iurman 2020-06-24  214  		if (!iter)
ce303f2d7c40f8 Justin Iurman 2020-06-24  215  			return -ENOMEM;
ce303f2d7c40f8 Justin Iurman 2020-06-24  216  
ce303f2d7c40f8 Justin Iurman 2020-06-24  217  		cb->args[0] = (long)iter;
ce303f2d7c40f8 Justin Iurman 2020-06-24  218  	}
ce303f2d7c40f8 Justin Iurman 2020-06-24  219  
ce303f2d7c40f8 Justin Iurman 2020-06-24  220  	rhashtable_walk_enter(&nsdata->namespaces, iter);
ce303f2d7c40f8 Justin Iurman 2020-06-24  221  
ce303f2d7c40f8 Justin Iurman 2020-06-24  222  	return 0;
ce303f2d7c40f8 Justin Iurman 2020-06-24  223  }
ce303f2d7c40f8 Justin Iurman 2020-06-24  224  
ce303f2d7c40f8 Justin Iurman 2020-06-24  225  static int ioam6_genl_dumpns_done(struct netlink_callback *cb)
ce303f2d7c40f8 Justin Iurman 2020-06-24  226  {
ce303f2d7c40f8 Justin Iurman 2020-06-24  227  	struct rhashtable_iter *iter = (struct rhashtable_iter *)cb->args[0];
ce303f2d7c40f8 Justin Iurman 2020-06-24  228  
ce303f2d7c40f8 Justin Iurman 2020-06-24  229  	rhashtable_walk_exit(iter);
ce303f2d7c40f8 Justin Iurman 2020-06-24  230  	kfree(iter);
ce303f2d7c40f8 Justin Iurman 2020-06-24  231  
ce303f2d7c40f8 Justin Iurman 2020-06-24  232  	return 0;
ce303f2d7c40f8 Justin Iurman 2020-06-24  233  }
ce303f2d7c40f8 Justin Iurman 2020-06-24  234  
ce303f2d7c40f8 Justin Iurman 2020-06-24  235  static int ioam6_genl_dumpns(struct sk_buff *skb, struct netlink_callback *cb)
ce303f2d7c40f8 Justin Iurman 2020-06-24  236  {
ce303f2d7c40f8 Justin Iurman 2020-06-24  237  	struct rhashtable_iter *iter = (struct rhashtable_iter *)cb->args[0];
ce303f2d7c40f8 Justin Iurman 2020-06-24  238  	struct ioam6_namespace *ns;
ce303f2d7c40f8 Justin Iurman 2020-06-24  239  	int err;
ce303f2d7c40f8 Justin Iurman 2020-06-24  240  
ce303f2d7c40f8 Justin Iurman 2020-06-24  241  	rhashtable_walk_start(iter);
ce303f2d7c40f8 Justin Iurman 2020-06-24  242  
ce303f2d7c40f8 Justin Iurman 2020-06-24  243  	for (;;) {
ce303f2d7c40f8 Justin Iurman 2020-06-24  244  		ns = rhashtable_walk_next(iter);
ce303f2d7c40f8 Justin Iurman 2020-06-24  245  
ce303f2d7c40f8 Justin Iurman 2020-06-24  246  		if (IS_ERR(ns)) {
ce303f2d7c40f8 Justin Iurman 2020-06-24  247  			if (PTR_ERR(ns) == -EAGAIN)
ce303f2d7c40f8 Justin Iurman 2020-06-24  248  				continue;
ce303f2d7c40f8 Justin Iurman 2020-06-24  249  			err = PTR_ERR(ns);
ce303f2d7c40f8 Justin Iurman 2020-06-24  250  			goto done;
ce303f2d7c40f8 Justin Iurman 2020-06-24  251  		} else if (!ns) {
ce303f2d7c40f8 Justin Iurman 2020-06-24  252  			break;
ce303f2d7c40f8 Justin Iurman 2020-06-24  253  		}
ce303f2d7c40f8 Justin Iurman 2020-06-24  254  
ce303f2d7c40f8 Justin Iurman 2020-06-24  255  		err = __ioam6_genl_dumpns_element(ns,
ce303f2d7c40f8 Justin Iurman 2020-06-24  256  						  NETLINK_CB(cb->skb).portid,
ce303f2d7c40f8 Justin Iurman 2020-06-24  257  						  cb->nlh->nlmsg_seq,
ce303f2d7c40f8 Justin Iurman 2020-06-24  258  						  NLM_F_MULTI,
ce303f2d7c40f8 Justin Iurman 2020-06-24  259  						  skb,
ce303f2d7c40f8 Justin Iurman 2020-06-24  260  						  IOAM6_CMD_DUMP_NAMESPACES);
ce303f2d7c40f8 Justin Iurman 2020-06-24  261  		if (err)
ce303f2d7c40f8 Justin Iurman 2020-06-24  262  			goto done;
ce303f2d7c40f8 Justin Iurman 2020-06-24  263  	}
ce303f2d7c40f8 Justin Iurman 2020-06-24  264  
ce303f2d7c40f8 Justin Iurman 2020-06-24  265  	err = skb->len;
ce303f2d7c40f8 Justin Iurman 2020-06-24  266  
ce303f2d7c40f8 Justin Iurman 2020-06-24  267  done:
ce303f2d7c40f8 Justin Iurman 2020-06-24  268  	rhashtable_walk_stop(iter);
ce303f2d7c40f8 Justin Iurman 2020-06-24  269  	return err;
ce303f2d7c40f8 Justin Iurman 2020-06-24  270  }
ce303f2d7c40f8 Justin Iurman 2020-06-24  271  
ce303f2d7c40f8 Justin Iurman 2020-06-24  272  static int ioam6_genl_addsc(struct sk_buff *skb, struct genl_info *info)
ce303f2d7c40f8 Justin Iurman 2020-06-24  273  {
ce303f2d7c40f8 Justin Iurman 2020-06-24  274  	struct net *net = genl_info_net(info);
ce303f2d7c40f8 Justin Iurman 2020-06-24  275  	struct ioam6_pernet_data *nsdata;
ce303f2d7c40f8 Justin Iurman 2020-06-24  276  	struct ioam6_schema *sc;
ce303f2d7c40f8 Justin Iurman 2020-06-24  277  	int len, pad, err;
ce303f2d7c40f8 Justin Iurman 2020-06-24  278  	u32 sc_id;
ce303f2d7c40f8 Justin Iurman 2020-06-24  279  
ce303f2d7c40f8 Justin Iurman 2020-06-24  280  	if (!info->attrs[IOAM6_ATTR_SC_ID] || !info->attrs[IOAM6_ATTR_SC_DATA])
ce303f2d7c40f8 Justin Iurman 2020-06-24  281  		return -EINVAL;
ce303f2d7c40f8 Justin Iurman 2020-06-24  282  
ce303f2d7c40f8 Justin Iurman 2020-06-24  283  	sc_id = nla_get_u32(info->attrs[IOAM6_ATTR_SC_ID]);
ce303f2d7c40f8 Justin Iurman 2020-06-24  284  	nsdata = ioam6_pernet(net);
ce303f2d7c40f8 Justin Iurman 2020-06-24  285  
ce303f2d7c40f8 Justin Iurman 2020-06-24  286  	mutex_lock(&nsdata->lock);
ce303f2d7c40f8 Justin Iurman 2020-06-24  287  
ce303f2d7c40f8 Justin Iurman 2020-06-24  288  	sc = rhashtable_lookup_fast(&nsdata->schemas, &sc_id, rht_sc_params);
ce303f2d7c40f8 Justin Iurman 2020-06-24  289  	if (sc) {
ce303f2d7c40f8 Justin Iurman 2020-06-24  290  		err = -EEXIST;
ce303f2d7c40f8 Justin Iurman 2020-06-24  291  		goto out_unlock;
ce303f2d7c40f8 Justin Iurman 2020-06-24  292  	}
ce303f2d7c40f8 Justin Iurman 2020-06-24  293  
ce303f2d7c40f8 Justin Iurman 2020-06-24  294  	sc = kzalloc(sizeof(*sc), GFP_KERNEL);
ce303f2d7c40f8 Justin Iurman 2020-06-24  295  	if (!sc) {
ce303f2d7c40f8 Justin Iurman 2020-06-24  296  		err = -ENOMEM;
ce303f2d7c40f8 Justin Iurman 2020-06-24  297  		goto out_unlock;
ce303f2d7c40f8 Justin Iurman 2020-06-24  298  	}
ce303f2d7c40f8 Justin Iurman 2020-06-24  299  
ce303f2d7c40f8 Justin Iurman 2020-06-24  300  	len = nla_len(info->attrs[IOAM6_ATTR_SC_DATA]);
ce303f2d7c40f8 Justin Iurman 2020-06-24  301  	pad = (4 - (len % 4)) % 4;
ce303f2d7c40f8 Justin Iurman 2020-06-24  302  
ce303f2d7c40f8 Justin Iurman 2020-06-24  303  	sc->data = kzalloc(len + pad, GFP_KERNEL);
ce303f2d7c40f8 Justin Iurman 2020-06-24  304  	if (!sc->data) {
ce303f2d7c40f8 Justin Iurman 2020-06-24  305  		err = -ENOMEM;
ce303f2d7c40f8 Justin Iurman 2020-06-24  306  		goto free_sc;
ce303f2d7c40f8 Justin Iurman 2020-06-24  307  	}
ce303f2d7c40f8 Justin Iurman 2020-06-24  308  
ce303f2d7c40f8 Justin Iurman 2020-06-24  309  	sc->id = sc_id;
ce303f2d7c40f8 Justin Iurman 2020-06-24  310  	sc->len = len + pad;
ce303f2d7c40f8 Justin Iurman 2020-06-24  311  	sc->hdr = cpu_to_be32(sc->id | ((u8)(sc->len / 4) << 24));
ce303f2d7c40f8 Justin Iurman 2020-06-24  312  
ce303f2d7c40f8 Justin Iurman 2020-06-24  313  	nla_memcpy(sc->data, info->attrs[IOAM6_ATTR_SC_DATA], len);
ce303f2d7c40f8 Justin Iurman 2020-06-24  314  
ce303f2d7c40f8 Justin Iurman 2020-06-24  315  	err = rhashtable_lookup_insert_fast(&nsdata->schemas, &sc->head,
ce303f2d7c40f8 Justin Iurman 2020-06-24  316  					    rht_sc_params);
ce303f2d7c40f8 Justin Iurman 2020-06-24  317  	if (err)
ce303f2d7c40f8 Justin Iurman 2020-06-24  318  		goto free_data;
ce303f2d7c40f8 Justin Iurman 2020-06-24  319  
ce303f2d7c40f8 Justin Iurman 2020-06-24  320  out_unlock:
ce303f2d7c40f8 Justin Iurman 2020-06-24  321  	mutex_unlock(&nsdata->lock);
ce303f2d7c40f8 Justin Iurman 2020-06-24  322  	return err;
ce303f2d7c40f8 Justin Iurman 2020-06-24  323  free_data:
ce303f2d7c40f8 Justin Iurman 2020-06-24  324  	kfree(sc->data);
ce303f2d7c40f8 Justin Iurman 2020-06-24  325  free_sc:
ce303f2d7c40f8 Justin Iurman 2020-06-24  326  	kfree(sc);
ce303f2d7c40f8 Justin Iurman 2020-06-24  327  	goto out_unlock;
ce303f2d7c40f8 Justin Iurman 2020-06-24  328  }
ce303f2d7c40f8 Justin Iurman 2020-06-24  329  
ce303f2d7c40f8 Justin Iurman 2020-06-24  330  static int ioam6_genl_delsc(struct sk_buff *skb, struct genl_info *info)
ce303f2d7c40f8 Justin Iurman 2020-06-24  331  {
ce303f2d7c40f8 Justin Iurman 2020-06-24  332  	struct net *net = genl_info_net(info);
ce303f2d7c40f8 Justin Iurman 2020-06-24  333  	struct ioam6_pernet_data *nsdata;
ce303f2d7c40f8 Justin Iurman 2020-06-24  334  	struct ioam6_schema *sc;
ce303f2d7c40f8 Justin Iurman 2020-06-24  335  	u32 sc_id;
ce303f2d7c40f8 Justin Iurman 2020-06-24  336  	int err;
ce303f2d7c40f8 Justin Iurman 2020-06-24  337  
ce303f2d7c40f8 Justin Iurman 2020-06-24  338  	if (!info->attrs[IOAM6_ATTR_SC_ID])
ce303f2d7c40f8 Justin Iurman 2020-06-24  339  		return -EINVAL;
ce303f2d7c40f8 Justin Iurman 2020-06-24  340  
ce303f2d7c40f8 Justin Iurman 2020-06-24  341  	sc_id = nla_get_u32(info->attrs[IOAM6_ATTR_SC_ID]);
ce303f2d7c40f8 Justin Iurman 2020-06-24  342  	nsdata = ioam6_pernet(net);
ce303f2d7c40f8 Justin Iurman 2020-06-24  343  
ce303f2d7c40f8 Justin Iurman 2020-06-24  344  	mutex_lock(&nsdata->lock);
ce303f2d7c40f8 Justin Iurman 2020-06-24  345  
ce303f2d7c40f8 Justin Iurman 2020-06-24  346  	sc = rhashtable_lookup_fast(&nsdata->schemas, &sc_id, rht_sc_params);
ce303f2d7c40f8 Justin Iurman 2020-06-24  347  	if (!sc) {
ce303f2d7c40f8 Justin Iurman 2020-06-24  348  		err = -ENOENT;
ce303f2d7c40f8 Justin Iurman 2020-06-24  349  		goto out_unlock;
ce303f2d7c40f8 Justin Iurman 2020-06-24  350  	}
ce303f2d7c40f8 Justin Iurman 2020-06-24  351  
ce303f2d7c40f8 Justin Iurman 2020-06-24 @352  	if (sc->ns)
ce303f2d7c40f8 Justin Iurman 2020-06-24  353  		sc->ns->schema = NULL;
ce303f2d7c40f8 Justin Iurman 2020-06-24  354  
ce303f2d7c40f8 Justin Iurman 2020-06-24  355  	err = rhashtable_remove_fast(&nsdata->schemas, &sc->head,
ce303f2d7c40f8 Justin Iurman 2020-06-24  356  				     rht_sc_params);
ce303f2d7c40f8 Justin Iurman 2020-06-24  357  	if (err) {
ce303f2d7c40f8 Justin Iurman 2020-06-24 @358  		sc->ns->schema = sc;
ce303f2d7c40f8 Justin Iurman 2020-06-24  359  		goto out_unlock;
ce303f2d7c40f8 Justin Iurman 2020-06-24  360  	}
ce303f2d7c40f8 Justin Iurman 2020-06-24  361  
ce303f2d7c40f8 Justin Iurman 2020-06-24  362  	ioam6_sc_release(sc);
ce303f2d7c40f8 Justin Iurman 2020-06-24  363  
ce303f2d7c40f8 Justin Iurman 2020-06-24  364  out_unlock:
ce303f2d7c40f8 Justin Iurman 2020-06-24  365  	mutex_unlock(&nsdata->lock);
ce303f2d7c40f8 Justin Iurman 2020-06-24  366  	return err;
ce303f2d7c40f8 Justin Iurman 2020-06-24  367  }
ce303f2d7c40f8 Justin Iurman 2020-06-24  368  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 26285 bytes --]

^ permalink raw reply	[flat|nested] 42+ messages in thread

end of thread, other threads:[~2020-06-27  4:04 UTC | newest]

Thread overview: 42+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-24 19:23 [PATCH net-next 0/5] Data plane support for IOAM Pre-allocated Trace with IPv6 Justin Iurman
2020-06-24 19:23 ` [PATCH net-next 1/5] ipv6: eh: Introduce removable TLVs Justin Iurman
2020-06-24 20:32   ` Tom Herbert
2020-06-25 17:47     ` Justin Iurman
2020-06-25 20:53       ` Tom Herbert
2020-06-26  8:22         ` Justin Iurman
2020-06-26 15:39           ` Tom Herbert
2020-06-26 17:14             ` Justin Iurman
2020-06-26 18:35               ` Tom Herbert
2020-06-24 19:23 ` [PATCH net-next 2/5] ipv6: IOAM tunnel decapsulation Justin Iurman
2020-06-25  2:32   ` Tom Herbert
2020-06-25 17:56     ` Justin Iurman
2020-06-26  0:48       ` Tom Herbert
2020-06-26  8:31         ` Justin Iurman
2020-06-26 15:52           ` Tom Herbert
2020-06-24 19:23 ` [PATCH net-next 3/5] ipv6: ioam: Data plane support for Pre-allocated Trace Justin Iurman
2020-06-24 21:37   ` kernel test robot
2020-06-24 21:37     ` kernel test robot
2020-06-24 23:11   ` kernel test robot
2020-06-24 23:11     ` kernel test robot
2020-06-24 23:11   ` [RFC PATCH] ipv6: ioam: ioam6_fill_trace_data_node() can be static kernel test robot
2020-06-24 23:11     ` kernel test robot
2020-06-25  2:42   ` [PATCH net-next 3/5] ipv6: ioam: Data plane support for Pre-allocated Trace Tom Herbert
2020-06-25 14:29   ` Tom Herbert
2020-06-25 18:23     ` Justin Iurman
2020-06-25 20:32       ` Tom Herbert
2020-06-26  8:13         ` Justin Iurman
2020-06-26 14:53           ` Tom Herbert
2020-06-24 19:23 ` [PATCH net-next 4/5] ipv6: ioam: Generic Netlink to configure IOAM Justin Iurman
2020-06-25 10:52   ` Dan Carpenter
2020-06-25 10:52     ` Dan Carpenter
2020-06-25 10:52     ` Dan Carpenter
2020-06-26  8:54     ` [PATCH net-next] Fix unchecked dereference Justin Iurman
2020-06-26 16:01       ` Jakub Kicinski
2020-06-26 16:01         ` Jakub Kicinski
2020-06-26 17:23         ` Justin Iurman
2020-06-27  4:04           ` Jakub Kicinski
2020-06-27  4:04             ` Jakub Kicinski
2020-06-24 19:23 ` [PATCH net-next 5/5] ipv6: ioam: Documentation for new IOAM sysctls Justin Iurman
2020-06-25  2:53   ` Tom Herbert
2020-06-25 18:00     ` Justin Iurman
  -- strict thread matches above, loose matches on Subject: below --
2020-06-25  0:02 [PATCH net-next 4/5] ipv6: ioam: Generic Netlink to configure IOAM kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.