1. 21 Jul, 2021 21 commits
    • Eric Dumazet's avatar
      tcp: tweak len/truesize ratio for coalesce candidates · 240bfd13
      Eric Dumazet authored
      tcp_grow_window() is using skb->len/skb->truesize to increase tp->rcv_ssthresh
      which has a direct impact on advertized window sizes.
      
      We added TCP coalescing in linux-3.4 & linux-3.5:
      
      Instead of storing skbs with one or two MSS in receive queue (or OFO queue),
      we try to append segments together to reduce memory overhead.
      
      High performance network drivers tend to cook skb with 3 parts :
      
      1) sk_buff structure (256 bytes)
      2) skb->head contains room to copy headers as needed, and skb_shared_info
      3) page fragment(s) containing the ~1514 bytes frame (or more depending on MTU)
      
      Once coalesced into a previous skb, 1) and 2) are freed.
      
      We can therefore tweak the way we compute len/truesize ratio knowing
      that skb->truesize is inflated by 1) and 2) soon to be freed.
      
      This is done only for in-order skb, or skb coalesced into OFO queue.
      
      The result is that low rate flows no longer pay the memory price of having
      low GRO aggregation factor. Same result for drivers not using GRO.
      
      This is critical to allow a big enough receiver window,
      typically tcp_rmem[2] / 2.
      
      We have been using this at Google for about 5 years, it is due time
      to make it upstream.
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Cc: Soheil Hassas Yeganeh <soheil@google.com>
      Cc: Neal Cardwell <ncardwell@google.com>
      Cc: Yuchung Cheng <ycheng@google.com>
      Acked-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      240bfd13
    • Nikolay Aleksandrov's avatar
      net: bridge: multicast: fix igmp/mld port context null pointer dereferences · 54cb4319
      Nikolay Aleksandrov authored
      With the recent change to use bridge/port multicast context pointers
      instead of bridge/port I missed to convert two locations which pass the
      port pointer as-is, but with the new model we need to verify the port
      context is non-NULL first and retrieve the port from it. The first
      location is when doing querier selection when a query is received, the
      second location is when leaving a group. The port context will be null
      if the packets originated from the bridge device (i.e. from the host).
      The fix is simple just check if the port context exists and retrieve
      the port pointer from it.
      
      Fixes: adc47037 ("net: bridge: multicast: use multicast contexts instead of bridge or port")
      Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      54cb4319
    • Leon Romanovsky's avatar
      ionic: drop useless check of PCI driver data validity · 524df92c
      Leon Romanovsky authored
      The driver core will call to .remove callback only if .probe succeeded
      and it will ensure that driver data has pointer to struct ionic.
      
      There is no need to check it again.
      
      Fixes: fbfb8031 ("ionic: Add hardware init and device commands")
      Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Acked-by: default avatarShannon Nelson <snelson@pensando.io>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      524df92c
    • Eric Dumazet's avatar
      tcp: avoid indirect call in tcp_new_space() · 739b2adf
      Eric Dumazet authored
      For tcp sockets, sk->sk_write_space is most probably sk_stream_write_space().
      
      Other sk->sk_write_space() calls in TCP are slow path and do not deserve
      any change.
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      739b2adf
    • Andy Shevchenko's avatar
      net: wwan: iosm: Switch to use module_pci_driver() macro · 7f8b20d0
      Andy Shevchenko authored
      Eliminate some boilerplate code by using module_pci_driver() instead of
      init/exit, moving the salient bits from init into probe.
      Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
      Reviewed-by: default avatarLoic Poulain <loic.poulain@linaro.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      7f8b20d0
    • Dongliang Mu's avatar
      usb: hso: remove the bailout parameter · dcb713d5
      Dongliang Mu authored
      There are two invocation sites of hso_free_net_device. After
      refactoring hso_create_net_device, this parameter is useless.
      Remove the bailout in the hso_free_net_device and change the invocation
      sites of this function.
      Signed-off-by: default avatarDongliang Mu <mudongliangabcd@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      dcb713d5
    • Dongliang Mu's avatar
      usb: hso: fix error handling code of hso_create_net_device · 788e67f1
      Dongliang Mu authored
      The current error handling code of hso_create_net_device is
      hso_free_net_device, no matter which errors lead to. For example,
      WARNING in hso_free_net_device [1].
      
      Fix this by refactoring the error handling code of
      hso_create_net_device by handling different errors by different code.
      
      [1] https://syzkaller.appspot.com/bug?id=66eff8d49af1b28370ad342787413e35bbe76efe
      
      Reported-by: syzbot+44d53c7255bb1aea22d2@syzkaller.appspotmail.com
      Fixes: 5fcfb6d0 ("hso: fix bailout in error case of probe")
      Signed-off-by: default avatarDongliang Mu <mudongliangabcd@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      788e67f1
    • Piotr Kwapulinski's avatar
      i40e: add support for PTP external synchronization clock · 10507130
      Piotr Kwapulinski authored
      Add support for external synchronization clock via GPIOs.
      1PPS signals are handled via the dedicated 3 GPIOs: SDP3_2,
      SDP3_3 and GPIO_4.
      Previously it was not possible to use the external PTP
      synchronization clock.
      All possible HW configurations are supported.
      	SDP3_2,	SDP3_3,	GPIO_4
      	off,	off,	off
      	off,	in_A,	off
      	off,	out_A,	off
      	off,	in_B,	off
      	off,	out_B,	off
      	in_A,	off,	off
      	in_A,	in_B,	off
      	in_A,	out_B,	off
      	out_A,	off,	off
      	out_A,	in_B,	off
      	in_B,	off,	off
      	in_B,	in_A,	off
      	in_B,	out_A,	off
      	out_B,	off,	off
      	out_B,	in_A,	off
      	off,	off,	in_A
      	off,	out_A,	in_A
      	off,	in_B,	in_A
      	off,	out_B,	in_A
      	out_A,	off,	in_A
      	out_A,	in_B,	in_A
      	in_B,	off,	in_A
      	in_B,	out_A,	in_A
      	out_B,	off,	in_A
      	off,	off,	out_A
      	off,	in_A,	out_A
      	off,	in_B,	out_A
      	off,	out_B,	out_A
      	in_A,	off,	out_A
      	in_A,	in_B,	out_A
      	in_A,	out_B,	out_A
      	in_B,	off,	out_A
      	in_B,	in_A,	out_A
      	out_B,	off,	out_A
      	out_B,	in_A,	out_A
      	off,	off,	in_B
      	off,	in_A,	in_B
      	off,	out_A,	in_B
      	off,	out_B,	in_B
      	in_A,	off,	in_B
      	in_A,	out_B,	in_B
      	out_A,	off,	in_B
      	out_B,	off,	in_B
      	out_B,	in_A,	in_B
      	off,	off,	out_B
      	off,	in_A,	out_B
      	off,	out_A,	out_B
      	off,	in_B,	out_B
      	in_A,	off,	out_B
      	in_A,	in_B,	out_B
      	out_A,	off,	out_B
      	out_A,	in_B,	out_B
      	in_B,	off,	out_B
      	in_B,	in_A,	out_B
      	in_B,	out_A,	out_B
      
      Tested with oscilloscope, 1PPS generator and ts2phc.
      Reviewed-by: default avatarAleksandr Loktionov <aleksandr.loktionov@intel.com>
      Reviewed-by: default avatarArkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>
      Signed-off-by: default avatarPiotr Kwapulinski <piotr.kwapulinski@intel.com>
      Tested-by: default avatarAshish K <ashishx.k@intel.com>
      Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      10507130
    • Vadim Fedorenko's avatar
      net: ipv4: Consolidate ipv4_mtu and ip_dst_mtu_maybe_forward · ac6627a2
      Vadim Fedorenko authored
      Consolidate IPv4 MTU code the same way it is done in IPv6 to have code
      aligned in both address families
      Signed-off-by: default avatarVadim Fedorenko <vfedorenko@novek.ru>
      Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      ac6627a2
    • Vadim Fedorenko's avatar
      net: ipv6: introduce ip6_dst_mtu_maybe_forward · 427faee1
      Vadim Fedorenko authored
      Replace ip6_dst_mtu_forward with ip6_dst_mtu_maybe_forward and
      reuse this code in ip6_mtu. Actually these two functions were
      almost duplicates, this change will simplify the maintaince of
      mtu calculation code.
      Signed-off-by: default avatarVadim Fedorenko <vfedorenko@novek.ru>
      Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      427faee1
    • David S. Miller's avatar
      Merge branch 'ipv6-ioam' · 7c804e91
      David S. Miller authored
      Justin Iurman says:
      
      ====================
      Support for the IOAM Pre-allocated Trace with IPv6
      
      v5:
       - Refine types, min/max and default values for new sysctls
       - Introduce a "_wide" sysctl for each "ioam6_id" sysctl
       - Add more validation on headers before processing data
       - RCU for sc <> ns pointers + appropriate accessors
       - Generic Netlink policies are now per op, not per family anymore
       - Address other comments/remarks from Jakub (thanks again)
       - Revert "__packed" to "__attribute__((packed))" for uapi headers
       - Add tests to cover the functionality added, as requested by David Ahern
      
      v4:
       - Address warnings from checkpatch (ignore errors related to unnamed bitfields
         in the first patch)
       - Use of hweight32 (thanks Jakub)
       - Remove inline keyword from static functions in C files and let the compiler
         decide what to do (thanks Jakub)
      
      v3:
       - Fix warning "unused label 'out_unregister_genl'" by adding conditional macro
       - Fix lwtunnel output redirect bug: dst cache useless in this case, use
         orig_output instead
      
      v2:
       - Fix warning with static for __ioam6_fill_trace_data
       - Fix sparse warning with __force when casting __be64 to __be32
       - Fix unchecked dereference when removing IOAM namespaces or schemas
       - exthdrs.c: Don't drop by default (now: ignore) to match the act bits "00"
       - Add control plane support for the inline insertion (lwtunnel)
       - Provide uapi structures
       - Use __net_timestamp if skb->tstamp is empty
       - Add note about the temporary IANA allocation
       - Remove support for "removable" TLVs
       - Remove support for virtual/anonymous tunnel decapsulation
      
      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 [1]. IOAM data fields can be encapsulated
      into a variety of protocols. The IPv6 encapsulation is defined in
      draft-ietf-ippm-ioam-ipv6-options [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.
      
      This patchset also provides support for the control plane part, but only for the
      inline insertion (host-to-host use case), through lightweight tunnels. Indeed,
      for in-transit traffic, the solution is to have an IPv6-in-IPv6 encapsulation,
      which brings some difficulties and still requires a little bit of work and
      discussion (ie anonymous tunnel decapsulation and multi egress resolution).
      
      - Patch 1: IPv6 IOAM headers definition
      - Patch 2: Data plane support for Pre-allocated Trace
      - Patch 3: IOAM Generic Netlink API
      - Patch 4: Support for IOAM injection with lwtunnels
      - Patch 5: Documentation for new IOAM sysctls
      - Patch 6: Test for the IOAM insertion with IPv6
      
        [1] https://tools.ietf.org/html/draft-ietf-ippm-ioam-data
        [2] https://tools.ietf.org/html/draft-ietf-ippm-ioam-ipv6-options
        [3] https://www.iana.org/assignments/ipv6-parameters/ipv6-parameters.xhtml#ipv6-parameters-2
        [4] https://github.com/iurmanj/cross-layer-telemetry
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      7c804e91
    • Justin Iurman's avatar
      selftests: net: Test for the IOAM insertion with IPv6 · 968691c7
      Justin Iurman authored
      This test evaluates the IOAM insertion for IPv6 by checking the IOAM data
      integrity on the receiver.
      
      The topology is formed by 3 nodes: Alpha (sender), Beta (router in-between)
      and Gamma (receiver). An IOAM domain is configured from Alpha to Gamma only,
      which means not on the reverse path. When Gamma is the destination, Alpha
      adds an IOAM option (Pre-allocated Trace) inside a Hop-by-hop and fills the
      trace with its own IOAM data. Beta and Gamma also fill the trace. The IOAM
      data integrity is checked on Gamma, by comparing with the pre-defined IOAM
      configuration (see below).
      
          +-------------------+            +-------------------+
          |                   |            |                   |
          |    alpha netns    |            |    gamma netns    |
          |                   |            |                   |
          |  +-------------+  |            |  +-------------+  |
          |  |    veth0    |  |            |  |    veth0    |  |
          |  |  db01::2/64 |  |            |  |  db02::2/64 |  |
          |  +-------------+  |            |  +-------------+  |
          |         .         |            |         .         |
          +-------------------+            +-------------------+
                    .                                .
                    .                                .
                    .                                .
          +----------------------------------------------------+
          |         .                                .         |
          |  +-------------+                  +-------------+  |
          |  |    veth0    |                  |    veth1    |  |
          |  |  db01::1/64 | ................ |  db02::1/64 |  |
          |  +-------------+                  +-------------+  |
          |                                                    |
          |                      beta netns                    |
          |                                                    |
          +--------------------------+-------------------------+
      
      ~~~~~~~~~~~~~~~~~~~~~~
      | IOAM configuration |
      ~~~~~~~~~~~~~~~~~~~~~~
      
      Alpha
      +-----------------------------------------------------------+
      | Type                | Value                               |
      +-----------------------------------------------------------+
      | Node ID             | 1                                   |
      +-----------------------------------------------------------+
      | Node Wide ID        | 11111111                            |
      +-----------------------------------------------------------+
      | Ingress ID          | 0xffff (default value)              |
      +-----------------------------------------------------------+
      | Ingress Wide ID     | 0xffffffff (default value)          |
      +-----------------------------------------------------------+
      | Egress ID           | 101                                 |
      +-----------------------------------------------------------+
      | Egress Wide ID      | 101101                              |
      +-----------------------------------------------------------+
      | Namespace Data      | 0xdeadbee0                          |
      +-----------------------------------------------------------+
      | Namespace Wide Data | 0xcafec0caf00dc0de                  |
      +-----------------------------------------------------------+
      | Schema ID           | 777                                 |
      +-----------------------------------------------------------+
      | Schema Data         | something that will be 4n-aligned   |
      +-----------------------------------------------------------+
      
      Note: When Gamma is the destination, Alpha adds an IOAM Pre-allocated Trace
            option inside a Hop-by-hop, where 164 bytes are pre-allocated for the
            trace, with 123 as the IOAM-Namespace and with 0xfff00200 as the trace
            type (= all available options at this time). As a result, and based on
            IOAM configurations here, only both Alpha and Beta should be capable of
            inserting their IOAM data while Gamma won't have enough space and will
            set the overflow bit.
      
      Beta
      +-----------------------------------------------------------+
      | Type                | Value                               |
      +-----------------------------------------------------------+
      | Node ID             | 2                                   |
      +-----------------------------------------------------------+
      | Node Wide ID        | 22222222                            |
      +-----------------------------------------------------------+
      | Ingress ID          | 201                                 |
      +-----------------------------------------------------------+
      | Ingress Wide ID     | 201201                              |
      +-----------------------------------------------------------+
      | Egress ID           | 202                                 |
      +-----------------------------------------------------------+
      | Egress Wide ID      | 202202                              |
      +-----------------------------------------------------------+
      | Namespace Data      | 0xdeadbee1                          |
      +-----------------------------------------------------------+
      | Namespace Wide Data | 0xcafec0caf11dc0de                  |
      +-----------------------------------------------------------+
      | Schema ID           | 0xffffff (= None)                   |
      +-----------------------------------------------------------+
      | Schema Data         |                                     |
      +-----------------------------------------------------------+
      
      Gamma
      +-----------------------------------------------------------+
      | Type                | Value                               |
      +-----------------------------------------------------------+
      | Node ID             | 3                                   |
      +-----------------------------------------------------------+
      | Node Wide ID        | 33333333                            |
      +-----------------------------------------------------------+
      | Ingress ID          | 301                                 |
      +-----------------------------------------------------------+
      | Ingress Wide ID     | 301301                              |
      +-----------------------------------------------------------+
      | Egress ID           | 0xffff (default value)              |
      +-----------------------------------------------------------+
      | Egress Wide ID      | 0xffffffff (default value)          |
      +-----------------------------------------------------------+
      | Namespace Data      | 0xdeadbee2                          |
      +-----------------------------------------------------------+
      | Namespace Wide Data | 0xcafec0caf22dc0de                  |
      +-----------------------------------------------------------+
      | Schema ID           | 0xffffff (= None)                   |
      +-----------------------------------------------------------+
      | Schema Data         |                                     |
      +-----------------------------------------------------------+
      Signed-off-by: default avatarJustin Iurman <justin.iurman@uliege.be>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      968691c7
    • Justin Iurman's avatar
      ipv6: ioam: Documentation for new IOAM sysctls · de8e80a5
      Justin Iurman authored
      Add documentation for new IOAM sysctls:
       - ioam6_id and ioam6_id_wide: two per-namespace sysctls
       - ioam6_enabled, ioam6_id and ioam6_id_wide: three per-interface sysctls
      
      Example of IOAM configuration based on the following simple topology:
      
       _____              _____              _____
      |     | eth0  eth0 |     | eth1  eth0 |     |
      |  A  |.----------.|  B  |.----------.|  C  |
      |_____|            |_____|            |_____|
      
      1) Node and interface IDs can be configured for IOAM:
      
        # IOAM ID of A = 1, IOAM ID of A.eth0 = 11
        (A) sysctl -w net.ipv6.ioam6_id=1
        (A) sysctl -w net.ipv6.conf.eth0.ioam6_id=11
      
        # IOAM ID of B = 2, IOAM ID of B.eth0 = 21, IOAM ID of B.eth1 = 22
        (B) sysctl -w net.ipv6.ioam6_id=2
        (B) sysctl -w net.ipv6.conf.eth0.ioam6_id=21
        (B) sysctl -w net.ipv6.conf.eth1.ioam6_id=22
      
        # IOAM ID of C = 3, IOAM ID of C.eth0 = 31
        (C) sysctl -w net.ipv6.ioam6_id=3
        (C) sysctl -w net.ipv6.conf.eth0.ioam6_id=31
      
        Note that "_wide" IDs equivalents can be configured the same way.
      
      2) Each node can be configured to form an IOAM domain. For instance,
         we allow IOAM from A to C only (not the reverse path), i.e. enable
         IOAM on ingress for B.eth0 and C.eth0:
      
        (B) sysctl -w net.ipv6.conf.eth0.ioam6_enabled=1
        (C) sysctl -w net.ipv6.conf.eth0.ioam6_enabled=1
      
      3) An IOAM domain (e.g. ID=123) is defined and made known to each node:
      
        (A) ip ioam namespace add 123
        (B) ip ioam namespace add 123
        (C) ip ioam namespace add 123
      
      4) Finally, an IOAM Pre-allocated Trace can be inserted in traffic sent
         by A when C (e.g. db02::2) is the destination:
      
        (A) ip -6 route add db02::2/128 encap ioam6 trace type 0x800000 ns 123
            size 12 dev eth0
      Signed-off-by: default avatarJustin Iurman <justin.iurman@uliege.be>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      de8e80a5
    • Justin Iurman's avatar
      ipv6: ioam: Support for IOAM injection with lwtunnels · 3edede08
      Justin Iurman authored
      Add support for the IOAM inline insertion (only for the host-to-host use case)
      which is per-route configured with lightweight tunnels. The target is iproute2
      and the patch is ready. It will be posted as soon as this patchset is merged.
      Here is an overview:
      
      $ ip -6 ro ad fc00::1/128 encap ioam6 trace type 0x800000 ns 1 size 12 dev eth0
      
      This example configures an IOAM Pre-allocated Trace option attached to the
      fc00::1/128 prefix. The IOAM namespace (ns) is 1, the size of the pre-allocated
      trace data block is 12 octets (size) and only the first IOAM data (bit 0:
      hop_limit + node id) is included in the trace (type) represented as a bitfield.
      
      The reason why the in-transit (IPv6-in-IPv6 encapsulation) use case is not
      implemented is explained on the patchset cover.
      Signed-off-by: default avatarJustin Iurman <justin.iurman@uliege.be>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      3edede08
    • Justin Iurman's avatar
      ipv6: ioam: IOAM Generic Netlink API · 8c6f6fa6
      Justin Iurman authored
      Add Generic Netlink commands to allow userspace to configure IOAM
      namespaces and schemas. The target is iproute2 and the patch is ready.
      It will be posted as soon as this patchset is merged. Here is an overview:
      
      $ ip ioam
      Usage:	ip ioam { COMMAND | help }
      	ip ioam namespace show
      	ip ioam namespace add ID [ data DATA32 ] [ wide DATA64 ]
      	ip ioam namespace del ID
      	ip ioam schema show
      	ip ioam schema add ID DATA
      	ip ioam schema del ID
      	ip ioam namespace set ID schema { ID | none }
      Signed-off-by: default avatarJustin Iurman <justin.iurman@uliege.be>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      8c6f6fa6
    • Justin Iurman's avatar
      ipv6: ioam: Data plane support for Pre-allocated Trace · 9ee11f0f
      Justin Iurman authored
      Implement support for processing the IOAM Pre-allocated Trace with IPv6,
      see [1] and [2]. Introduce a new IPv6 Hop-by-Hop TLV option, see IANA [3].
      
      A new per-interface sysctl is introduced. The value is a boolean to accept (=1)
      or ignore (=0, by default) IPv6 IOAM options on ingress for an interface:
       - net.ipv6.conf.XXX.ioam6_enabled
      
      Two other sysctls are introduced to define IOAM IDs, represented by an integer.
      They are respectively per-namespace and per-interface:
       - net.ipv6.ioam6_id
       - net.ipv6.conf.XXX.ioam6_id
      
      The value of the first one represents the IOAM ID of the node itself (u32; max
      and default value = U32_MAX>>8, due to hop limit concatenation) while the other
      represents the IOAM ID of an interface (u16; max and default value = U16_MAX).
      
      Each "ioam6_id" sysctl has a "_wide" equivalent:
       - net.ipv6.ioam6_id_wide
       - net.ipv6.conf.XXX.ioam6_id_wide
      
      The value of the first one represents the wide IOAM ID of the node itself (u64;
      max and default value = U64_MAX>>8, due to hop limit concatenation) while the
      other represents the wide IOAM ID of an interface (u32; max and default value
      = U32_MAX).
      
      The use of short and wide equivalents is not exclusive, a deployment could
      choose to leverage both. For example, net.ipv6.conf.XXX.ioam6_id (short format)
      could be an identifier for a physical interface, whereas
      net.ipv6.conf.XXX.ioam6_id_wide (wide format) could be an identifier for a
      logical sub-interface. Documentation about new sysctls is provided at the end
      of this patchset.
      
      Two relativistic hash tables are used: one for IOAM namespaces, the other for
      IOAM schemas. A namespace can only have a single active schema and a schema
      can only be attached to a single namespace (1:1 relationship).
      
        [1] https://tools.ietf.org/html/draft-ietf-ippm-ioam-ipv6-options
        [2] https://tools.ietf.org/html/draft-ietf-ippm-ioam-data
        [3] https://www.iana.org/assignments/ipv6-parameters/ipv6-parameters.xhtml#ipv6-parameters-2Signed-off-by: default avatarJustin Iurman <justin.iurman@uliege.be>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      9ee11f0f
    • Justin Iurman's avatar
      uapi: IPv6 IOAM headers definition · db67f219
      Justin Iurman authored
      This patch provides the IPv6 IOAM option header [1] as well as the IOAM
      Trace header [2]. An IOAM option must be 4n-aligned. Here is an overview of
      a Hop-by-Hop with an IOAM Trace option:
      
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  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 [n]                         |  |
      |                                                               |  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  D
      |                                                               |  a
      |                         node data [n-1]                       |  t
      |                                                               |  a
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ~                             ...                               ~  S
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  p
      |                                                               |  a
      |                         node data [1]                         |  c
      |                                                               |  e
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  |
      |                                                               |  |
      |                         node data [0]                         |  |
      |                                                               |  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<-+
      
      The IOAM option header starts at "Option Type" and ends after "IOAM
      Type". The IOAM Trace header starts at "Namespace-ID" and ends after
      "IOAM-Trace-Type/Reserved".
      
      IOAM Type: either Pre-allocated Trace (=0), Incremental Trace (=1),
      Proof-of-Transit (=2) or Edge-to-Edge (=3). Note that both the
      Pre-allocated Trace and the Incremental Trace look the same. The two
      others are not implemented.
      
      Namespace-ID: IOAM namespace identifier, not to be confused with network
      namespaces. It adds further context to IOAM options and associated data,
      and allows devices which are IOAM capable to determine whether IOAM
      options must be processed or ignored. It can also be used by an operator
      to distinguish different operational domains or to identify different
      sets of devices.
      
      NodeLen: Length of data added by each node. It depends on the Trace
      Type.
      
      Flags: Only the Overflow (O) flag for now. The O flag is set by a
      transit node when there are not enough octets left to record its data.
      
      RemainingLen: Remaining free space to record data.
      
      IOAM-Trace-Type: Bit field where each bit corresponds to a specific kind
      of IOAM data. See [2] for a detailed list.
      
        [1] https://tools.ietf.org/html/draft-ietf-ippm-ioam-ipv6-options
        [2] https://tools.ietf.org/html/draft-ietf-ippm-ioam-dataSigned-off-by: default avatarJustin Iurman <justin.iurman@uliege.be>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      db67f219
    • Vladimir Oltean's avatar
      net: switchdev: recurse into __switchdev_handle_fdb_del_to_device · 71f4f89a
      Vladimir Oltean authored
      The difference between __switchdev_handle_fdb_del_to_device and
      switchdev_handle_del_to_device is that the former takes an extra
      orig_dev argument, while the latter starts with dev == orig_dev.
      
      We should recurse into the variant that does not lose the orig_dev along
      the way. This is relevant when deleting FDB entries pointing towards a
      bridge (dev changes to the lower interfaces, but orig_dev shouldn't).
      
      The addition helper already recurses properly, just the deletion one
      doesn't.
      
      Fixes: 8ca07176 ("net: switchdev: introduce a fanout helper for SWITCHDEV_FDB_{ADD,DEL}_TO_DEVICE")
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      71f4f89a
    • Vladimir Oltean's avatar
      net: switchdev: remove stray semicolon in switchdev_handle_fdb_del_to_device shim · 94111dfc
      Vladimir Oltean authored
      With the semicolon at the end, the compiler sees the shim function as a
      declaration and not as a definition, and warns:
      
      'switchdev_handle_fdb_del_to_device' declared 'static' but never defined
      Reported-by: default avatarkernel test robot <lkp@intel.com>
      Fixes: 8ca07176 ("net: switchdev: introduce a fanout helper for SWITCHDEV_FDB_{ADD,DEL}_TO_DEVICE")
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Tested-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      94111dfc
    • Vladimir Oltean's avatar
      net: phy: at803x: finish the phy id checking simplification · f5621a01
      Vladimir Oltean authored
      The blamed commit was probably not tested on net-next, since it did not
      refactor the extra phy id check introduced in commit b856150c ("net:
      phy: at803x: mask 1000 Base-X link mode").
      
      Fixes: 8887ca54 ("net: phy: at803x: simplify custom phy id matching")
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Acked-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      f5621a01
    • Russell King (Oracle)'s avatar
      net: phylink: cleanup ksettings_set · 7cefb0b0
      Russell King (Oracle) authored
      We only need to fiddle about with the supported mask after we have
      validated the user's requested parameters. Simplify and streamline the
      code by moving the linkmode copy and update of the autoneg bit after
      validating the user's request.
      Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      7cefb0b0
  2. 20 Jul, 2021 19 commits