Changes in 4.9.224 USB: serial: qcserial: Add DW5816e support dp83640: reverse arguments to list_add_tail fq_codel: fix TCA_FQ_CODEL_DROP_BATCH_SIZE sanity checks net: macsec: preserve ingress frame ordering net/mlx4_core: Fix use of ENOSPC around mlx4_counter_alloc() net: usb: qmi_wwan: add support for DW5816e sch_choke: avoid potential panic in choke_reset() sch_sfq: validate silly quantum values bnxt_en: Fix VLAN acceleration handling in bnxt_fix_features(). net/mlx5: Fix forced completion access non initialized command entry net/mlx5: Fix command entry leak in Internal Error State bnxt_en: Improve AER slot reset. Revert "ACPI / video: Add force_native quirk for HP Pavilion dv6" binfmt_elf: move brk out of mmap when doing direct loader exec USB: uas: add quirk for LaCie 2Big Quadra USB: serial: garmin_gps: add sanity checking for data length tracing: Add a vmalloc_sync_mappings() for safe measure mm/page_alloc: fix watchdog soft lockups during set_zone_contiguous() batman-adv: fix batadv_nc_random_weight_tq batman-adv: Fix refcnt leak in batadv_show_throughput_override batman-adv: Fix refcnt leak in batadv_store_throughput_override batman-adv: Fix refcnt leak in batadv_v_ogm_process objtool: Fix stack offset tracking for indirect CFAs scripts/decodecode: fix trapping instruction formatting binfmt_elf: Do not move brk for INTERP-less ET_EXEC ext4: add cond_resched() to ext4_protect_reserved_inode net: ipv6: add net argument to ip6_dst_lookup_flow net: ipv6_stub: use ip6_dst_lookup_flow instead of ip6_dst_lookup blktrace: Fix potential deadlock between delete & sysfs ops blktrace: fix unlocked access to init/start-stop/teardown blktrace: fix trace mutex deadlock blktrace: Protect q->blk_trace with RCU blktrace: fix dereference after null check ptp: do not explicitly set drvdata in ptp_clock_register() ptp: use is_visible method to hide unused attributes ptp: create "pins" together with the rest of attributes chardev: add helper function to register char devs with a struct device ptp: Fix pass zero to ERR_PTR() in ptp_clock_register ptp: fix the race between the release of ptp_clock and cdev ptp: free ptp device pin descriptors properly shmem: fix possible deadlocks on shmlock_user_lock net/sonic: Fix a resource leak in an error handling path in 'jazz_sonic_probe()' net: moxa: Fix a potential double 'free_irq()' drop_monitor: work around gcc-10 stringop-overflow warning scsi: sg: add sg_remove_request in sg_write spi: spi-dw: Add lock protect dw_spi rx/tx to prevent concurrent calls cifs: Check for timeout on Negotiate stage cifs: Fix a race condition with cifs_echo_request dmaengine: pch_dma.c: Avoid data race between probe and irq handler dmaengine: mmp_tdma: Reset channel error on release ALSA: hda/hdmi: fix race in monitor detection during probe drm/qxl: lost qxl_bo_kunmap_atomic_page in qxl_image_init_helper() ipc/util.c: sysvipc_find_ipc() incorrectly updates position index pinctrl: cherryview: Add missing spinlock usage in chv_gpio_irq_handler i40iw: Fix error handling in i40iw_manage_arp_cache() netfilter: conntrack: avoid gcc-10 zero-length-bounds warning IB/mlx4: Test return value of calls to ib_get_cached_pkey pnp: Use list_for_each_entry() instead of open coding gcc-10 warnings: fix low-hanging fruit kbuild: compute false-positive -Wmaybe-uninitialized cases in Kconfig Stop the ad-hoc games with -Wno-maybe-initialized net: phy: micrel: Use strlcpy() for ethtool::get_strings gcc-10: avoid shadowing standard library 'free()' in crypto gcc-10: disable 'zero-length-bounds' warning for now gcc-10: disable 'array-bounds' warning for now gcc-10: disable 'stringop-overflow' warning for now gcc-10: disable 'restrict' warning for now net: fix a potential recursive NETDEV_FEAT_CHANGE netlabel: cope with NULL catmap Revert "ipv6: add mtu lock check in __ip6_rt_update_pmtu" net: ipv4: really enforce backoff for redirects netprio_cgroup: Fix unlimited memory leak of v2 cgroups ALSA: hda/realtek - Limit int mic boost for Thinkpad T530 ALSA: rawmidi: Initialize allocated buffers ALSA: rawmidi: Fix racy buffer resize under concurrent accesses ALSA: usb-audio: Add control message quirk delay for Kingston HyperX headset USB: gadget: fix illegal array access in binding with UDC usb: xhci: Fix NULL pointer dereference when enqueuing trbs from urb sg list ARM: dts: imx27-phytec-phycard-s-rdk: Fix the I2C1 pinctrl entries x86: Fix early boot crash on gcc-10, third try exec: Move would_dump into flush_old_exec usb: gadget: net2272: Fix a memory leak in an error handling path in 'net2272_plat_probe()' usb: gadget: audio: Fix a missing error return value in audio_bind() usb: gadget: legacy: fix error return code in gncm_bind() usb: gadget: legacy: fix error return code in cdc_bind() Revert "ALSA: hda/realtek: Fix pop noise on ALC225" ARM: dts: r8a73a4: Add missing CMT1 interrupts ARM: dts: r8a7740: Add missing extal2 to CPG node KVM: x86: Fix off-by-one error in kvm_vcpu_ioctl_x86_setup_mce Makefile: disallow data races on gcc-10 as well Linux 4.9.224 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ib9fdff8dd9e9c92a2e750251b98eb0e4c9496fba
175 lines
5.4 KiB
C
175 lines
5.4 KiB
C
/*
|
|
* IPv6 library code, needed by static components when full IPv6 support is
|
|
* not configured or static.
|
|
*/
|
|
|
|
#include <linux/export.h>
|
|
#include <net/ipv6.h>
|
|
#include <net/addrconf.h>
|
|
#include <net/ip.h>
|
|
|
|
/* if ipv6 module registers this function is used by xfrm to force all
|
|
* sockets to relookup their nodes - this is fairly expensive, be
|
|
* careful
|
|
*/
|
|
void (*__fib6_flush_trees)(struct net *);
|
|
EXPORT_SYMBOL(__fib6_flush_trees);
|
|
|
|
#define IPV6_ADDR_SCOPE_TYPE(scope) ((scope) << 16)
|
|
|
|
static inline unsigned int ipv6_addr_scope2type(unsigned int scope)
|
|
{
|
|
switch (scope) {
|
|
case IPV6_ADDR_SCOPE_NODELOCAL:
|
|
return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_NODELOCAL) |
|
|
IPV6_ADDR_LOOPBACK);
|
|
case IPV6_ADDR_SCOPE_LINKLOCAL:
|
|
return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL) |
|
|
IPV6_ADDR_LINKLOCAL);
|
|
case IPV6_ADDR_SCOPE_SITELOCAL:
|
|
return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_SITELOCAL) |
|
|
IPV6_ADDR_SITELOCAL);
|
|
}
|
|
return IPV6_ADDR_SCOPE_TYPE(scope);
|
|
}
|
|
|
|
int __ipv6_addr_type(const struct in6_addr *addr)
|
|
{
|
|
__be32 st;
|
|
|
|
st = addr->s6_addr32[0];
|
|
|
|
/* Consider all addresses with the first three bits different of
|
|
000 and 111 as unicasts.
|
|
*/
|
|
if ((st & htonl(0xE0000000)) != htonl(0x00000000) &&
|
|
(st & htonl(0xE0000000)) != htonl(0xE0000000))
|
|
return (IPV6_ADDR_UNICAST |
|
|
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL));
|
|
|
|
if ((st & htonl(0xFF000000)) == htonl(0xFF000000)) {
|
|
/* multicast */
|
|
/* addr-select 3.1 */
|
|
return (IPV6_ADDR_MULTICAST |
|
|
ipv6_addr_scope2type(IPV6_ADDR_MC_SCOPE(addr)));
|
|
}
|
|
|
|
if ((st & htonl(0xFFC00000)) == htonl(0xFE800000))
|
|
return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST |
|
|
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL)); /* addr-select 3.1 */
|
|
if ((st & htonl(0xFFC00000)) == htonl(0xFEC00000))
|
|
return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST |
|
|
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_SITELOCAL)); /* addr-select 3.1 */
|
|
if ((st & htonl(0xFE000000)) == htonl(0xFC000000))
|
|
return (IPV6_ADDR_UNICAST |
|
|
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* RFC 4193 */
|
|
|
|
if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) {
|
|
if (addr->s6_addr32[2] == 0) {
|
|
if (addr->s6_addr32[3] == 0)
|
|
return IPV6_ADDR_ANY;
|
|
|
|
if (addr->s6_addr32[3] == htonl(0x00000001))
|
|
return (IPV6_ADDR_LOOPBACK | IPV6_ADDR_UNICAST |
|
|
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL)); /* addr-select 3.4 */
|
|
|
|
return (IPV6_ADDR_COMPATv4 | IPV6_ADDR_UNICAST |
|
|
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.3 */
|
|
}
|
|
|
|
if (addr->s6_addr32[2] == htonl(0x0000ffff))
|
|
return (IPV6_ADDR_MAPPED |
|
|
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.3 */
|
|
}
|
|
|
|
return (IPV6_ADDR_UNICAST |
|
|
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.4 */
|
|
}
|
|
EXPORT_SYMBOL(__ipv6_addr_type);
|
|
|
|
static ATOMIC_NOTIFIER_HEAD(inet6addr_chain);
|
|
|
|
int register_inet6addr_notifier(struct notifier_block *nb)
|
|
{
|
|
return atomic_notifier_chain_register(&inet6addr_chain, nb);
|
|
}
|
|
EXPORT_SYMBOL(register_inet6addr_notifier);
|
|
|
|
int unregister_inet6addr_notifier(struct notifier_block *nb)
|
|
{
|
|
return atomic_notifier_chain_unregister(&inet6addr_chain, nb);
|
|
}
|
|
EXPORT_SYMBOL(unregister_inet6addr_notifier);
|
|
|
|
int inet6addr_notifier_call_chain(unsigned long val, void *v)
|
|
{
|
|
return atomic_notifier_call_chain(&inet6addr_chain, val, v);
|
|
}
|
|
EXPORT_SYMBOL(inet6addr_notifier_call_chain);
|
|
|
|
static struct dst_entry *eafnosupport_ipv6_dst_lookup_flow(struct net *net,
|
|
const struct sock *sk,
|
|
struct flowi6 *fl6,
|
|
const struct in6_addr *final_dst)
|
|
{
|
|
return ERR_PTR(-EAFNOSUPPORT);
|
|
}
|
|
|
|
const struct ipv6_stub *ipv6_stub __read_mostly = &(struct ipv6_stub) {
|
|
.ipv6_dst_lookup_flow = eafnosupport_ipv6_dst_lookup_flow,
|
|
};
|
|
EXPORT_SYMBOL_GPL(ipv6_stub);
|
|
|
|
/* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */
|
|
const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
|
|
EXPORT_SYMBOL(in6addr_loopback);
|
|
const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
|
|
EXPORT_SYMBOL(in6addr_any);
|
|
const struct in6_addr in6addr_linklocal_allnodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
|
|
EXPORT_SYMBOL(in6addr_linklocal_allnodes);
|
|
const struct in6_addr in6addr_linklocal_allrouters = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
|
|
EXPORT_SYMBOL(in6addr_linklocal_allrouters);
|
|
const struct in6_addr in6addr_interfacelocal_allnodes = IN6ADDR_INTERFACELOCAL_ALLNODES_INIT;
|
|
EXPORT_SYMBOL(in6addr_interfacelocal_allnodes);
|
|
const struct in6_addr in6addr_interfacelocal_allrouters = IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT;
|
|
EXPORT_SYMBOL(in6addr_interfacelocal_allrouters);
|
|
const struct in6_addr in6addr_sitelocal_allrouters = IN6ADDR_SITELOCAL_ALLROUTERS_INIT;
|
|
EXPORT_SYMBOL(in6addr_sitelocal_allrouters);
|
|
|
|
static void snmp6_free_dev(struct inet6_dev *idev)
|
|
{
|
|
kfree(idev->stats.icmpv6msgdev);
|
|
kfree(idev->stats.icmpv6dev);
|
|
free_percpu(idev->stats.ipv6);
|
|
}
|
|
|
|
static void in6_dev_finish_destroy_rcu(struct rcu_head *head)
|
|
{
|
|
struct inet6_dev *idev = container_of(head, struct inet6_dev, rcu);
|
|
|
|
snmp6_free_dev(idev);
|
|
kfree(idev);
|
|
}
|
|
|
|
/* Nobody refers to this device, we may destroy it. */
|
|
|
|
void in6_dev_finish_destroy(struct inet6_dev *idev)
|
|
{
|
|
struct net_device *dev = idev->dev;
|
|
|
|
WARN_ON(!list_empty(&idev->addr_list));
|
|
WARN_ON(idev->mc_list);
|
|
WARN_ON(timer_pending(&idev->rs_timer));
|
|
|
|
#ifdef NET_REFCNT_DEBUG
|
|
pr_debug("%s: %s\n", __func__, dev ? dev->name : "NIL");
|
|
#endif
|
|
dev_put(dev);
|
|
if (!idev->dead) {
|
|
pr_warn("Freeing alive inet6 device %p\n", idev);
|
|
return;
|
|
}
|
|
call_rcu(&idev->rcu, in6_dev_finish_destroy_rcu);
|
|
}
|
|
EXPORT_SYMBOL(in6_dev_finish_destroy);
|