-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmGWT+QACgkQONu9yGCS aT5mYw//ZXKzugaeJjuIaFqr7tcM7x8EefbKd2H4oMr8SW3IFElJIbNPJGMJAG/C tLZVWZvIum7QzZoxTL+JCCKpDzBERNTo4e5u7UwzAdVqiEX69YkNU0FBOzb4qXJ7 gOZMBhy4UMIKdKD12CSXXf7ZspocsNXfzdmulRQ7CQcPoPrIMKpc4vuagN1Fy/Dz JgXYvRUAkLxtFHoQ/TeXvR4Gv9+w2ToMdb02mI48QBO+YYrFaGt+Rza2eHTv75H+ Lydz37Nv1Pk32tA1q2jWxCzz16+Kzn+AviKiCfQK0Fb9IqnJksUIWLHSiODlVIcf kQHejanPn/p1BnBl8puPk1KFtDW45p2GwYhXG7hjGh08DGlR7QLHBS5Aa3xPYfdd uOy4ctygSVTx5nLjPH5vr3OE0wk/TuSSf/eyk2fmcUCspwAgBOnSYSmnJOem7LTK VqIgXFdCRplsqN415D35ddruP2BLCKqBu4KjwJ1LGIwgsx/Pmz4hlc5YcpLm8uRg XMqGTdcieQFOGmZJjJ2q3ecaCjfb0nmTrOylP5b55/74TFwFo042YR1ua0fEtpD4 euoHLfYv3BY1dCp34TOUFGX0l+J1kAtf//vfD/JgJx/nX+ksdFBHhYwdbSi2oQG/ 9CceXYJ5duEnG+JmDOWJvcZ3T49K5XaIDNfY2zGpcSu1VZKubWg= =tQ0m -----END PGP SIGNATURE----- Merge 5.10.80 into android12-5.10-lts Changes in 5.10.80 xhci: Fix USB 3.1 enumeration issues by increasing roothub power-on-good delay usb: xhci: Enable runtime-pm by default on AMD Yellow Carp platform binder: use euid from cred instead of using task binder: use cred instead of task for selinux checks binder: use cred instead of task for getsecid Input: iforce - fix control-message timeout Input: elantench - fix misreporting trackpoint coordinates Input: i8042 - Add quirk for Fujitsu Lifebook T725 libata: fix read log timeout value ocfs2: fix data corruption on truncate scsi: core: Remove command size deduction from scsi_setup_scsi_cmnd() scsi: qla2xxx: Fix kernel crash when accessing port_speed sysfs file scsi: qla2xxx: Fix use after free in eh_abort path mmc: mtk-sd: Add wait dma stop done flow mmc: dw_mmc: Dont wait for DRTO on Write RSP error exfat: fix incorrect loading of i_blocks for large files parisc: Fix set_fixmap() on PA1.x CPUs parisc: Fix ptrace check on syscall return tpm: Check for integer overflow in tpm2_map_response_body() firmware/psci: fix application of sizeof to pointer crypto: s5p-sss - Add error handling in s5p_aes_probe() media: rkvdec: Do not override sizeimage for output format media: ite-cir: IR receiver stop working after receive overflow media: rkvdec: Support dynamic resolution changes media: ir-kbd-i2c: improve responsiveness of hauppauge zilog receivers media: v4l2-ioctl: Fix check_ext_ctrls ALSA: hda/realtek: Fix mic mute LED for the HP Spectre x360 14 ALSA: hda/realtek: Add a quirk for HP OMEN 15 mute LED ALSA: hda/realtek: Add quirk for Clevo PC70HS ALSA: hda/realtek: Headset fixup for Clevo NH77HJQ ALSA: hda/realtek: Add a quirk for Acer Spin SP513-54N ALSA: hda/realtek: Add quirk for ASUS UX550VE ALSA: hda/realtek: Add quirk for HP EliteBook 840 G7 mute LED ALSA: ua101: fix division by zero at probe ALSA: 6fire: fix control and bulk message timeouts ALSA: line6: fix control and interrupt message timeouts ALSA: usb-audio: Line6 HX-Stomp XL USB_ID for 48k-fixed quirk ALSA: usb-audio: Add registration quirk for JBL Quantum 400 ALSA: hda: Free card instance properly at probe errors ALSA: synth: missing check for possible NULL after the call to kstrdup ALSA: timer: Fix use-after-free problem ALSA: timer: Unconditionally unlink slave instances, too ext4: fix lazy initialization next schedule time computation in more granular unit ext4: ensure enough credits in ext4_ext_shift_path_extents ext4: refresh the ext4_ext_path struct after dropping i_data_sem. fuse: fix page stealing x86/sme: Use #define USE_EARLY_PGTABLE_L5 in mem_encrypt_identity.c x86/cpu: Fix migration safety with X86_BUG_NULL_SEL x86/irq: Ensure PI wakeup handler is unregistered before module unload ASoC: soc-core: fix null-ptr-deref in snd_soc_del_component_unlocked() ALSA: hda/realtek: Fixes HP Spectre x360 15-eb1xxx speakers cavium: Return negative value when pci_alloc_irq_vectors() fails scsi: qla2xxx: Return -ENOMEM if kzalloc() fails scsi: qla2xxx: Fix unmap of already freed sgl mISDN: Fix return values of the probe function cavium: Fix return values of the probe function sfc: Export fibre-specific supported link modes sfc: Don't use netif_info before net_device setup hyperv/vmbus: include linux/bitops.h ARM: dts: sun7i: A20-olinuxino-lime2: Fix ethernet phy-mode reset: socfpga: add empty driver allowing consumers to probe mmc: winbond: don't build on M68K drm: panel-orientation-quirks: Add quirk for Aya Neo 2021 fcnal-test: kill hanging ping/nettest binaries on cleanup bpf: Define bpf_jit_alloc_exec_limit for arm64 JIT bpf: Prevent increasing bpf_jit_limit above max gpio: mlxbf2.c: Add check for bgpio_init failure xen/netfront: stop tx queues during live migration nvmet-tcp: fix a memory leak when releasing a queue spi: spl022: fix Microwire full duplex mode net: multicast: calculate csum of looped-back and forwarded packets watchdog: Fix OMAP watchdog early handling drm: panel-orientation-quirks: Add quirk for GPD Win3 block: schedule queue restart after BLK_STS_ZONE_RESOURCE nvmet-tcp: fix header digest verification r8169: Add device 10ec:8162 to driver r8169 vmxnet3: do not stop tx queues after netif_device_detach() nfp: bpf: relax prog rejection for mtu check through max_pkt_offset net/smc: Fix smc_link->llc_testlink_time overflow net/smc: Correct spelling mistake to TCPF_SYN_RECV rds: stop using dmapool btrfs: clear MISSING device status bit in btrfs_close_one_device btrfs: fix lost error handling when replaying directory deletes btrfs: call btrfs_check_rw_degradable only if there is a missing device KVM: VMX: Unregister posted interrupt wakeup handler on hardware unsetup ia64: kprobes: Fix to pass correct trampoline address to the handler selinux: fix race condition when computing ocontext SIDs hwmon: (pmbus/lm25066) Add offset coefficients regulator: s5m8767: do not use reset value as DVS voltage if GPIO DVS is disabled regulator: dt-bindings: samsung,s5m8767: correct s5m8767,pmic-buck-default-dvs-idx property EDAC/sb_edac: Fix top-of-high-memory value for Broadwell/Haswell mwifiex: fix division by zero in fw download path ath6kl: fix division by zero in send path ath6kl: fix control-message timeout ath10k: fix control-message timeout ath10k: fix division by zero in send path PCI: Mark Atheros QCA6174 to avoid bus reset rtl8187: fix control-message timeouts evm: mark evm_fixmode as __ro_after_init ifb: Depend on netfilter alternatively to tc wcn36xx: Fix HT40 capability for 2Ghz band wcn36xx: Fix tx_status mechanism wcn36xx: Fix (QoS) null data frame bitrate/modulation PM: sleep: Do not let "syscore" devices runtime-suspend during system transitions mwifiex: Read a PCI register after writing the TX ring write pointer mwifiex: Try waking the firmware until we get an interrupt libata: fix checking of DMA state wcn36xx: handle connection loss indication rsi: fix occasional initialisation failure with BT coex rsi: fix key enabled check causing unwanted encryption for vap_id > 0 rsi: fix rate mask set leading to P2P failure rsi: Fix module dev_oper_mode parameter description perf/x86/intel/uncore: Support extra IMC channel on Ice Lake server perf/x86/intel/uncore: Fix Intel ICX IIO event constraints RDMA/qedr: Fix NULL deref for query_qp on the GSI QP signal: Remove the bogus sigkill_pending in ptrace_stop memory: renesas-rpc-if: Correct QSPI data transfer in Manual mode signal/mips: Update (_save|_restore)_fp_context to fail with -EFAULT soc: fsl: dpio: replace smp_processor_id with raw_smp_processor_id soc: fsl: dpio: use the combined functions to protect critical zone mtd: rawnand: socrates: Keep the driver compatible with on-die ECC engines power: supply: max17042_battery: Prevent int underflow in set_soc_threshold power: supply: max17042_battery: use VFSOC for capacity when no rsns KVM: arm64: Extract ESR_ELx.EC only KVM: nVMX: Query current VMCS when determining if MSR bitmaps are in use can: j1939: j1939_tp_cmd_recv(): ignore abort message in the BAM transport can: j1939: j1939_can_recv(): ignore messages with invalid source address powerpc/85xx: Fix oops when mpc85xx_smp_guts_ids node cannot be found ring-buffer: Protect ring_buffer_reset() from reentrancy serial: core: Fix initializing and restoring termios speed ifb: fix building without CONFIG_NET_CLS_ACT ALSA: mixer: oss: Fix racy access to slots ALSA: mixer: fix deadlock in snd_mixer_oss_set_volume xen/balloon: add late_initcall_sync() for initial ballooning done ovl: fix use after free in struct ovl_aio_req PCI: pci-bridge-emul: Fix emulation of W1C bits PCI: cadence: Add cdns_plat_pcie_probe() missing return PCI: aardvark: Do not clear status bits of masked interrupts PCI: aardvark: Fix checking for link up via LTSSM state PCI: aardvark: Do not unmask unused interrupts PCI: aardvark: Fix reporting Data Link Layer Link Active PCI: aardvark: Fix configuring Reference clock PCI: aardvark: Fix return value of MSI domain .alloc() method PCI: aardvark: Read all 16-bits from PCIE_MSI_PAYLOAD_REG PCI: aardvark: Fix support for bus mastering and PCI_COMMAND on emulated bridge PCI: aardvark: Fix support for PCI_BRIDGE_CTL_BUS_RESET on emulated bridge PCI: aardvark: Set PCI Bridge Class Code to PCI Bridge PCI: aardvark: Fix support for PCI_ROM_ADDRESS1 on emulated bridge quota: check block number when reading the block in quota file quota: correct error number in free_dqentry() pinctrl: core: fix possible memory leak in pinctrl_enable() coresight: cti: Correct the parameter for pm_runtime_put iio: dac: ad5446: Fix ad5622_write() return value iio: ad5770r: make devicetree property reading consistent USB: serial: keyspan: fix memleak on probe errors serial: 8250: fix racy uartclk update most: fix control-message timeouts USB: iowarrior: fix control-message timeouts USB: chipidea: fix interrupt deadlock power: supply: max17042_battery: Clear status bits in interrupt handler dma-buf: WARN on dmabuf release with pending attachments drm: panel-orientation-quirks: Update the Lenovo Ideapad D330 quirk (v2) drm: panel-orientation-quirks: Add quirk for KD Kurio Smart C15200 2-in-1 drm: panel-orientation-quirks: Add quirk for the Samsung Galaxy Book 10.6 Bluetooth: sco: Fix lock_sock() blockage by memcpy_from_msg() Bluetooth: fix use-after-free error in lock_sock_nested() drm/panel-orientation-quirks: add Valve Steam Deck rcutorture: Avoid problematic critical section nesting on PREEMPT_RT platform/x86: wmi: do not fail if disabling fails MIPS: lantiq: dma: add small delay after reset MIPS: lantiq: dma: reset correct number of channel locking/lockdep: Avoid RCU-induced noinstr fail net: sched: update default qdisc visibility after Tx queue cnt changes rcu-tasks: Move RTGS_WAIT_CBS to beginning of rcu_tasks_kthread() loop smackfs: Fix use-after-free in netlbl_catmap_walk() ath11k: Align bss_chan_info structure with firmware x86: Increase exception stack sizes mwifiex: Run SET_BSS_MODE when changing from P2P to STATION vif-type mwifiex: Properly initialize private structure on interface type changes fscrypt: allow 256-bit master keys with AES-256-XTS drm/amdgpu: Fix MMIO access page fault ath11k: Avoid reg rules update during firmware recovery ath11k: add handler for scan event WMI_SCAN_EVENT_DEQUEUED ath11k: Change DMA_FROM_DEVICE to DMA_TO_DEVICE when map reinjected packets ath10k: high latency fixes for beacon buffer media: mt9p031: Fix corrupted frame after restarting stream media: netup_unidvb: handle interrupt properly according to the firmware media: atomisp: Fix error handling in probe media: stm32: Potential NULL pointer dereference in dcmi_irq_thread() media: uvcvideo: Set capability in s_param media: uvcvideo: Return -EIO for control errors media: uvcvideo: Set unique vdev name based in type media: s5p-mfc: fix possible null-pointer dereference in s5p_mfc_probe() media: s5p-mfc: Add checking to s5p_mfc_probe(). media: imx: set a media_device bus_info string media: mceusb: return without resubmitting URB in case of -EPROTO error. ia64: don't do IA64_CMPXCHG_DEBUG without CONFIG_PRINTK rtw88: fix RX clock gate setting while fifo dump brcmfmac: Add DMI nvram filename quirk for Cyberbook T116 tablet media: rcar-csi2: Add checking to rcsi2_start_receiver() ipmi: Disable some operations during a panic fs/proc/uptime.c: Fix idle time reporting in /proc/uptime ACPICA: Avoid evaluating methods too early during system resume media: ipu3-imgu: imgu_fmt: Handle properly try media: ipu3-imgu: VIDIOC_QUERYCAP: Fix bus_info media: usb: dvd-usb: fix uninit-value bug in dibusb_read_eeprom_byte() net-sysfs: try not to restart the syscall if it will fail eventually tracefs: Have tracefs directories not set OTH permission bits by default ath: dfs_pattern_detector: Fix possible null-pointer dereference in channel_detector_create() mmc: moxart: Fix reference count leaks in moxart_probe iov_iter: Fix iov_iter_get_pages{,_alloc} page fault return value ACPI: battery: Accept charges over the design capacity as full drm/amdkfd: fix resume error when iommu disabled in Picasso net: phy: micrel: make *-skew-ps check more lenient leaking_addresses: Always print a trailing newline drm/msm: prevent NULL dereference in msm_gpu_crashstate_capture() block: bump max plugged deferred size from 16 to 32 md: update superblock after changing rdev flags in state_store memstick: r592: Fix a UAF bug when removing the driver lib/xz: Avoid overlapping memcpy() with invalid input with in-place decompression lib/xz: Validate the value before assigning it to an enum variable workqueue: make sysfs of unbound kworker cpumask more clever tracing/cfi: Fix cmp_entries_* functions signature mismatch mt76: mt7915: fix an off-by-one bound check mwl8k: Fix use-after-free in mwl8k_fw_state_machine() block: remove inaccurate requeue check media: allegro: ignore interrupt if mailbox is not initialized nvmet: fix use-after-free when a port is removed nvmet-rdma: fix use-after-free when a port is removed nvmet-tcp: fix use-after-free when a port is removed nvme: drop scan_lock and always kick requeue list when removing namespaces PM: hibernate: Get block device exclusively in swsusp_check() selftests: kvm: fix mismatched fclose() after popen() selftests/bpf: Fix perf_buffer test on system with offline cpus iwlwifi: mvm: disable RX-diversity in powersave smackfs: use __GFP_NOFAIL for smk_cipso_doi() ARM: clang: Do not rely on lr register for stacktrace gre/sit: Don't generate link-local addr if addr_gen_mode is IN6_ADDR_GEN_MODE_NONE gfs2: Cancel remote delete work asynchronously gfs2: Fix glock_hash_walk bugs ARM: 9136/1: ARMv7-M uses BE-8, not BE-32 vrf: run conntrack only in context of lower/physdev for locally generated packets net: annotate data-race in neigh_output() ACPI: AC: Quirk GK45 to skip reading _PSR btrfs: reflink: initialize return value to 0 in btrfs_extent_same() btrfs: do not take the uuid_mutex in btrfs_rm_device spi: bcm-qspi: Fix missing clk_disable_unprepare() on error in bcm_qspi_probe() wcn36xx: Correct band/freq reporting on RX x86/hyperv: Protect set_hv_tscchange_cb() against getting preempted drm/amd/display: dcn20_resource_construct reduce scope of FPU enabled selftests/core: fix conflicting types compile error for close_range() parisc: fix warning in flush_tlb_all task_stack: Fix end_of_stack() for architectures with upwards-growing stack erofs: don't trigger WARN() when decompression fails parisc/unwind: fix unwinder when CONFIG_64BIT is enabled parisc/kgdb: add kgdb_roundup() to make kgdb work with idle polling netfilter: conntrack: set on IPS_ASSURED if flows enters internal stream state selftests/bpf: Fix strobemeta selftest regression Bluetooth: fix init and cleanup of sco_conn.timeout_work rcu: Fix existing exp request check in sync_sched_exp_online_cleanup() MIPS: lantiq: dma: fix burst length for DEU objtool: Add xen_start_kernel() to noreturn list x86/xen: Mark cpu_bringup_and_idle() as dead_end_function objtool: Fix static_call list generation drm/v3d: fix wait for TMU write combiner flush virtio-gpu: fix possible memory allocation failure lockdep: Let lock_is_held_type() detect recursive read as read net: net_namespace: Fix undefined member in key_remove_domain() cgroup: Make rebind_subsystems() disable v2 controllers all at once wcn36xx: Fix Antenna Diversity Switching wilc1000: fix possible memory leak in cfg_scan_result() Bluetooth: btmtkuart: fix a memleak in mtk_hci_wmt_sync crypto: caam - disable pkc for non-E SoCs rxrpc: Fix _usecs_to_jiffies() by using usecs_to_jiffies() net: dsa: rtl8366rb: Fix off-by-one bug ath11k: fix some sleeping in atomic bugs ath11k: Avoid race during regd updates ath11k: fix packet drops due to incorrect 6 GHz freq value in rx status ath11k: Fix memory leak in ath11k_qmi_driver_event_work ath10k: Fix missing frame timestamp for beacon/probe-resp ath10k: sdio: Add missing BH locking around napi_schdule() drm/ttm: stop calling tt_swapin in vm_access arm64: mm: update max_pfn after memory hotplug drm/amdgpu: fix warning for overflow check media: em28xx: add missing em28xx_close_extension media: cxd2880-spi: Fix a null pointer dereference on error handling path media: dvb-usb: fix ununit-value in az6027_rc_query media: v4l2-ioctl: S_CTRL output the right value media: TDA1997x: handle short reads of hdmi info frame. media: mtk-vpu: Fix a resource leak in the error handling path of 'mtk_vpu_probe()' media: radio-wl1273: Avoid card name truncation media: si470x: Avoid card name truncation media: tm6000: Avoid card name truncation media: cx23885: Fix snd_card_free call on null card pointer kprobes: Do not use local variable when creating debugfs file crypto: ecc - fix CRYPTO_DEFAULT_RNG dependency cpuidle: Fix kobject memory leaks in error paths media: em28xx: Don't use ops->suspend if it is NULL ath9k: Fix potential interrupt storm on queue reset PM: EM: Fix inefficient states detection EDAC/amd64: Handle three rank interleaving mode rcu: Always inline rcu_dynticks_task*_{enter,exit}() netfilter: nft_dynset: relax superfluous check on set updates media: dvb-frontends: mn88443x: Handle errors of clk_prepare_enable() crypto: qat - detect PFVF collision after ACK crypto: qat - disregard spurious PFVF interrupts hwrng: mtk - Force runtime pm ops for sleep ops b43legacy: fix a lower bounds test b43: fix a lower bounds test gve: Recover from queue stall due to missed IRQ mmc: sdhci-omap: Fix NULL pointer exception if regulator is not configured mmc: sdhci-omap: Fix context restore memstick: avoid out-of-range warning memstick: jmb38x_ms: use appropriate free function in jmb38x_ms_alloc_host() net, neigh: Fix NTF_EXT_LEARNED in combination with NTF_USE hwmon: Fix possible memleak in __hwmon_device_register() hwmon: (pmbus/lm25066) Let compiler determine outer dimension of lm25066_coeff ath10k: fix max antenna gain unit kernel/sched: Fix sched_fork() access an invalid sched_task_group tcp: switch orphan_count to bare per-cpu counters drm/msm: potential error pointer dereference in init() drm/msm: uninitialized variable in msm_gem_import() net: stream: don't purge sk_error_queue in sk_stream_kill_queues() media: ir_toy: assignment to be16 should be of correct type mmc: mxs-mmc: disable regulator on error and in the remove function platform/x86: thinkpad_acpi: Fix bitwise vs. logical warning mt76: mt7615: fix endianness warning in mt7615_mac_write_txwi mt76: mt76x02: fix endianness warnings in mt76x02_mac.c mt76: mt7915: fix possible infinite loop release semaphore mt76: mt7915: fix sta_rec_wtbl tag len mt76: mt7915: fix muar_idx in mt7915_mcu_alloc_sta_req() rsi: stop thread firstly in rsi_91x_init() error handling mwifiex: Send DELBA requests according to spec net: enetc: unmap DMA in enetc_send_cmd() phy: micrel: ksz8041nl: do not use power down mode nvme-rdma: fix error code in nvme_rdma_setup_ctrl PM: hibernate: fix sparse warnings clocksource/drivers/timer-ti-dm: Select TIMER_OF x86/sev: Fix stack type check in vc_switch_off_ist() drm/msm: Fix potential NULL dereference in DPU SSPP smackfs: use netlbl_cfg_cipsov4_del() for deleting cipso_v4_doi KVM: selftests: Add operand to vmsave/vmload/vmrun in svm.c KVM: selftests: Fix nested SVM tests when built with clang bpftool: Avoid leaking the JSON writer prepared for program metadata libbpf: Fix BTF data layout checks and allow empty BTF libbpf: Allow loading empty BTFs libbpf: Fix overflow in BTF sanity checks libbpf: Fix BTF header parsing checks s390/gmap: don't unconditionally call pte_unmap_unlock() in __gmap_zap() KVM: s390: pv: avoid double free of sida page KVM: s390: pv: avoid stalls for kvm_s390_pv_init_vm irq: mips: avoid nested irq_enter() tpm: fix Atmel TPM crash caused by too frequent queries tpm_tis_spi: Add missing SPI ID libbpf: Fix endianness detection in BPF_CORE_READ_BITFIELD_PROBED() tcp: don't free a FIN sk_buff in tcp_remove_empty_skb() spi: spi-rpc-if: Check return value of rpcif_sw_init() samples/kretprobes: Fix return value if register_kretprobe() failed KVM: s390: Fix handle_sske page fault handling libertas_tf: Fix possible memory leak in probe and disconnect libertas: Fix possible memory leak in probe and disconnect wcn36xx: add proper DMA memory barriers in rx path wcn36xx: Fix discarded frames due to wrong sequence number drm/amdgpu/gmc6: fix DMA mask from 44 to 40 bits selftests: bpf: Convert sk_lookup ctx access tests to PROG_TEST_RUN selftests/bpf: Fix fd cleanup in sk_lookup test net: amd-xgbe: Toggle PLL settings during rate change net: phylink: avoid mvneta warning when setting pause parameters crypto: pcrypt - Delay write to padata->info selftests/bpf: Fix fclose/pclose mismatch in test_progs udp6: allow SO_MARK ctrl msg to affect routing ibmvnic: don't stop queue in xmit ibmvnic: Process crqs after enabling interrupts cgroup: Fix rootcg cpu.stat guest double counting bpf: Fix propagation of bounds from 64-bit min/max into 32-bit and var_off. bpf: Fix propagation of signed bounds from 64-bit min/max into 32-bit. of: unittest: fix EXPECT text for gpio hog errors iio: st_sensors: Call st_sensors_power_enable() from bus drivers iio: st_sensors: disable regulators after device unregistration RDMA/rxe: Fix wrong port_cap_flags ARM: dts: BCM5301X: Fix memory nodes names clk: mvebu: ap-cpu-clk: Fix a memory leak in error handling paths ARM: s3c: irq-s3c24xx: Fix return value check for s3c24xx_init_intc() arm64: dts: rockchip: Fix GPU register width for RK3328 ARM: dts: qcom: msm8974: Add xo_board reference clock to DSI0 PHY RDMA/bnxt_re: Fix query SRQ failure arm64: dts: ti: k3-j721e-main: Fix "max-virtual-functions" in PCIe EP nodes arm64: dts: ti: k3-j721e-main: Fix "bus-range" upto 256 bus number for PCIe arm64: dts: meson-g12a: Fix the pwm regulator supply properties arm64: dts: meson-g12b: Fix the pwm regulator supply properties bus: ti-sysc: Fix timekeeping_suspended warning on resume ARM: dts: at91: tse850: the emac<->phy interface is rmii scsi: dc395: Fix error case unwinding MIPS: loongson64: make CPU_LOONGSON64 depends on MIPS_FP_SUPPORT JFS: fix memleak in jfs_mount arm64: dts: qcom: msm8916: Fix Secondary MI2S bit clock arm64: dts: renesas: beacon: Fix Ethernet PHY mode arm64: dts: qcom: pm8916: Remove wrong reg-names for rtc@6000 ALSA: hda: Reduce udelay() at SKL+ position reporting ALSA: hda: Release controller display power during shutdown/reboot ALSA: hda: Fix hang during shutdown due to link reset ALSA: hda: Use position buffer for SKL+ again soundwire: debugfs: use controller id and link_id for debugfs scsi: pm80xx: Fix misleading log statement in pm8001_mpi_get_nvmd_resp() driver core: Fix possible memory leak in device_link_add() arm: dts: omap3-gta04a4: accelerometer irq fix ASoC: SOF: topology: do not power down primary core during topology removal soc/tegra: Fix an error handling path in tegra_powergate_power_up() memory: fsl_ifc: fix leak of irq and nand_irq in fsl_ifc_ctrl_probe clk: at91: check pmc node status before registering syscore ops video: fbdev: chipsfb: use memset_io() instead of memset() powerpc: Refactor is_kvm_guest() declaration to new header powerpc: Rename is_kvm_guest() to check_kvm_guest() powerpc: Reintroduce is_kvm_guest() as a fast-path check powerpc: Fix is_kvm_guest() / kvm_para_available() powerpc: fix unbalanced node refcount in check_kvm_guest() serial: 8250_dw: Drop wrong use of ACPI_PTR() usb: gadget: hid: fix error code in do_config() power: supply: rt5033_battery: Change voltage values to µV power: supply: max17040: fix null-ptr-deref in max17040_probe() scsi: csiostor: Uninitialized data in csio_ln_vnp_read_cbfn() RDMA/mlx4: Return missed an error if device doesn't support steering usb: musb: select GENERIC_PHY instead of depending on it staging: most: dim2: do not double-register the same device staging: ks7010: select CRYPTO_HASH/CRYPTO_MICHAEL_MIC pinctrl: renesas: checker: Fix off-by-one bug in drive register check ARM: dts: stm32: Reduce DHCOR SPI NOR frequency to 50 MHz ARM: dts: stm32: fix SAI sub nodes register range ARM: dts: stm32: fix AV96 board SAI2 pin muxing on stm32mp15 ASoC: cs42l42: Correct some register default values ASoC: cs42l42: Defer probe if request_threaded_irq() returns EPROBE_DEFER soc: qcom: rpmhpd: Provide some missing struct member descriptions soc: qcom: rpmhpd: Make power_on actually enable the domain usb: typec: STUSB160X should select REGMAP_I2C iio: adis: do not disabe IRQs in 'adis_init()' scsi: ufs: Refactor ufshcd_setup_clocks() to remove skip_ref_clk scsi: ufs: ufshcd-pltfrm: Fix memory leak due to probe defer serial: imx: fix detach/attach of serial console usb: dwc2: drd: fix dwc2_force_mode call in dwc2_ovr_init usb: dwc2: drd: fix dwc2_drd_role_sw_set when clock could be disabled usb: dwc2: drd: reset current session before setting the new one firmware: qcom_scm: Fix error retval in __qcom_scm_is_call_available() soc: qcom: apr: Add of_node_put() before return pinctrl: equilibrium: Fix function addition in multiple groups phy: qcom-qusb2: Fix a memory leak on probe phy: ti: gmii-sel: check of_get_address() for failure phy: qcom-snps: Correct the FSEL_MASK serial: xilinx_uartps: Fix race condition causing stuck TX clk: at91: sam9x60-pll: use DIV_ROUND_CLOSEST_ULL HID: u2fzero: clarify error check and length calculations HID: u2fzero: properly handle timeouts in usb_submit_urb powerpc/44x/fsp2: add missing of_node_put ASoC: cs42l42: Disable regulators if probe fails ASoC: cs42l42: Use device_property API instead of of_property ASoC: cs42l42: Correct configuring of switch inversion from ts-inv virtio_ring: check desc == NULL when using indirect with packed mips: cm: Convert to bitfield API to fix out-of-bounds access power: supply: bq27xxx: Fix kernel crash on IRQ handler register error apparmor: fix error check rpmsg: Fix rpmsg_create_ept return when RPMSG config is not defined nfsd: don't alloc under spinlock in rpc_parse_scope_id i2c: mediatek: fixing the incorrect register offset NFS: Fix dentry verifier races pnfs/flexfiles: Fix misplaced barrier in nfs4_ff_layout_prepare_ds drm/plane-helper: fix uninitialized variable reference PCI: aardvark: Don't spam about PIO Response Status PCI: aardvark: Fix preserving PCI_EXP_RTCTL_CRSSVE flag on emulated bridge opp: Fix return in _opp_add_static_v2() NFS: Fix deadlocks in nfs_scan_commit_list() fs: orangefs: fix error return code of orangefs_revalidate_lookup() mtd: spi-nor: hisi-sfc: Remove excessive clk_disable_unprepare() PCI: uniphier: Serialize INTx masking/unmasking and fix the bit operation mtd: core: don't remove debugfs directory if device is in use remoteproc: Fix a memory leak in an error handling path in 'rproc_handle_vdev()' rtc: rv3032: fix error handling in rv3032_clkout_set_rate() dmaengine: at_xdmac: fix AT_XDMAC_CC_PERID() macro NFS: Fix up commit deadlocks NFS: Fix an Oops in pnfs_mark_request_commit() Fix user namespace leak auxdisplay: img-ascii-lcd: Fix lock-up when displaying empty string auxdisplay: ht16k33: Connect backlight to fbdev auxdisplay: ht16k33: Fix frame buffer device blanking soc: fsl: dpaa2-console: free buffer before returning from dpaa2_console_read netfilter: nfnetlink_queue: fix OOB when mac header was cleared dmaengine: dmaengine_desc_callback_valid(): Check for `callback_result` signal/sh: Use force_sig(SIGKILL) instead of do_group_exit(SIGKILL) m68k: set a default value for MEMORY_RESERVE watchdog: f71808e_wdt: fix inaccurate report in WDIOC_GETTIMEOUT ar7: fix kernel builds for compiler test scsi: qla2xxx: Changes to support FCP2 Target scsi: qla2xxx: Relogin during fabric disturbance scsi: qla2xxx: Fix gnl list corruption scsi: qla2xxx: Turn off target reset during issue_lip NFSv4: Fix a regression in nfs_set_open_stateid_locked() i2c: xlr: Fix a resource leak in the error handling path of 'xlr_i2c_probe()' xen-pciback: Fix return in pm_ctrl_init() net: davinci_emac: Fix interrupt pacing disable ethtool: fix ethtool msg len calculation for pause stats openrisc: fix SMP tlb flush NULL pointer dereference net: vlan: fix a UAF in vlan_dev_real_dev() ice: Fix replacing VF hardware MAC to existing MAC filter ice: Fix not stopping Tx queues for VFs ACPI: PMIC: Fix intel_pmic_regs_handler() read accesses drm/nouveau/svm: Fix refcount leak bug and missing check against null bug net: phy: fix duplex out of sync problem while changing settings bonding: Fix a use-after-free problem when bond_sysfs_slave_add() failed mfd: core: Add missing of_node_put for loop iteration can: mcp251xfd: mcp251xfd_chip_start(): fix error handling for mcp251xfd_chip_rx_int_enable() mm/zsmalloc.c: close race window between zs_pool_dec_isolated() and zs_unregister_migration() zram: off by one in read_block_state() perf bpf: Add missing free to bpf_event__print_bpf_prog_info() llc: fix out-of-bound array index in llc_sk_dev_hash() nfc: pn533: Fix double free when pn533_fill_fragment_skbs() fails arm64: pgtable: make __pte_to_phys/__phys_to_pte_val inline functions bpf, sockmap: Remove unhash handler for BPF sockmap usage bpf: sockmap, strparser, and tls are reusing qdisc_skb_cb and colliding gve: Fix off by one in gve_tx_timeout() seq_file: fix passing wrong private data net/sched: sch_taprio: fix undefined behavior in ktime_mono_to_any net: hns3: fix kernel crash when unload VF while it is being reset net: hns3: allow configure ETS bandwidth of all TCs net: stmmac: allow a tc-taprio base-time of zero vsock: prevent unnecessary refcnt inc for nonblocking connect net/smc: fix sk_refcnt underflow on linkdown and fallback cxgb4: fix eeprom len when diagnostics not implemented selftests/net: udpgso_bench_rx: fix port argument ARM: 9155/1: fix early early_iounmap() ARM: 9156/1: drop cc-option fallbacks for architecture selection parisc: Fix backtrace to always include init funtion names MIPS: Fix assembly error from MIPSr2 code used within MIPS_ISA_ARCH_LEVEL x86/mce: Add errata workaround for Skylake SKX37 posix-cpu-timers: Clear task::posix_cputimers_work in copy_process() irqchip/sifive-plic: Fixup EOI failed when masked f2fs: should use GFP_NOFS for directory inodes net, neigh: Enable state migration between NUD_PERMANENT and NTF_USE 9p/net: fix missing error check in p9_check_errors memcg: prohibit unconditional exceeding the limit of dying tasks powerpc/lib: Add helper to check if offset is within conditional branch range powerpc/bpf: Validate branch ranges powerpc/security: Add a helper to query stf_barrier type powerpc/bpf: Emit stf barrier instruction sequences for BPF_NOSPEC mm, oom: pagefault_out_of_memory: don't force global OOM for dying tasks mm, oom: do not trigger out_of_memory from the #PF mfd: dln2: Add cell for initializing DLN2 ADC video: backlight: Drop maximum brightness override for brightness zero s390/cio: check the subchannel validity for dev_busid s390/tape: fix timer initialization in tape_std_assign() s390/ap: Fix hanging ioctl caused by orphaned replies s390/cio: make ccw_device_dma_* more robust mtd: rawnand: ams-delta: Keep the driver compatible with on-die ECC engines mtd: rawnand: xway: Keep the driver compatible with on-die ECC engines mtd: rawnand: mpc5121: Keep the driver compatible with on-die ECC engines mtd: rawnand: gpio: Keep the driver compatible with on-die ECC engines mtd: rawnand: pasemi: Keep the driver compatible with on-die ECC engines mtd: rawnand: orion: Keep the driver compatible with on-die ECC engines mtd: rawnand: plat_nand: Keep the driver compatible with on-die ECC engines mtd: rawnand: au1550nd: Keep the driver compatible with on-die ECC engines powerpc/powernv/prd: Unregister OPAL_MSG_PRD2 notifier during module unload powerpc/85xx: fix timebase sync issue when CONFIG_HOTPLUG_CPU=n drm/sun4i: Fix macros in sun8i_csc.h PCI: Add PCI_EXP_DEVCTL_PAYLOAD_* macros PCI: aardvark: Fix PCIe Max Payload Size setting SUNRPC: Partial revert of commit 6f9f17287e78 ath10k: fix invalid dma_addr_t token assignment mmc: moxart: Fix null pointer dereference on pointer host selftests/bpf: Fix also no-alu32 strobemeta selftest arch/cc: Introduce a function to check for confidential computing features x86/sev: Add an x86 version of cc_platform_has() x86/sev: Make the #VC exception stacks part of the default stacks storage soc/tegra: pmc: Fix imbalanced clock disabling in error code path Linux 5.10.80 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I21c750863965fbf584251fa2de3c941ae5922d3f
586 lines
16 KiB
C
586 lines
16 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _NET_NEIGHBOUR_H
|
|
#define _NET_NEIGHBOUR_H
|
|
|
|
#include <linux/neighbour.h>
|
|
|
|
/*
|
|
* Generic neighbour manipulation
|
|
*
|
|
* Authors:
|
|
* Pedro Roque <roque@di.fc.ul.pt>
|
|
* Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
|
|
*
|
|
* Changes:
|
|
*
|
|
* Harald Welte: <laforge@gnumonks.org>
|
|
* - Add neighbour cache statistics like rtstat
|
|
*/
|
|
|
|
#include <linux/atomic.h>
|
|
#include <linux/refcount.h>
|
|
#include <linux/netdevice.h>
|
|
#include <linux/skbuff.h>
|
|
#include <linux/rcupdate.h>
|
|
#include <linux/seq_file.h>
|
|
#include <linux/bitmap.h>
|
|
|
|
#include <linux/err.h>
|
|
#include <linux/sysctl.h>
|
|
#include <linux/workqueue.h>
|
|
#include <linux/android_kabi.h>
|
|
#include <net/rtnetlink.h>
|
|
|
|
/*
|
|
* NUD stands for "neighbor unreachability detection"
|
|
*/
|
|
|
|
#define NUD_IN_TIMER (NUD_INCOMPLETE|NUD_REACHABLE|NUD_DELAY|NUD_PROBE)
|
|
#define NUD_VALID (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY)
|
|
#define NUD_CONNECTED (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE)
|
|
|
|
struct neighbour;
|
|
|
|
enum {
|
|
NEIGH_VAR_MCAST_PROBES,
|
|
NEIGH_VAR_UCAST_PROBES,
|
|
NEIGH_VAR_APP_PROBES,
|
|
NEIGH_VAR_MCAST_REPROBES,
|
|
NEIGH_VAR_RETRANS_TIME,
|
|
NEIGH_VAR_BASE_REACHABLE_TIME,
|
|
NEIGH_VAR_DELAY_PROBE_TIME,
|
|
NEIGH_VAR_GC_STALETIME,
|
|
NEIGH_VAR_QUEUE_LEN_BYTES,
|
|
NEIGH_VAR_PROXY_QLEN,
|
|
NEIGH_VAR_ANYCAST_DELAY,
|
|
NEIGH_VAR_PROXY_DELAY,
|
|
NEIGH_VAR_LOCKTIME,
|
|
#define NEIGH_VAR_DATA_MAX (NEIGH_VAR_LOCKTIME + 1)
|
|
/* Following are used as a second way to access one of the above */
|
|
NEIGH_VAR_QUEUE_LEN, /* same data as NEIGH_VAR_QUEUE_LEN_BYTES */
|
|
NEIGH_VAR_RETRANS_TIME_MS, /* same data as NEIGH_VAR_RETRANS_TIME */
|
|
NEIGH_VAR_BASE_REACHABLE_TIME_MS, /* same data as NEIGH_VAR_BASE_REACHABLE_TIME */
|
|
/* Following are used by "default" only */
|
|
NEIGH_VAR_GC_INTERVAL,
|
|
NEIGH_VAR_GC_THRESH1,
|
|
NEIGH_VAR_GC_THRESH2,
|
|
NEIGH_VAR_GC_THRESH3,
|
|
NEIGH_VAR_MAX
|
|
};
|
|
|
|
struct neigh_parms {
|
|
possible_net_t net;
|
|
struct net_device *dev;
|
|
struct list_head list;
|
|
int (*neigh_setup)(struct neighbour *);
|
|
struct neigh_table *tbl;
|
|
|
|
void *sysctl_table;
|
|
|
|
int dead;
|
|
refcount_t refcnt;
|
|
struct rcu_head rcu_head;
|
|
|
|
int reachable_time;
|
|
int data[NEIGH_VAR_DATA_MAX];
|
|
DECLARE_BITMAP(data_state, NEIGH_VAR_DATA_MAX);
|
|
|
|
ANDROID_KABI_RESERVE(1);
|
|
};
|
|
|
|
static inline void neigh_var_set(struct neigh_parms *p, int index, int val)
|
|
{
|
|
set_bit(index, p->data_state);
|
|
p->data[index] = val;
|
|
}
|
|
|
|
#define NEIGH_VAR(p, attr) ((p)->data[NEIGH_VAR_ ## attr])
|
|
|
|
/* In ndo_neigh_setup, NEIGH_VAR_INIT should be used.
|
|
* In other cases, NEIGH_VAR_SET should be used.
|
|
*/
|
|
#define NEIGH_VAR_INIT(p, attr, val) (NEIGH_VAR(p, attr) = val)
|
|
#define NEIGH_VAR_SET(p, attr, val) neigh_var_set(p, NEIGH_VAR_ ## attr, val)
|
|
|
|
static inline void neigh_parms_data_state_setall(struct neigh_parms *p)
|
|
{
|
|
bitmap_fill(p->data_state, NEIGH_VAR_DATA_MAX);
|
|
}
|
|
|
|
static inline void neigh_parms_data_state_cleanall(struct neigh_parms *p)
|
|
{
|
|
bitmap_zero(p->data_state, NEIGH_VAR_DATA_MAX);
|
|
}
|
|
|
|
struct neigh_statistics {
|
|
unsigned long allocs; /* number of allocated neighs */
|
|
unsigned long destroys; /* number of destroyed neighs */
|
|
unsigned long hash_grows; /* number of hash resizes */
|
|
|
|
unsigned long res_failed; /* number of failed resolutions */
|
|
|
|
unsigned long lookups; /* number of lookups */
|
|
unsigned long hits; /* number of hits (among lookups) */
|
|
|
|
unsigned long rcv_probes_mcast; /* number of received mcast ipv6 */
|
|
unsigned long rcv_probes_ucast; /* number of received ucast ipv6 */
|
|
|
|
unsigned long periodic_gc_runs; /* number of periodic GC runs */
|
|
unsigned long forced_gc_runs; /* number of forced GC runs */
|
|
|
|
unsigned long unres_discards; /* number of unresolved drops */
|
|
unsigned long table_fulls; /* times even gc couldn't help */
|
|
};
|
|
|
|
#define NEIGH_CACHE_STAT_INC(tbl, field) this_cpu_inc((tbl)->stats->field)
|
|
|
|
struct neighbour {
|
|
struct neighbour __rcu *next;
|
|
struct neigh_table *tbl;
|
|
struct neigh_parms *parms;
|
|
unsigned long confirmed;
|
|
unsigned long updated;
|
|
rwlock_t lock;
|
|
refcount_t refcnt;
|
|
unsigned int arp_queue_len_bytes;
|
|
struct sk_buff_head arp_queue;
|
|
struct timer_list timer;
|
|
unsigned long used;
|
|
atomic_t probes;
|
|
__u8 flags;
|
|
__u8 nud_state;
|
|
__u8 type;
|
|
__u8 dead;
|
|
u8 protocol;
|
|
seqlock_t ha_lock;
|
|
unsigned char ha[ALIGN(MAX_ADDR_LEN, sizeof(unsigned long))] __aligned(8);
|
|
struct hh_cache hh;
|
|
int (*output)(struct neighbour *, struct sk_buff *);
|
|
const struct neigh_ops *ops;
|
|
struct list_head gc_list;
|
|
struct rcu_head rcu;
|
|
struct net_device *dev;
|
|
|
|
ANDROID_KABI_RESERVE(1);
|
|
|
|
u8 primary_key[0];
|
|
} __randomize_layout;
|
|
|
|
struct neigh_ops {
|
|
int family;
|
|
void (*solicit)(struct neighbour *, struct sk_buff *);
|
|
void (*error_report)(struct neighbour *, struct sk_buff *);
|
|
int (*output)(struct neighbour *, struct sk_buff *);
|
|
int (*connected_output)(struct neighbour *, struct sk_buff *);
|
|
};
|
|
|
|
struct pneigh_entry {
|
|
struct pneigh_entry *next;
|
|
possible_net_t net;
|
|
struct net_device *dev;
|
|
u8 flags;
|
|
u8 protocol;
|
|
u8 key[];
|
|
};
|
|
|
|
/*
|
|
* neighbour table manipulation
|
|
*/
|
|
|
|
#define NEIGH_NUM_HASH_RND 4
|
|
|
|
struct neigh_hash_table {
|
|
struct neighbour __rcu **hash_buckets;
|
|
unsigned int hash_shift;
|
|
__u32 hash_rnd[NEIGH_NUM_HASH_RND];
|
|
struct rcu_head rcu;
|
|
};
|
|
|
|
|
|
struct neigh_table {
|
|
int family;
|
|
unsigned int entry_size;
|
|
unsigned int key_len;
|
|
__be16 protocol;
|
|
__u32 (*hash)(const void *pkey,
|
|
const struct net_device *dev,
|
|
__u32 *hash_rnd);
|
|
bool (*key_eq)(const struct neighbour *, const void *pkey);
|
|
int (*constructor)(struct neighbour *);
|
|
int (*pconstructor)(struct pneigh_entry *);
|
|
void (*pdestructor)(struct pneigh_entry *);
|
|
void (*proxy_redo)(struct sk_buff *skb);
|
|
int (*is_multicast)(const void *pkey);
|
|
bool (*allow_add)(const struct net_device *dev,
|
|
struct netlink_ext_ack *extack);
|
|
char *id;
|
|
struct neigh_parms parms;
|
|
struct list_head parms_list;
|
|
int gc_interval;
|
|
int gc_thresh1;
|
|
int gc_thresh2;
|
|
int gc_thresh3;
|
|
unsigned long last_flush;
|
|
struct delayed_work gc_work;
|
|
struct timer_list proxy_timer;
|
|
struct sk_buff_head proxy_queue;
|
|
atomic_t entries;
|
|
atomic_t gc_entries;
|
|
struct list_head gc_list;
|
|
rwlock_t lock;
|
|
unsigned long last_rand;
|
|
struct neigh_statistics __percpu *stats;
|
|
struct neigh_hash_table __rcu *nht;
|
|
struct pneigh_entry **phash_buckets;
|
|
|
|
ANDROID_KABI_RESERVE(1);
|
|
};
|
|
|
|
enum {
|
|
NEIGH_ARP_TABLE = 0,
|
|
NEIGH_ND_TABLE = 1,
|
|
NEIGH_DN_TABLE = 2,
|
|
NEIGH_NR_TABLES,
|
|
NEIGH_LINK_TABLE = NEIGH_NR_TABLES /* Pseudo table for neigh_xmit */
|
|
};
|
|
|
|
static inline int neigh_parms_family(struct neigh_parms *p)
|
|
{
|
|
return p->tbl->family;
|
|
}
|
|
|
|
#define NEIGH_PRIV_ALIGN sizeof(long long)
|
|
#define NEIGH_ENTRY_SIZE(size) ALIGN((size), NEIGH_PRIV_ALIGN)
|
|
|
|
static inline void *neighbour_priv(const struct neighbour *n)
|
|
{
|
|
return (char *)n + n->tbl->entry_size;
|
|
}
|
|
|
|
/* flags for neigh_update() */
|
|
#define NEIGH_UPDATE_F_OVERRIDE 0x00000001
|
|
#define NEIGH_UPDATE_F_WEAK_OVERRIDE 0x00000002
|
|
#define NEIGH_UPDATE_F_OVERRIDE_ISROUTER 0x00000004
|
|
#define NEIGH_UPDATE_F_USE 0x10000000
|
|
#define NEIGH_UPDATE_F_EXT_LEARNED 0x20000000
|
|
#define NEIGH_UPDATE_F_ISROUTER 0x40000000
|
|
#define NEIGH_UPDATE_F_ADMIN 0x80000000
|
|
|
|
extern const struct nla_policy nda_policy[];
|
|
|
|
static inline bool neigh_key_eq16(const struct neighbour *n, const void *pkey)
|
|
{
|
|
return *(const u16 *)n->primary_key == *(const u16 *)pkey;
|
|
}
|
|
|
|
static inline bool neigh_key_eq32(const struct neighbour *n, const void *pkey)
|
|
{
|
|
return *(const u32 *)n->primary_key == *(const u32 *)pkey;
|
|
}
|
|
|
|
static inline bool neigh_key_eq128(const struct neighbour *n, const void *pkey)
|
|
{
|
|
const u32 *n32 = (const u32 *)n->primary_key;
|
|
const u32 *p32 = pkey;
|
|
|
|
return ((n32[0] ^ p32[0]) | (n32[1] ^ p32[1]) |
|
|
(n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0;
|
|
}
|
|
|
|
static inline struct neighbour *___neigh_lookup_noref(
|
|
struct neigh_table *tbl,
|
|
bool (*key_eq)(const struct neighbour *n, const void *pkey),
|
|
__u32 (*hash)(const void *pkey,
|
|
const struct net_device *dev,
|
|
__u32 *hash_rnd),
|
|
const void *pkey,
|
|
struct net_device *dev)
|
|
{
|
|
struct neigh_hash_table *nht = rcu_dereference_bh(tbl->nht);
|
|
struct neighbour *n;
|
|
u32 hash_val;
|
|
|
|
hash_val = hash(pkey, dev, nht->hash_rnd) >> (32 - nht->hash_shift);
|
|
for (n = rcu_dereference_bh(nht->hash_buckets[hash_val]);
|
|
n != NULL;
|
|
n = rcu_dereference_bh(n->next)) {
|
|
if (n->dev == dev && key_eq(n, pkey))
|
|
return n;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
static inline struct neighbour *__neigh_lookup_noref(struct neigh_table *tbl,
|
|
const void *pkey,
|
|
struct net_device *dev)
|
|
{
|
|
return ___neigh_lookup_noref(tbl, tbl->key_eq, tbl->hash, pkey, dev);
|
|
}
|
|
|
|
void neigh_table_init(int index, struct neigh_table *tbl);
|
|
int neigh_table_clear(int index, struct neigh_table *tbl);
|
|
struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey,
|
|
struct net_device *dev);
|
|
struct neighbour *neigh_lookup_nodev(struct neigh_table *tbl, struct net *net,
|
|
const void *pkey);
|
|
struct neighbour *__neigh_create(struct neigh_table *tbl, const void *pkey,
|
|
struct net_device *dev, bool want_ref);
|
|
static inline struct neighbour *neigh_create(struct neigh_table *tbl,
|
|
const void *pkey,
|
|
struct net_device *dev)
|
|
{
|
|
return __neigh_create(tbl, pkey, dev, true);
|
|
}
|
|
void neigh_destroy(struct neighbour *neigh);
|
|
int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb);
|
|
int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, u32 flags,
|
|
u32 nlmsg_pid);
|
|
void __neigh_set_probe_once(struct neighbour *neigh);
|
|
bool neigh_remove_one(struct neighbour *ndel, struct neigh_table *tbl);
|
|
void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev);
|
|
int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev);
|
|
int neigh_carrier_down(struct neigh_table *tbl, struct net_device *dev);
|
|
int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb);
|
|
int neigh_connected_output(struct neighbour *neigh, struct sk_buff *skb);
|
|
int neigh_direct_output(struct neighbour *neigh, struct sk_buff *skb);
|
|
struct neighbour *neigh_event_ns(struct neigh_table *tbl,
|
|
u8 *lladdr, void *saddr,
|
|
struct net_device *dev);
|
|
|
|
struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
|
|
struct neigh_table *tbl);
|
|
void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms);
|
|
|
|
static inline
|
|
struct net *neigh_parms_net(const struct neigh_parms *parms)
|
|
{
|
|
return read_pnet(&parms->net);
|
|
}
|
|
|
|
unsigned long neigh_rand_reach_time(unsigned long base);
|
|
|
|
void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
|
|
struct sk_buff *skb);
|
|
struct pneigh_entry *pneigh_lookup(struct neigh_table *tbl, struct net *net,
|
|
const void *key, struct net_device *dev,
|
|
int creat);
|
|
struct pneigh_entry *__pneigh_lookup(struct neigh_table *tbl, struct net *net,
|
|
const void *key, struct net_device *dev);
|
|
int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *key,
|
|
struct net_device *dev);
|
|
|
|
static inline struct net *pneigh_net(const struct pneigh_entry *pneigh)
|
|
{
|
|
return read_pnet(&pneigh->net);
|
|
}
|
|
|
|
void neigh_app_ns(struct neighbour *n);
|
|
void neigh_for_each(struct neigh_table *tbl,
|
|
void (*cb)(struct neighbour *, void *), void *cookie);
|
|
void __neigh_for_each_release(struct neigh_table *tbl,
|
|
int (*cb)(struct neighbour *));
|
|
int neigh_xmit(int fam, struct net_device *, const void *, struct sk_buff *);
|
|
void pneigh_for_each(struct neigh_table *tbl,
|
|
void (*cb)(struct pneigh_entry *));
|
|
|
|
struct neigh_seq_state {
|
|
struct seq_net_private p;
|
|
struct neigh_table *tbl;
|
|
struct neigh_hash_table *nht;
|
|
void *(*neigh_sub_iter)(struct neigh_seq_state *state,
|
|
struct neighbour *n, loff_t *pos);
|
|
unsigned int bucket;
|
|
unsigned int flags;
|
|
#define NEIGH_SEQ_NEIGH_ONLY 0x00000001
|
|
#define NEIGH_SEQ_IS_PNEIGH 0x00000002
|
|
#define NEIGH_SEQ_SKIP_NOARP 0x00000004
|
|
};
|
|
void *neigh_seq_start(struct seq_file *, loff_t *, struct neigh_table *,
|
|
unsigned int);
|
|
void *neigh_seq_next(struct seq_file *, void *, loff_t *);
|
|
void neigh_seq_stop(struct seq_file *, void *);
|
|
|
|
int neigh_proc_dointvec(struct ctl_table *ctl, int write,
|
|
void *buffer, size_t *lenp, loff_t *ppos);
|
|
int neigh_proc_dointvec_jiffies(struct ctl_table *ctl, int write,
|
|
void *buffer,
|
|
size_t *lenp, loff_t *ppos);
|
|
int neigh_proc_dointvec_ms_jiffies(struct ctl_table *ctl, int write,
|
|
void *buffer, size_t *lenp, loff_t *ppos);
|
|
|
|
int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
|
|
proc_handler *proc_handler);
|
|
void neigh_sysctl_unregister(struct neigh_parms *p);
|
|
|
|
static inline void __neigh_parms_put(struct neigh_parms *parms)
|
|
{
|
|
refcount_dec(&parms->refcnt);
|
|
}
|
|
|
|
static inline struct neigh_parms *neigh_parms_clone(struct neigh_parms *parms)
|
|
{
|
|
refcount_inc(&parms->refcnt);
|
|
return parms;
|
|
}
|
|
|
|
/*
|
|
* Neighbour references
|
|
*/
|
|
|
|
static inline void neigh_release(struct neighbour *neigh)
|
|
{
|
|
if (refcount_dec_and_test(&neigh->refcnt))
|
|
neigh_destroy(neigh);
|
|
}
|
|
|
|
static inline struct neighbour * neigh_clone(struct neighbour *neigh)
|
|
{
|
|
if (neigh)
|
|
refcount_inc(&neigh->refcnt);
|
|
return neigh;
|
|
}
|
|
|
|
#define neigh_hold(n) refcount_inc(&(n)->refcnt)
|
|
|
|
static inline int neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
|
|
{
|
|
unsigned long now = jiffies;
|
|
|
|
if (READ_ONCE(neigh->used) != now)
|
|
WRITE_ONCE(neigh->used, now);
|
|
if (!(neigh->nud_state&(NUD_CONNECTED|NUD_DELAY|NUD_PROBE)))
|
|
return __neigh_event_send(neigh, skb);
|
|
return 0;
|
|
}
|
|
|
|
#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
|
|
static inline int neigh_hh_bridge(struct hh_cache *hh, struct sk_buff *skb)
|
|
{
|
|
unsigned int seq, hh_alen;
|
|
|
|
do {
|
|
seq = read_seqbegin(&hh->hh_lock);
|
|
hh_alen = HH_DATA_ALIGN(ETH_HLEN);
|
|
memcpy(skb->data - hh_alen, hh->hh_data, ETH_ALEN + hh_alen - ETH_HLEN);
|
|
} while (read_seqretry(&hh->hh_lock, seq));
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb)
|
|
{
|
|
unsigned int hh_alen = 0;
|
|
unsigned int seq;
|
|
unsigned int hh_len;
|
|
|
|
do {
|
|
seq = read_seqbegin(&hh->hh_lock);
|
|
hh_len = READ_ONCE(hh->hh_len);
|
|
if (likely(hh_len <= HH_DATA_MOD)) {
|
|
hh_alen = HH_DATA_MOD;
|
|
|
|
/* skb_push() would proceed silently if we have room for
|
|
* the unaligned size but not for the aligned size:
|
|
* check headroom explicitly.
|
|
*/
|
|
if (likely(skb_headroom(skb) >= HH_DATA_MOD)) {
|
|
/* this is inlined by gcc */
|
|
memcpy(skb->data - HH_DATA_MOD, hh->hh_data,
|
|
HH_DATA_MOD);
|
|
}
|
|
} else {
|
|
hh_alen = HH_DATA_ALIGN(hh_len);
|
|
|
|
if (likely(skb_headroom(skb) >= hh_alen)) {
|
|
memcpy(skb->data - hh_alen, hh->hh_data,
|
|
hh_alen);
|
|
}
|
|
}
|
|
} while (read_seqretry(&hh->hh_lock, seq));
|
|
|
|
if (WARN_ON_ONCE(skb_headroom(skb) < hh_alen)) {
|
|
kfree_skb(skb);
|
|
return NET_XMIT_DROP;
|
|
}
|
|
|
|
__skb_push(skb, hh_len);
|
|
return dev_queue_xmit(skb);
|
|
}
|
|
|
|
static inline int neigh_output(struct neighbour *n, struct sk_buff *skb,
|
|
bool skip_cache)
|
|
{
|
|
const struct hh_cache *hh = &n->hh;
|
|
|
|
/* n->nud_state and hh->hh_len could be changed under us.
|
|
* neigh_hh_output() is taking care of the race later.
|
|
*/
|
|
if (!skip_cache &&
|
|
(READ_ONCE(n->nud_state) & NUD_CONNECTED) &&
|
|
READ_ONCE(hh->hh_len))
|
|
return neigh_hh_output(hh, skb);
|
|
|
|
return n->output(n, skb);
|
|
}
|
|
|
|
static inline struct neighbour *
|
|
__neigh_lookup(struct neigh_table *tbl, const void *pkey, struct net_device *dev, int creat)
|
|
{
|
|
struct neighbour *n = neigh_lookup(tbl, pkey, dev);
|
|
|
|
if (n || !creat)
|
|
return n;
|
|
|
|
n = neigh_create(tbl, pkey, dev);
|
|
return IS_ERR(n) ? NULL : n;
|
|
}
|
|
|
|
static inline struct neighbour *
|
|
__neigh_lookup_errno(struct neigh_table *tbl, const void *pkey,
|
|
struct net_device *dev)
|
|
{
|
|
struct neighbour *n = neigh_lookup(tbl, pkey, dev);
|
|
|
|
if (n)
|
|
return n;
|
|
|
|
return neigh_create(tbl, pkey, dev);
|
|
}
|
|
|
|
struct neighbour_cb {
|
|
unsigned long sched_next;
|
|
unsigned int flags;
|
|
};
|
|
|
|
#define LOCALLY_ENQUEUED 0x1
|
|
|
|
#define NEIGH_CB(skb) ((struct neighbour_cb *)(skb)->cb)
|
|
|
|
static inline void neigh_ha_snapshot(char *dst, const struct neighbour *n,
|
|
const struct net_device *dev)
|
|
{
|
|
unsigned int seq;
|
|
|
|
do {
|
|
seq = read_seqbegin(&n->ha_lock);
|
|
memcpy(dst, n->ha, dev->addr_len);
|
|
} while (read_seqretry(&n->ha_lock, seq));
|
|
}
|
|
|
|
static inline void neigh_update_is_router(struct neighbour *neigh, u32 flags,
|
|
int *notify)
|
|
{
|
|
u8 ndm_flags = 0;
|
|
|
|
ndm_flags |= (flags & NEIGH_UPDATE_F_ISROUTER) ? NTF_ROUTER : 0;
|
|
if ((neigh->flags ^ ndm_flags) & NTF_ROUTER) {
|
|
if (ndm_flags & NTF_ROUTER)
|
|
neigh->flags |= NTF_ROUTER;
|
|
else
|
|
neigh->flags &= ~NTF_ROUTER;
|
|
*notify = 1;
|
|
}
|
|
}
|
|
#endif
|