61bba85e05
https://source.android.com/security/bulletin/2022-03-01 CVE-2020-29368 CVE-2021-39685 CVE-2021-39686 CVE-2021-39698 CVE-2021-3655 * tag 'ASB-2022-03-05_4.19-stable' of https://github.com/aosp-mirror/kernel_common: Linux 4.19.232 tty: n_gsm: fix encoding of control signal octet bit DV xhci: Prevent futile URB re-submissions due to incorrect return value. xhci: re-initialize the HC during resume if HCE was set usb: dwc3: gadget: Let the interrupt handler disable bottom halves. usb: dwc3: pci: Fix Bay Trail phy GPIO mappings USB: serial: option: add Telit LE910R1 compositions USB: serial: option: add support for DW5829e tracefs: Set the group ownership in apply_options() not parse_options() USB: gadget: validate endpoint index for xilinx udc usb: gadget: rndis: add spinlock for rndis response list Revert "USB: serial: ch341: add new Product ID for CH341A" ata: pata_hpt37x: disable primary channel on HPT371 iio: adc: men_z188_adc: Fix a resource leak in an error handling path tracing: Have traceon and traceoff trigger honor the instance fget: clarify and improve __fget_files() implementation memblock: use kfree() to release kmalloced memblock regions Revert "drm/nouveau/pmu/gm200-: avoid touching PMU outside of DEVINIT/PREOS/ACR" gpio: tegra186: Fix chip_data type confusion tty: n_gsm: fix proper link termination after failed open RDMA/ib_srp: Fix a deadlock configfs: fix a race in configfs_{,un}register_subsystem() net/mlx5e: Fix wrong return value on ioctl EEPROM query failure drm/edid: Always set RGB444 openvswitch: Fix setting ipv6 fields causing hw csum failure gso: do not skip outer ip header in case of ipip and net_failover tipc: Fix end of loop tests for list_for_each_entry() net: __pskb_pull_tail() & pskb_carve_frag_list() drop_monitor friends ping: remove pr_err from ping_lookup USB: zaurus: support another broken Zaurus sr9700: sanity check for packet length parisc/unaligned: Fix ldw() and stw() unalignment handlers parisc/unaligned: Fix fldd and fstd unaligned handlers on 32-bit kernel vhost/vsock: don't check owner in vhost_vsock_stop() while releasing cgroup/cpuset: Fix a race between cpuset_attach() and cpu hotplug Linux 4.19.231 net: macb: Align the dma and coherent dma masks net: usb: qmi_wwan: Add support for Dell DW5829e tracing: Fix tp_printk option related with tp_printk_stop_on_boot ata: libata-core: Disable TRIM on M88V29 kconfig: let 'shell' return enough output for deep path names arm64: dts: meson-gx: add ATF BL32 reserved-memory region netfilter: conntrack: don't refresh sctp entries in closed state irqchip/sifive-plic: Add missing thead,c900-plic match string ARM: OMAP2+: hwmod: Add of_node_put() before break KVM: x86/pmu: Use AMD64_RAW_EVENT_MASK for PERF_TYPE_RAW Drivers: hv: vmbus: Fix memory leak in vmbus_add_channel_kobj Drivers: hv: vmbus: Expose monitor data only when monitor pages are used mtd: rawnand: brcmnand: Fixed incorrect sub-page ECC status mtd: rawnand: brcmnand: Refactored code to introduce helper functions lib/iov_iter: initialize "flags" in new pipe_buffer i2c: brcmstb: fix support for DSL and CM variants dmaengine: sh: rcar-dmac: Check for error num after setting mask net: sched: limit TC_ACT_REPEAT loops EDAC: Fix calculation of returned address and next offset in edac_align_ptr() mtd: rawnand: qcom: Fix clock sequencing in qcom_nandc_probe() NFS: Do not report writeback errors in nfs_getattr() NFS: LOOKUP_DIRECTORY is also ok with symlinks block/wbt: fix negative inflight counter when remove scsi device ext4: check for out-of-order index extents in ext4_valid_extent_entries() powerpc/lib/sstep: fix 'ptesync' build error ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw_range() ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw() ALSA: hda: Fix missing codec probe on Shenker Dock 15 ALSA: hda: Fix regression on forced probe mask option libsubcmd: Fix use-after-free for realloc(..., 0) bonding: fix data-races around agg_select_timer drop_monitor: fix data-race in dropmon_net_event / trace_napi_poll_hit ping: fix the dif and sdif check in ping_lookup net: ieee802154: ca8210: Fix lifs/sifs periods net: dsa: lan9303: fix reset on probe iwlwifi: pcie: gen2: fix locking when "HW not ready" iwlwifi: pcie: fix locking when "HW not ready" vsock: remove vsock from connected table when connect is interrupted by a signal mmc: block: fix read single on recovery logic taskstats: Cleanup the use of task->exit_code xfrm: Don't accidentally set RTO_ONLINK in decode_session4() drm/radeon: Fix backlight control on iMac 12,1 iwlwifi: fix use-after-free Revert "module, async: async_synchronize_full() on module init iff async is used" nvme-rdma: fix possible use-after-free in transport error_recovery work nvme: fix a possible use-after-free in controller reset during load quota: make dquot_quota_sync return errors from ->sync_fs vfs: make freeze_super abort when sync_filesystem returns error ax25: improve the incomplete fix to avoid UAF and NPD bugs selftests/zram: Adapt the situation that /dev/zram0 is being used selftests/zram01.sh: Fix compression ratio calculation selftests/zram: Skip max_comp_streams interface on newer kernel net: ieee802154: at86rf230: Stop leaking skb's btrfs: send: in case of IO error log it parisc: Fix sglist access in ccio-dma.c parisc: Fix data TLB miss in sba_unmap_sg serial: parisc: GSC: fix build when IOSAPIC is not set net: usb: ax88179_178a: Fix out-of-bounds accesses in RX fixup Makefile.extrawarn: Move -Wunaligned-access to W=1 Linux 4.19.230 perf: Fix list corruption in perf_cgroup_switch() hwmon: (dell-smm) Speed up setting of fan speed seccomp: Invalidate seccomp mode to catch death failures USB: serial: cp210x: add CPI Bulk Coin Recycler id USB: serial: cp210x: add NCR Retail IO box id USB: serial: ch341: add support for GW Instek USB2.0-Serial devices USB: serial: option: add ZTE MF286D modem USB: serial: ftdi_sio: add support for Brainboxes US-159/235/320 usb: gadget: rndis: check size of RNDIS_MSG_SET command USB: gadget: validate interface OS descriptor requests usb: dwc3: gadget: Prevent core from processing stale TRBs usb: ulpi: Call of_node_put correctly usb: ulpi: Move of_node_put to ulpi_dev_release n_tty: wake up poll(POLLRDNORM) on receiving data vt_ioctl: add array_index_nospec to VT_ACTIVATE vt_ioctl: fix array_index_nospec in vt_setactivate net: amd-xgbe: disable interrupts during pci removal tipc: rate limit warning for received illegal binding update veth: fix races around rq->rx_notify_masked net: fix a memleak when uncloning an skb dst and its metadata net: do not keep the dst cache when uncloning an skb dst and its metadata ipmr,ip6mr: acquire RTNL before calling ip[6]mr_free_table() on failure path bonding: pair enable_port with slave_arr_updates ixgbevf: Require large buffers for build_skb on 82599VF usb: f_fs: Fix use-after-free for epfile ARM: dts: imx6qdl-udoo: Properly describe the SD card detect staging: fbtft: Fix error path in fbtft_driver_module_init() ARM: dts: meson: Fix the UART compatible strings perf probe: Fix ppc64 'perf probe add events failed' case net: bridge: fix stale eth hdr pointer in br_dev_xmit ARM: dts: imx23-evk: Remove MX23_PAD_SSP1_DETECT from hog group bpf: Add kconfig knob for disabling unpriv bpf by default net: stmmac: dwmac-sun8i: use return val of readl_poll_timeout() usb: dwc2: gadget: don't try to disable ep0 in dwc2_hsotg_suspend scsi: target: iscsi: Make sure the np under each tpg is unique net: sched: Clarify error message when qdisc kind is unknown NFSv4 expose nfs_parse_server_name function NFSv4 remove zero number of fs_locations entries error check NFSv4.1: Fix uninitialised variable in devicenotify nfs: nfs4clinet: check the return value of kstrdup() NFSv4 only print the label when its queried NFSD: Fix offset type in I/O trace points NFSD: Clamp WRITE offsets NFS: Fix initialisation of nfs_client cl_flags field net: phy: marvell: Fix MDI-x polarity setting in 88e1118-compatible PHYs mmc: sdhci-of-esdhc: Check for error num after setting mask ima: Allow template selection with ima_template[_fmt]= after ima_hash= ima: Remove ima_policy file before directory integrity: check the return value of audit_log_start() FROMGIT: f2fs: avoid EINVAL by SBI_NEED_FSCK when pinning a file Revert "tracefs: Have tracefs directories not set OTH permission bits by default" ANDROID: GKI: Enable CONFIG_SERIAL_8250_RUNTIME_UARTS=0 Linux 4.19.229 tipc: improve size validations for received domain records moxart: fix potential use-after-free on remove path cgroup-v1: Require capabilities to set release_agent Linux 4.19.228 ext4: fix error handling in ext4_restore_inline_data() EDAC/xgene: Fix deferred probing EDAC/altera: Fix deferred probing rtc: cmos: Evaluate century appropriate selftests: futex: Use variable MAKE instead of make nfsd: nfsd4_setclientid_confirm mistakenly expires confirmed client. scsi: bnx2fc: Make bnx2fc_recv_frame() mp safe ASoC: max9759: fix underflow in speaker_gain_control_put() ASoC: cpcap: Check for NULL pointer after calling of_get_child_by_name ASoC: fsl: Add missing error handling in pcm030_fabric_probe drm/i915/overlay: Prevent divide by zero bugs in scaling net: stmmac: ensure PTP time register reads are consistent net: macsec: Verify that send_sci is on when setting Tx sci explicitly net: ieee802154: Return meaningful error codes from the netlink helpers net: ieee802154: ca8210: Stop leaking skb's net: ieee802154: mcr20a: Fix lifs/sifs periods net: ieee802154: hwsim: Ensure proper channel selection at probe time spi: meson-spicc: add IRQ check in meson_spicc_probe spi: mediatek: Avoid NULL pointer crash in interrupt spi: bcm-qspi: check for valid cs before applying chip select iommu/amd: Fix loop timeout issue in iommu_ga_log_enable() iommu/vt-d: Fix potential memory leak in intel_setup_irq_remapping() RDMA/mlx4: Don't continue event handler after memory allocation failure Revert "ASoC: mediatek: Check for error clk pointer" block: bio-integrity: Advance seed correctly for larger interval sizes drm/nouveau: fix off by one in BIOS boundary checking ALSA: hda/realtek: Fix silent output on Gigabyte X570 Aorus Xtreme after reboot from Windows ALSA: hda/realtek: Fix silent output on Gigabyte X570S Aorus Master (newer chipset) ALSA: hda/realtek: Add missing fixup-model entry for Gigabyte X570 ALC1220 quirks ASoC: ops: Reject out of bounds values in snd_soc_put_xr_sx() ASoC: ops: Reject out of bounds values in snd_soc_put_volsw_sx() ASoC: ops: Reject out of bounds values in snd_soc_put_volsw() audit: improve audit queue handling when "audit=1" on cmdline af_packet: fix data-race in packet_setsockopt / packet_setsockopt rtnetlink: make sure to refresh master_dev/m_ops in __rtnl_newlink() net: amd-xgbe: Fix skb data length underflow net: amd-xgbe: ensure to reset the tx_timer_active flag ipheth: fix EOVERFLOW in ipheth_rcvbulk_callback tcp: fix possible socket leaks in internal pacing mode netfilter: nat: limit port clash resolution attempts netfilter: nat: remove l4 protocol port rovers ipv4: tcp: send zero IPID in SYNACK messages ipv4: raw: lock the socket in raw_bind() yam: fix a memory leak in yam_siocdevprivate() ibmvnic: don't spin in tasklet ibmvnic: init ->running_cap_crqs early phylib: fix potential use-after-free NFS: Ensure the server has an up to date ctime before renaming NFS: Ensure the server has an up to date ctime before hardlinking ipv6: annotate accesses to fn->fn_sernum drm/msm/dsi: invalid parameter check in msm_dsi_phy_enable drm/msm: Fix wrong size calculation net-procfs: show net devices bound packet types NFSv4: nfs_atomic_open() can race when looking up a non-regular file NFSv4: Handle case where the lookup of a directory fails hwmon: (lm90) Reduce maximum conversion rate for G781 ipv4: avoid using shared IP generator for connected sockets ping: fix the sk_bound_dev_if match in ping_lookup net: fix information leakage in /proc/net/ptype ipv6_tunnel: Rate limit warning messages scsi: bnx2fc: Flush destroy_work queue before calling bnx2fc_interface_put() rpmsg: char: Fix race between the release of rpmsg_eptdev and cdev rpmsg: char: Fix race between the release of rpmsg_ctrldev and cdev i40e: fix unsigned stat widths i40e: Fix queues reservation for XDP i40e: Fix issue when maximum queues is exceeded i40e: Increase delay to 1 s after global EMP reset powerpc/32: Fix boot failure with GCC latent entropy plugin net: sfp: ignore disabled SFP node usb: typec: tcpm: Do not disconnect while receiving VBUS off USB: core: Fix hang in usb_kill_urb by adding memory barriers usb: gadget: f_sourcesink: Fix isoc transfer for USB_SPEED_SUPER_PLUS usb: common: ulpi: Fix crash in ulpi_match() usb-storage: Add unusual-devs entry for VL817 USB-SATA bridge tty: Add support for Brainboxes UC cards. tty: n_gsm: fix SW flow control encoding/handling serial: stm32: fix software flow control transfer serial: 8250: of: Fix mapped region size when using reg-offset property netfilter: nft_payload: do not update layer 4 checksum when mangling fragments drm/etnaviv: relax submit size limits PM: wakeup: simplify the output logic of pm_show_wakelocks() udf: Fix NULL ptr deref when converting from inline format udf: Restore i_lenAlloc when inode expansion fails scsi: zfcp: Fix failed recovery on gone remote port with non-NPIV FCP devices s390/hypfs: include z/VM guests with access control group set Bluetooth: refactor malicious adv data check ANDROID: Increase x86 cmdline size to 4k Change-Id: Icc3c578b223a53feb469666071df2e1715fa8698 Signed-off-by: UtsavBalar1231 <utsavbalar1231@gmail.com> Conflicts: drivers/usb/dwc3/gadget.c drivers/usb/gadget/function/f_fs.c
398 lines
9.0 KiB
C
398 lines
9.0 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/netdevice.h>
|
|
#include <linux/proc_fs.h>
|
|
#include <linux/seq_file.h>
|
|
#include <net/wext.h>
|
|
|
|
#define BUCKET_SPACE (32 - NETDEV_HASHBITS - 1)
|
|
|
|
#define get_bucket(x) ((x) >> BUCKET_SPACE)
|
|
#define get_offset(x) ((x) & ((1 << BUCKET_SPACE) - 1))
|
|
#define set_bucket_offset(b, o) ((b) << BUCKET_SPACE | (o))
|
|
|
|
extern struct list_head ptype_all __read_mostly;
|
|
extern struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
|
|
|
|
static inline struct net_device *dev_from_same_bucket(struct seq_file *seq, loff_t *pos)
|
|
{
|
|
struct net *net = seq_file_net(seq);
|
|
struct net_device *dev;
|
|
struct hlist_head *h;
|
|
unsigned int count = 0, offset = get_offset(*pos);
|
|
|
|
h = &net->dev_name_head[get_bucket(*pos)];
|
|
hlist_for_each_entry_rcu(dev, h, name_hlist) {
|
|
if (++count == offset)
|
|
return dev;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
static inline struct net_device *dev_from_bucket(struct seq_file *seq, loff_t *pos)
|
|
{
|
|
struct net_device *dev;
|
|
unsigned int bucket;
|
|
|
|
do {
|
|
dev = dev_from_same_bucket(seq, pos);
|
|
if (dev)
|
|
return dev;
|
|
|
|
bucket = get_bucket(*pos) + 1;
|
|
*pos = set_bucket_offset(bucket, 1);
|
|
} while (bucket < NETDEV_HASHENTRIES);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
* This is invoked by the /proc filesystem handler to display a device
|
|
* in detail.
|
|
*/
|
|
static void *dev_seq_start(struct seq_file *seq, loff_t *pos)
|
|
__acquires(RCU)
|
|
{
|
|
rcu_read_lock();
|
|
if (!*pos)
|
|
return SEQ_START_TOKEN;
|
|
|
|
if (get_bucket(*pos) >= NETDEV_HASHENTRIES)
|
|
return NULL;
|
|
|
|
return dev_from_bucket(seq, pos);
|
|
}
|
|
|
|
static void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|
{
|
|
++*pos;
|
|
return dev_from_bucket(seq, pos);
|
|
}
|
|
|
|
static void dev_seq_stop(struct seq_file *seq, void *v)
|
|
__releases(RCU)
|
|
{
|
|
rcu_read_unlock();
|
|
}
|
|
|
|
static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev)
|
|
{
|
|
struct rtnl_link_stats64 temp;
|
|
const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp);
|
|
|
|
seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu "
|
|
"%8llu %7llu %4llu %4llu %4llu %5llu %7llu %10llu\n",
|
|
dev->name, stats->rx_bytes, stats->rx_packets,
|
|
stats->rx_errors,
|
|
stats->rx_dropped + stats->rx_missed_errors,
|
|
stats->rx_fifo_errors,
|
|
stats->rx_length_errors + stats->rx_over_errors +
|
|
stats->rx_crc_errors + stats->rx_frame_errors,
|
|
stats->rx_compressed, stats->multicast,
|
|
stats->tx_bytes, stats->tx_packets,
|
|
stats->tx_errors, stats->tx_dropped,
|
|
stats->tx_fifo_errors, stats->collisions,
|
|
stats->tx_carrier_errors +
|
|
stats->tx_aborted_errors +
|
|
stats->tx_window_errors +
|
|
stats->tx_heartbeat_errors,
|
|
stats->tx_compressed);
|
|
}
|
|
|
|
/*
|
|
* Called from the PROCfs module. This now uses the new arbitrary sized
|
|
* /proc/net interface to create /proc/net/dev
|
|
*/
|
|
static int dev_seq_show(struct seq_file *seq, void *v)
|
|
{
|
|
if (v == SEQ_START_TOKEN)
|
|
seq_puts(seq, "Inter-| Receive "
|
|
" | Transmit\n"
|
|
" face |bytes packets errs drop fifo frame "
|
|
"compressed multicast|bytes packets errs "
|
|
"drop fifo colls carrier compressed\n");
|
|
else
|
|
dev_seq_printf_stats(seq, v);
|
|
return 0;
|
|
}
|
|
|
|
static struct softnet_data *softnet_get_online(loff_t *pos)
|
|
{
|
|
struct softnet_data *sd = NULL;
|
|
|
|
while (*pos < nr_cpu_ids)
|
|
if (cpu_online(*pos)) {
|
|
sd = &per_cpu(softnet_data, *pos);
|
|
break;
|
|
} else
|
|
++*pos;
|
|
return sd;
|
|
}
|
|
|
|
static void *softnet_seq_start(struct seq_file *seq, loff_t *pos)
|
|
{
|
|
return softnet_get_online(pos);
|
|
}
|
|
|
|
static void *softnet_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|
{
|
|
++*pos;
|
|
return softnet_get_online(pos);
|
|
}
|
|
|
|
static void softnet_seq_stop(struct seq_file *seq, void *v)
|
|
{
|
|
}
|
|
|
|
static int softnet_seq_show(struct seq_file *seq, void *v)
|
|
{
|
|
struct softnet_data *sd = v;
|
|
unsigned int flow_limit_count = 0;
|
|
|
|
#ifdef CONFIG_NET_FLOW_LIMIT
|
|
struct sd_flow_limit *fl;
|
|
|
|
rcu_read_lock();
|
|
fl = rcu_dereference(sd->flow_limit);
|
|
if (fl)
|
|
flow_limit_count = fl->count;
|
|
rcu_read_unlock();
|
|
#endif
|
|
|
|
seq_printf
|
|
(seq, "%08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x\n",
|
|
sd->processed, sd->dropped, sd->time_squeeze, 0,
|
|
0, 0, 0, 0, /* was fastroute */
|
|
0, /* was cpu_collision */
|
|
sd->received_rps, flow_limit_count, sd->gro_coalesced);
|
|
return 0;
|
|
}
|
|
|
|
static const struct seq_operations dev_seq_ops = {
|
|
.start = dev_seq_start,
|
|
.next = dev_seq_next,
|
|
.stop = dev_seq_stop,
|
|
.show = dev_seq_show,
|
|
};
|
|
|
|
static const struct seq_operations softnet_seq_ops = {
|
|
.start = softnet_seq_start,
|
|
.next = softnet_seq_next,
|
|
.stop = softnet_seq_stop,
|
|
.show = softnet_seq_show,
|
|
};
|
|
|
|
static void *ptype_get_idx(struct seq_file *seq, loff_t pos)
|
|
{
|
|
struct list_head *ptype_list = NULL;
|
|
struct packet_type *pt = NULL;
|
|
struct net_device *dev;
|
|
loff_t i = 0;
|
|
int t;
|
|
|
|
for_each_netdev_rcu(seq_file_net(seq), dev) {
|
|
ptype_list = &dev->ptype_all;
|
|
list_for_each_entry_rcu(pt, ptype_list, list) {
|
|
if (i == pos)
|
|
return pt;
|
|
++i;
|
|
}
|
|
}
|
|
|
|
list_for_each_entry_rcu(pt, &ptype_all, list) {
|
|
if (i == pos)
|
|
return pt;
|
|
++i;
|
|
}
|
|
|
|
for (t = 0; t < PTYPE_HASH_SIZE; t++) {
|
|
list_for_each_entry_rcu(pt, &ptype_base[t], list) {
|
|
if (i == pos)
|
|
return pt;
|
|
++i;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
static void *ptype_seq_start(struct seq_file *seq, loff_t *pos)
|
|
__acquires(RCU)
|
|
{
|
|
rcu_read_lock();
|
|
return *pos ? ptype_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
|
|
}
|
|
|
|
static void *ptype_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|
{
|
|
struct net_device *dev;
|
|
struct packet_type *pt;
|
|
struct list_head *nxt;
|
|
int hash;
|
|
|
|
++*pos;
|
|
if (v == SEQ_START_TOKEN)
|
|
return ptype_get_idx(seq, 0);
|
|
|
|
pt = v;
|
|
nxt = pt->list.next;
|
|
if (pt->dev) {
|
|
if (nxt != &pt->dev->ptype_all)
|
|
goto found;
|
|
|
|
dev = pt->dev;
|
|
for_each_netdev_continue_rcu(seq_file_net(seq), dev) {
|
|
if (!list_empty(&dev->ptype_all)) {
|
|
nxt = dev->ptype_all.next;
|
|
goto found;
|
|
}
|
|
}
|
|
|
|
nxt = ptype_all.next;
|
|
goto ptype_all;
|
|
}
|
|
|
|
if (pt->type == htons(ETH_P_ALL)) {
|
|
ptype_all:
|
|
if (nxt != &ptype_all)
|
|
goto found;
|
|
hash = 0;
|
|
nxt = ptype_base[0].next;
|
|
} else
|
|
hash = ntohs(pt->type) & PTYPE_HASH_MASK;
|
|
|
|
while (nxt == &ptype_base[hash]) {
|
|
if (++hash >= PTYPE_HASH_SIZE)
|
|
return NULL;
|
|
nxt = ptype_base[hash].next;
|
|
}
|
|
found:
|
|
return list_entry(nxt, struct packet_type, list);
|
|
}
|
|
|
|
static void ptype_seq_stop(struct seq_file *seq, void *v)
|
|
__releases(RCU)
|
|
{
|
|
rcu_read_unlock();
|
|
}
|
|
|
|
static int ptype_seq_show(struct seq_file *seq, void *v)
|
|
{
|
|
struct packet_type *pt = v;
|
|
|
|
if (v == SEQ_START_TOKEN)
|
|
seq_puts(seq, "Type Device Function\n");
|
|
else if ((!pt->af_packet_net || net_eq(pt->af_packet_net, seq_file_net(seq))) &&
|
|
(!pt->dev || net_eq(dev_net(pt->dev), seq_file_net(seq)))) {
|
|
if (pt->type == htons(ETH_P_ALL))
|
|
seq_puts(seq, "ALL ");
|
|
else
|
|
seq_printf(seq, "%04x", ntohs(pt->type));
|
|
|
|
seq_printf(seq, " %-8s %pf\n",
|
|
pt->dev ? pt->dev->name : "", pt->func);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const struct seq_operations ptype_seq_ops = {
|
|
.start = ptype_seq_start,
|
|
.next = ptype_seq_next,
|
|
.stop = ptype_seq_stop,
|
|
.show = ptype_seq_show,
|
|
};
|
|
|
|
static int __net_init dev_proc_net_init(struct net *net)
|
|
{
|
|
int rc = -ENOMEM;
|
|
|
|
if (!proc_create_net("dev", 0444, net->proc_net, &dev_seq_ops,
|
|
sizeof(struct seq_net_private)))
|
|
goto out;
|
|
if (!proc_create_seq("softnet_stat", 0444, net->proc_net,
|
|
&softnet_seq_ops))
|
|
goto out_dev;
|
|
if (!proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops,
|
|
sizeof(struct seq_net_private)))
|
|
goto out_softnet;
|
|
|
|
if (wext_proc_init(net))
|
|
goto out_ptype;
|
|
rc = 0;
|
|
out:
|
|
return rc;
|
|
out_ptype:
|
|
remove_proc_entry("ptype", net->proc_net);
|
|
out_softnet:
|
|
remove_proc_entry("softnet_stat", net->proc_net);
|
|
out_dev:
|
|
remove_proc_entry("dev", net->proc_net);
|
|
goto out;
|
|
}
|
|
|
|
static void __net_exit dev_proc_net_exit(struct net *net)
|
|
{
|
|
wext_proc_exit(net);
|
|
|
|
remove_proc_entry("ptype", net->proc_net);
|
|
remove_proc_entry("softnet_stat", net->proc_net);
|
|
remove_proc_entry("dev", net->proc_net);
|
|
}
|
|
|
|
static struct pernet_operations __net_initdata dev_proc_ops = {
|
|
.init = dev_proc_net_init,
|
|
.exit = dev_proc_net_exit,
|
|
};
|
|
|
|
static int dev_mc_seq_show(struct seq_file *seq, void *v)
|
|
{
|
|
struct netdev_hw_addr *ha;
|
|
struct net_device *dev = v;
|
|
|
|
if (v == SEQ_START_TOKEN)
|
|
return 0;
|
|
|
|
netif_addr_lock_bh(dev);
|
|
netdev_for_each_mc_addr(ha, dev) {
|
|
seq_printf(seq, "%-4d %-15s %-5d %-5d %*phN\n",
|
|
dev->ifindex, dev->name,
|
|
ha->refcount, ha->global_use,
|
|
(int)dev->addr_len, ha->addr);
|
|
}
|
|
netif_addr_unlock_bh(dev);
|
|
return 0;
|
|
}
|
|
|
|
static const struct seq_operations dev_mc_seq_ops = {
|
|
.start = dev_seq_start,
|
|
.next = dev_seq_next,
|
|
.stop = dev_seq_stop,
|
|
.show = dev_mc_seq_show,
|
|
};
|
|
|
|
static int __net_init dev_mc_net_init(struct net *net)
|
|
{
|
|
if (!proc_create_net("dev_mcast", 0, net->proc_net, &dev_mc_seq_ops,
|
|
sizeof(struct seq_net_private)))
|
|
return -ENOMEM;
|
|
return 0;
|
|
}
|
|
|
|
static void __net_exit dev_mc_net_exit(struct net *net)
|
|
{
|
|
remove_proc_entry("dev_mcast", net->proc_net);
|
|
}
|
|
|
|
static struct pernet_operations __net_initdata dev_mc_net_ops = {
|
|
.init = dev_mc_net_init,
|
|
.exit = dev_mc_net_exit,
|
|
};
|
|
|
|
int __init dev_proc_init(void)
|
|
{
|
|
int ret = register_pernet_subsys(&dev_proc_ops);
|
|
if (!ret)
|
|
return register_pernet_subsys(&dev_mc_net_ops);
|
|
return ret;
|
|
}
|