rmnet_wlan: I99b277c4c8f699c7fa057318aca4894588fdd574
Adds the initial rmnet_wlan module. Change-Id: Ibf80879ec062150058b8db6d527df936bd2ae7a0 Signed-off-by: Sean Tranchetti <stranche@codeaurora.org>
This commit is contained in:
@@ -9,5 +9,6 @@ BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_offload.ko
|
||||
endif
|
||||
ifeq ($(call is-board-platform-in-list,$(DATA_SHS_DLKM_BOARD_PLATFORMS_LIST)),true)
|
||||
BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_shs.ko
|
||||
BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_wlan.ko
|
||||
endif
|
||||
endif
|
||||
|
@@ -1,2 +1,3 @@
|
||||
PRODUCT_PACKAGES += rmnet_offload.ko
|
||||
PRODUCT_PACKAGES += rmnet_shs.ko
|
||||
PRODUCT_PACKAGES += rmnet_wlan.ko
|
||||
|
23
wlan/Android.mk
Normal file
23
wlan/Android.mk
Normal file
@@ -0,0 +1,23 @@
|
||||
ifneq ($(TARGET_BOARD_AUTO),true)
|
||||
ifneq ($(TARGET_PRODUCT),qssi)
|
||||
|
||||
RMNET_WLAN_DLKM_PLATFORMS_LIST := lahaina
|
||||
RMNET_WLAN_DLKM_PLATFORMS_LIST += holi
|
||||
RMNET_WLAN_DLKM_PLATFORMS_LIST += taro
|
||||
|
||||
ifeq ($(call is-board-platform-in-list, $(RMNET_WLAN_DLKM_PLATFORMS_LIST)),true)
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT)
|
||||
|
||||
LOCAL_MODULE := rmnet_wlan.ko
|
||||
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/**/*) $(wildcard $(LOCAL_PATH)/*)
|
||||
|
||||
DLKM_DIR := $(TOP)/device/qcom/common/dlkm
|
||||
|
||||
include $(DLKM_DIR)/Build_external_kernelmodule.mk
|
||||
|
||||
endif #End of check for target
|
||||
endif #End of Check for qssi target
|
||||
endif #End of check for AUTO Target
|
8
wlan/Kbuild
Normal file
8
wlan/Kbuild
Normal file
@@ -0,0 +1,8 @@
|
||||
obj-m += rmnet_wlan.o
|
||||
ccflags-y := $(call cc-option,-Wno-misleading-indentation)
|
||||
rmnet_wlan-y := \
|
||||
rmnet_wlan_main.o \
|
||||
rmnet_wlan_genl.o \
|
||||
rmnet_wlan_stats.o \
|
||||
rmnet_wlan_fragment.o \
|
||||
rmnet_wlan_connection.o
|
9
wlan/Kconfig
Normal file
9
wlan/Kconfig
Normal file
@@ -0,0 +1,9 @@
|
||||
#
|
||||
# RMNET_WLAN driver
|
||||
#
|
||||
|
||||
menuconfig RMNET_WLAN
|
||||
tristate "Rmnet WLAN support"
|
||||
default m
|
||||
---help---
|
||||
WLAN processing module for RmNet driver
|
15
wlan/Makefile
Normal file
15
wlan/Makefile
Normal file
@@ -0,0 +1,15 @@
|
||||
#By default build for CLD
|
||||
RMNET_WLAN_SELECT := CONFIG_RMNET_WLAN=m
|
||||
KBUILD_OPTIONS += $(RMNET_WLAN_SELECT)
|
||||
KBUILD_OPTIONS += $(KBUILD_EXTRA) # Extra config if any
|
||||
|
||||
M ?= $(shell pwd)
|
||||
|
||||
all:
|
||||
$(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS)
|
||||
|
||||
modules_install:
|
||||
$(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(M) modules_install
|
||||
|
||||
clean:
|
||||
$(MAKE) -C $(KERNEL_SRC) M=$(M) clean
|
36
wlan/rmnet_wlan.h
Normal file
36
wlan/rmnet_wlan.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* RMNET WLAN handler framework
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DATARMNETc7bc459123
|
||||
#define DATARMNETc7bc459123
|
||||
#include <linux/types.h>
|
||||
#include <net/genetlink.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/in6.h>
|
||||
struct DATARMNETb89ecedefc{union{__be16 DATARMNETf0d9de7e2f;__be32
|
||||
DATARMNET906b2ee561;};u8 DATARMNET0d956cc77a;u8 DATARMNET4924e79411;};struct
|
||||
DATARMNET8d3c2559ca{struct net_device*DATARMNET57656f6f2f;union{__be32
|
||||
DATARMNET0dc14167a1;struct in6_addr DATARMNET5700daac01;};u8 DATARMNET0d956cc77a
|
||||
;};int DATARMNET4899053671(struct sk_buff*DATARMNET543491eb0f,struct
|
||||
DATARMNET8d3c2559ca*DATARMNET2d4b4cfc9e);bool DATARMNET4eafcdee07(struct
|
||||
DATARMNETb89ecedefc*DATARMNET3396919a68);int DATARMNET53f12a0f7d(struct
|
||||
DATARMNETb89ecedefc*DATARMNETcadc2ef9aa,u32 DATARMNETef77661260,struct genl_info
|
||||
*DATARMNET54338da2ff);int DATARMNET07f6485c9b(struct DATARMNETb89ecedefc*
|
||||
DATARMNETcadc2ef9aa,u32 DATARMNETef77661260,struct genl_info*DATARMNET54338da2ff
|
||||
);int DATARMNET97b2388e63(char*DATARMNET852d4d00e2,struct genl_info*
|
||||
DATARMNET54338da2ff);int DATARMNETa903cd5994(char*DATARMNET852d4d00e2,struct
|
||||
genl_info*DATARMNET54338da2ff);int DATARMNET947eb110d2(struct
|
||||
DATARMNET8d3c2559ca*DATARMNET2d4b4cfc9e,struct genl_info*DATARMNET54338da2ff);
|
||||
int DATARMNETb8b35fdc18(struct DATARMNET8d3c2559ca*DATARMNET2d4b4cfc9e,struct
|
||||
genl_info*DATARMNET54338da2ff);int DATARMNET8d5a5a7047(__be16
|
||||
DATARMNETf0d9de7e2f,struct genl_info*DATARMNET54338da2ff);int
|
||||
DATARMNETc97c6a4265(__be16 DATARMNETf0d9de7e2f,struct genl_info*
|
||||
DATARMNET54338da2ff);bool DATARMNETa8b2566e6a(struct sk_buff*DATARMNET543491eb0f
|
||||
,struct DATARMNETb89ecedefc*DATARMNET3396919a68,int DATARMNET611d08d671);int
|
||||
DATARMNET078f6bd384(void);void DATARMNETfae36afa03(void);
|
||||
#endif
|
||||
|
132
wlan/rmnet_wlan_connection.c
Normal file
132
wlan/rmnet_wlan_connection.c
Normal file
@@ -0,0 +1,132 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* RMNET WLAN connection management framework
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/hashtable.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <net/ip.h>
|
||||
#include <net/ipv6.h>
|
||||
#include "rmnet_wlan.h"
|
||||
#include "rmnet_wlan_connection.h"
|
||||
#define DATARMNET5da8c68c19 (2000000000)
|
||||
#define DATARMNET8fc07fbb24 ((0xeb7+1158-0x132d))
|
||||
#define DATARMNETeaf0945284 \
|
||||
(const_ilog2(DATARMNET8fc07fbb24))
|
||||
struct DATARMNET4f49486833{struct hlist_node DATARMNETe8608dd267;struct rcu_head
|
||||
DATARMNET28bfe9e6ad;struct hrtimer DATARMNET9f31ce5d2d;struct
|
||||
DATARMNET0ca9d8ead7 DATARMNET54338da2ff;struct DATARMNET8d3c2559ca
|
||||
DATARMNET7ed5754a5c;};static DEFINE_SPINLOCK(DATARMNET820642743b);static
|
||||
DEFINE_HASHTABLE(DATARMNET5413d6f8ec,DATARMNETeaf0945284);static bool
|
||||
DATARMNET5f3c9ed4da(struct DATARMNET0ca9d8ead7*DATARMNET75decd6f60,struct
|
||||
DATARMNET0ca9d8ead7*DATARMNET6745cad668){if(DATARMNET75decd6f60->
|
||||
DATARMNET0d956cc77a!=DATARMNET6745cad668->DATARMNET0d956cc77a)return false;if(
|
||||
DATARMNET75decd6f60->DATARMNET0d956cc77a==(0xd11+230-0xdf3))return
|
||||
DATARMNET75decd6f60->DATARMNETdfe430c2d6==DATARMNET6745cad668->
|
||||
DATARMNETdfe430c2d6&&DATARMNET75decd6f60->DATARMNET2cb607d686==
|
||||
DATARMNET6745cad668->DATARMNET2cb607d686;return!ipv6_addr_cmp(&
|
||||
DATARMNET75decd6f60->DATARMNET815cbb4bf5,&DATARMNET6745cad668->
|
||||
DATARMNET815cbb4bf5)&&!ipv6_addr_cmp(&DATARMNET75decd6f60->DATARMNETc3f31215b7,&
|
||||
DATARMNET6745cad668->DATARMNETc3f31215b7);}static void DATARMNETefaa1f4094(
|
||||
struct rcu_head*DATARMNET28bfe9e6ad){struct DATARMNET4f49486833*
|
||||
DATARMNET63b1a086d5;DATARMNET63b1a086d5=container_of(DATARMNET28bfe9e6ad,struct
|
||||
DATARMNET4f49486833,DATARMNET28bfe9e6ad);if(DATARMNET63b1a086d5)kfree(
|
||||
DATARMNET63b1a086d5);}static enum hrtimer_restart DATARMNET299a8a08b5(struct
|
||||
hrtimer*DATARMNET6e4292679f){struct DATARMNET4f49486833*DATARMNET63b1a086d5;
|
||||
unsigned long DATARMNETfb0677cc3c;spin_lock_irqsave(&DATARMNET820642743b,
|
||||
DATARMNETfb0677cc3c);DATARMNET63b1a086d5=container_of(DATARMNET6e4292679f,struct
|
||||
DATARMNET4f49486833,DATARMNET9f31ce5d2d);hash_del_rcu(&DATARMNET63b1a086d5->
|
||||
DATARMNETe8608dd267);call_rcu(&DATARMNET63b1a086d5->DATARMNET28bfe9e6ad,
|
||||
DATARMNETefaa1f4094);spin_unlock_irqrestore(&DATARMNET820642743b,
|
||||
DATARMNETfb0677cc3c);return HRTIMER_NORESTART;}static rx_handler_result_t
|
||||
DATARMNET68fe094884(struct sk_buff**DATARMNET89946cec52){struct
|
||||
DATARMNET0ca9d8ead7 DATARMNETa76763310b={};struct DATARMNET4f49486833*
|
||||
DATARMNET63b1a086d5;struct sk_buff*DATARMNET543491eb0f=*DATARMNET89946cec52;
|
||||
unsigned long DATARMNETfb0677cc3c;if(!DATARMNET543491eb0f||DATARMNET543491eb0f->
|
||||
pkt_type==PACKET_LOOPBACK)goto DATARMNETbf4095f79e;if(DATARMNET543491eb0f->
|
||||
protocol==htons(ETH_P_IP)){struct iphdr*DATARMNET86f1f2cdc9,DATARMNETbf6548198e;
|
||||
DATARMNET86f1f2cdc9=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
|
||||
sizeof(*DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9)goto
|
||||
DATARMNETbf4095f79e;if(DATARMNET86f1f2cdc9->protocol!=IPPROTO_ICMP)goto
|
||||
DATARMNETbf4095f79e;DATARMNETa76763310b.DATARMNETdfe430c2d6=DATARMNET86f1f2cdc9
|
||||
->saddr;DATARMNETa76763310b.DATARMNET2cb607d686=DATARMNET86f1f2cdc9->daddr;
|
||||
DATARMNETa76763310b.DATARMNET0d956cc77a=(0xd11+230-0xdf3);}else if(
|
||||
DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6)){struct ipv6hdr*
|
||||
DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;__be16 frag_off;u8 DATARMNET65293f17c4;
|
||||
DATARMNETbf55123e5b=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
|
||||
sizeof(*DATARMNETbf55123e5b),&DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b)goto
|
||||
DATARMNETbf4095f79e;DATARMNET65293f17c4=DATARMNETbf55123e5b->nexthdr;if(
|
||||
ipv6_skip_exthdr(DATARMNET543491eb0f,sizeof(*DATARMNETbf55123e5b),&
|
||||
DATARMNET65293f17c4,&frag_off)<(0xd2d+202-0xdf7))goto DATARMNETbf4095f79e;if(
|
||||
frag_off&&DATARMNET65293f17c4==NEXTHDR_FRAGMENT)goto DATARMNETbf4095f79e;if(
|
||||
DATARMNET65293f17c4!=IPPROTO_ICMPV6)goto DATARMNETbf4095f79e;memcpy(&
|
||||
DATARMNETa76763310b.DATARMNET815cbb4bf5,&DATARMNETbf55123e5b->saddr,sizeof(
|
||||
DATARMNETa76763310b.DATARMNET815cbb4bf5));memcpy(&DATARMNETa76763310b.
|
||||
DATARMNETc3f31215b7,&DATARMNETbf55123e5b->daddr,sizeof(DATARMNETa76763310b.
|
||||
DATARMNETc3f31215b7));DATARMNETa76763310b.DATARMNET0d956cc77a=(0xd03+244-0xdf1);
|
||||
}else{goto DATARMNETbf4095f79e;}rcu_read_lock();hash_for_each_possible_rcu(
|
||||
DATARMNET5413d6f8ec,DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNETa76763310b.
|
||||
DATARMNET2cb607d686){if(!DATARMNET5f3c9ed4da(&DATARMNET63b1a086d5->
|
||||
DATARMNET54338da2ff,&DATARMNETa76763310b))continue;if(likely(hrtimer_is_queued(&
|
||||
DATARMNET63b1a086d5->DATARMNET9f31ce5d2d)))hrtimer_start(&DATARMNET63b1a086d5->
|
||||
DATARMNET9f31ce5d2d,DATARMNET5da8c68c19,HRTIMER_MODE_REL);rcu_read_unlock();goto
|
||||
DATARMNETbf4095f79e;}rcu_read_unlock();spin_lock_irqsave(&DATARMNET820642743b,
|
||||
DATARMNETfb0677cc3c);DATARMNET63b1a086d5=kzalloc(sizeof(*DATARMNET63b1a086d5),
|
||||
GFP_ATOMIC);if(!DATARMNET63b1a086d5){spin_unlock_irqrestore(&DATARMNET820642743b
|
||||
,DATARMNETfb0677cc3c);goto DATARMNETbf4095f79e;}INIT_HLIST_NODE(&
|
||||
DATARMNET63b1a086d5->DATARMNETe8608dd267);memcpy(&DATARMNET63b1a086d5->
|
||||
DATARMNET54338da2ff,&DATARMNETa76763310b,sizeof(DATARMNETa76763310b));
|
||||
DATARMNET63b1a086d5->DATARMNET7ed5754a5c.DATARMNET57656f6f2f=DATARMNET543491eb0f
|
||||
->dev;hrtimer_init(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,CLOCK_MONOTONIC,
|
||||
HRTIMER_MODE_REL);DATARMNET63b1a086d5->DATARMNET9f31ce5d2d.function=
|
||||
DATARMNET299a8a08b5;hrtimer_start(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,
|
||||
DATARMNET5da8c68c19,HRTIMER_MODE_REL);hash_add_rcu(DATARMNET5413d6f8ec,&
|
||||
DATARMNET63b1a086d5->DATARMNETe8608dd267,DATARMNETa76763310b.DATARMNET2cb607d686
|
||||
);spin_unlock_irqrestore(&DATARMNET820642743b,DATARMNETfb0677cc3c);
|
||||
DATARMNETbf4095f79e:return RX_HANDLER_PASS;}static void DATARMNETbc6bd11f47(
|
||||
struct net_device*DATARMNET00dcb79bc4){struct DATARMNET4f49486833*
|
||||
DATARMNET63b1a086d5;int DATARMNET5c2fd31d7b;rcu_read_lock();hash_for_each_rcu(
|
||||
DATARMNET5413d6f8ec,DATARMNET5c2fd31d7b,DATARMNET63b1a086d5,DATARMNETe8608dd267)
|
||||
{if(DATARMNET63b1a086d5->DATARMNET7ed5754a5c.DATARMNET57656f6f2f==
|
||||
DATARMNET00dcb79bc4)hrtimer_cancel(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d);}
|
||||
rcu_read_unlock();}static int DATARMNET81ab4de243(struct notifier_block*
|
||||
DATARMNET272c159b3c,unsigned long DATARMNET7f045a1e6e,void*data){struct
|
||||
net_device*DATARMNET00dcb79bc4=netdev_notifier_info_to_dev(data);if(!
|
||||
DATARMNET00dcb79bc4||strncmp(DATARMNET00dcb79bc4->name,
|
||||
"\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61",(0xd19+238-0xdfb)))return
|
||||
NOTIFY_DONE;if(!strncmp(DATARMNET00dcb79bc4->name,
|
||||
"\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61\x30",(0xd12+245-0xdfa)))return
|
||||
NOTIFY_DONE;switch(DATARMNET7f045a1e6e){case NETDEV_UNREGISTER:
|
||||
netdev_rx_handler_unregister(DATARMNET00dcb79bc4);DATARMNETbc6bd11f47(
|
||||
DATARMNET00dcb79bc4);break;case NETDEV_REGISTER:if(netdev_rx_handler_register(
|
||||
DATARMNET00dcb79bc4,DATARMNET68fe094884,NULL))pr_err(
|
||||
"\x25\x73\x28\x29\x3a\x20\x52\x65\x67\x69\x73\x74\x65\x72\x69\x6e\x67\x20\x68\x61\x6e\x64\x6c\x65\x72\x20\x6f\x6e\x20\x25\x73\x20\x66\x61\x69\x6c\x65\x64" "\n"
|
||||
,__func__,DATARMNET00dcb79bc4->name);break;default:break;}return NOTIFY_DONE;}
|
||||
static struct notifier_block DATARMNET61d0113123={.notifier_call=
|
||||
DATARMNET81ab4de243,};struct DATARMNET8d3c2559ca*DATARMNET07f0e0f286(struct
|
||||
DATARMNET0ca9d8ead7*DATARMNET54338da2ff)__must_hold(RCU){struct
|
||||
DATARMNET4f49486833*DATARMNET63b1a086d5;hash_for_each_possible_rcu(
|
||||
DATARMNET5413d6f8ec,DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNET54338da2ff
|
||||
->DATARMNET2cb607d686){if(!DATARMNET5f3c9ed4da(&DATARMNET63b1a086d5->
|
||||
DATARMNET54338da2ff,DATARMNET54338da2ff))continue;return&DATARMNET63b1a086d5->
|
||||
DATARMNET7ed5754a5c;}return NULL;}void DATARMNETf4e1a29dbc(void){struct
|
||||
DATARMNET4f49486833*DATARMNET63b1a086d5;int DATARMNET5c2fd31d7b;rcu_read_lock();
|
||||
hash_for_each_rcu(DATARMNET5413d6f8ec,DATARMNET5c2fd31d7b,DATARMNET63b1a086d5,
|
||||
DATARMNETe8608dd267)hrtimer_cancel(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d);
|
||||
rcu_read_unlock();}int DATARMNET9f106ed933(void){int DATARMNET268a8314cf;
|
||||
DATARMNET268a8314cf=register_netdevice_notifier(&DATARMNET61d0113123);if(
|
||||
DATARMNET268a8314cf)pr_err(
|
||||
"\x25\x73\x28\x29\x3a\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x66\x61\x69\x6c\x65\x64" "\n"
|
||||
,__func__);return DATARMNET268a8314cf;}int DATARMNETf56cbaa2b1(void){int
|
||||
DATARMNET268a8314cf;DATARMNET268a8314cf=unregister_netdevice_notifier(&
|
||||
DATARMNET61d0113123);if(DATARMNET268a8314cf)pr_err(
|
||||
"\x25\x73\x28\x29\x3a\x20\x6e\x6f\x74\x69\x66\x65\x72\x20\x66\x61\x69\x6c\x65\x64" "\n"
|
||||
,__func__);return DATARMNET268a8314cf;}
|
20
wlan/rmnet_wlan_connection.h
Normal file
20
wlan/rmnet_wlan_connection.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* RMNET WLAN connection management framework
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DATARMNET8e473f1d7e
|
||||
#define DATARMNET8e473f1d7e
|
||||
#include <linux/types.h>
|
||||
#include <linux/in6.h>
|
||||
#include "rmnet_wlan.h"
|
||||
struct DATARMNET0ca9d8ead7{union{__be32 DATARMNETdfe430c2d6;struct in6_addr
|
||||
DATARMNET815cbb4bf5;};union{__be32 DATARMNET2cb607d686;struct in6_addr
|
||||
DATARMNETc3f31215b7;};u8 DATARMNET0d956cc77a;};struct DATARMNET8d3c2559ca*
|
||||
DATARMNET07f0e0f286(struct DATARMNET0ca9d8ead7*DATARMNET54338da2ff);void
|
||||
DATARMNETf4e1a29dbc(void);int DATARMNET9f106ed933(void);int DATARMNETf56cbaa2b1(
|
||||
void);
|
||||
#endif
|
||||
|
206
wlan/rmnet_wlan_fragment.c
Normal file
206
wlan/rmnet_wlan_fragment.c
Normal file
@@ -0,0 +1,206 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* RMNET WLAN fragment handler framework
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <net/ip.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/hashtable.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include "rmnet_wlan.h"
|
||||
#include "rmnet_wlan_stats.h"
|
||||
#include "rmnet_wlan_fragment.h"
|
||||
#define DATARMNET598d70a086 ((0xeb7+1158-0x132d))
|
||||
#define DATARMNETeaee3af609 (const_ilog2(DATARMNET598d70a086))
|
||||
#define DATARMNET63a285d479 (100000000)
|
||||
struct DATARMNETdadb4e2c65{union{__be32 DATARMNETdfe430c2d6;struct in6_addr
|
||||
DATARMNET815cbb4bf5;};union{__be32 DATARMNET2cb607d686;struct in6_addr
|
||||
DATARMNETc3f31215b7;};__be32 id;u16 DATARMNET611d08d671;u16 DATARMNETb65c469a15;
|
||||
u8 DATARMNET0d956cc77a;};struct DATARMNET6f3b954709{struct hlist_node
|
||||
DATARMNETe8608dd267;struct list_head DATARMNET0f34bf3ea9;struct rcu_head
|
||||
DATARMNET28bfe9e6ad;struct hrtimer DATARMNET9f31ce5d2d;struct
|
||||
DATARMNETdadb4e2c65 DATARMNET54338da2ff;struct DATARMNET8d3c2559ca*
|
||||
DATARMNET7ed5754a5c;};static DEFINE_SPINLOCK(DATARMNET531b038fcd);static
|
||||
DEFINE_HASHTABLE(DATARMNET6e79f38051,DATARMNETeaee3af609);static int
|
||||
DATARMNET24669a931d(const struct sk_buff*DATARMNET543491eb0f,unsigned int*
|
||||
DATARMNETb65c469a15,int DATARMNETbfd7eb99fe,unsigned short*DATARMNET0823b5e89c,
|
||||
int*DATARMNETfb0677cc3c){unsigned int DATARMNETab6f68a65c=skb_network_offset(
|
||||
DATARMNET543491eb0f)+sizeof(struct ipv6hdr);u8 nexthdr=ipv6_hdr(
|
||||
DATARMNET543491eb0f)->nexthdr;bool DATARMNET1034358542;if(DATARMNET0823b5e89c)*
|
||||
DATARMNET0823b5e89c=(0xd2d+202-0xdf7);if(*DATARMNETb65c469a15){struct ipv6hdr
|
||||
DATARMNET982faca395,*DATARMNETc46d75f0b8;DATARMNETc46d75f0b8=skb_header_pointer(
|
||||
DATARMNET543491eb0f,*DATARMNETb65c469a15,sizeof(DATARMNET982faca395),&
|
||||
DATARMNET982faca395);if(!DATARMNETc46d75f0b8||(DATARMNETc46d75f0b8->version!=
|
||||
(0xd03+244-0xdf1)))return-EBADMSG;DATARMNETab6f68a65c=*DATARMNETb65c469a15+
|
||||
sizeof(struct ipv6hdr);nexthdr=DATARMNETc46d75f0b8->nexthdr;}do{struct
|
||||
ipv6_opt_hdr DATARMNETb18a0d17a5,*DATARMNET7c56b76ea0;unsigned int
|
||||
DATARMNET4593c3f2c2;DATARMNET1034358542=(nexthdr==DATARMNETbfd7eb99fe);if((!
|
||||
ipv6_ext_hdr(nexthdr))||nexthdr==NEXTHDR_NONE){if(DATARMNETbfd7eb99fe<
|
||||
(0xd2d+202-0xdf7)||DATARMNET1034358542)break;return-ENOENT;}DATARMNET7c56b76ea0=
|
||||
skb_header_pointer(DATARMNET543491eb0f,DATARMNETab6f68a65c,sizeof(
|
||||
DATARMNETb18a0d17a5),&DATARMNETb18a0d17a5);if(!DATARMNET7c56b76ea0)return-
|
||||
EBADMSG;if(nexthdr==NEXTHDR_ROUTING){struct ipv6_rt_hdr DATARMNET942c8f7153,*
|
||||
DATARMNETb2650cb3cb;DATARMNETb2650cb3cb=skb_header_pointer(DATARMNET543491eb0f,
|
||||
DATARMNETab6f68a65c,sizeof(DATARMNET942c8f7153),&DATARMNET942c8f7153);if(!
|
||||
DATARMNETb2650cb3cb)return-EBADMSG;if(DATARMNETfb0677cc3c&&(*DATARMNETfb0677cc3c
|
||||
&IP6_FH_F_SKIP_RH)&&DATARMNETb2650cb3cb->segments_left==(0xd2d+202-0xdf7))
|
||||
DATARMNET1034358542=false;}if(nexthdr==NEXTHDR_FRAGMENT){unsigned short
|
||||
DATARMNET3ed4d6b164;__be16*DATARMNET748d4c9015;if(DATARMNETfb0677cc3c)*
|
||||
DATARMNETfb0677cc3c|=IP6_FH_F_FRAG;DATARMNET748d4c9015=skb_header_pointer(
|
||||
DATARMNET543491eb0f,DATARMNETab6f68a65c+offsetof(struct frag_hdr,frag_off),
|
||||
sizeof(DATARMNET3ed4d6b164),&DATARMNET3ed4d6b164);if(!DATARMNET748d4c9015)return
|
||||
-EBADMSG;DATARMNET3ed4d6b164=ntohs(*DATARMNET748d4c9015)&~(0xcfc+267-0xe00);if(
|
||||
DATARMNET3ed4d6b164){if(DATARMNETbfd7eb99fe<(0xd2d+202-0xdf7)&&((!ipv6_ext_hdr(
|
||||
DATARMNET7c56b76ea0->nexthdr))||DATARMNET7c56b76ea0->nexthdr==NEXTHDR_NONE)){if(
|
||||
DATARMNET0823b5e89c)*DATARMNET0823b5e89c=DATARMNET3ed4d6b164;return
|
||||
DATARMNET7c56b76ea0->nexthdr;}if(!DATARMNET1034358542)return-ENOENT;if(
|
||||
DATARMNET0823b5e89c)*DATARMNET0823b5e89c=DATARMNET3ed4d6b164;break;}
|
||||
DATARMNET4593c3f2c2=(0xd35+210-0xdff);}else if(nexthdr==NEXTHDR_AUTH){if(
|
||||
DATARMNETfb0677cc3c&&(*DATARMNETfb0677cc3c&IP6_FH_F_AUTH)&&(DATARMNETbfd7eb99fe<
|
||||
(0xd2d+202-0xdf7)))break;DATARMNET4593c3f2c2=ipv6_authlen(DATARMNET7c56b76ea0);}
|
||||
else DATARMNET4593c3f2c2=ipv6_optlen(DATARMNET7c56b76ea0);if(!
|
||||
DATARMNET1034358542){nexthdr=DATARMNET7c56b76ea0->nexthdr;DATARMNETab6f68a65c+=
|
||||
DATARMNET4593c3f2c2;}}while(!DATARMNET1034358542);*DATARMNETb65c469a15=
|
||||
DATARMNETab6f68a65c;return nexthdr;}static void DATARMNETc7c83f614f(struct
|
||||
DATARMNET6f3b954709*DATARMNET63b1a086d5,bool DATARMNET7a9bcaf1a3){struct
|
||||
DATARMNET8d3c2559ca*DATARMNET54338da2ff;int(*DATARMNET456ac0e8eb)(struct sk_buff
|
||||
*DATARMNET543491eb0f);struct sk_buff*DATARMNET543491eb0f,*DATARMNET0386f6f82a;
|
||||
DATARMNET456ac0e8eb=(DATARMNET7a9bcaf1a3)?netif_receive_skb:netif_rx;
|
||||
DATARMNET54338da2ff=DATARMNET63b1a086d5->DATARMNET7ed5754a5c;
|
||||
list_for_each_entry_safe(DATARMNET543491eb0f,DATARMNET0386f6f82a,&
|
||||
DATARMNET63b1a086d5->DATARMNET0f34bf3ea9,list){u32 DATARMNET248f120dd5;
|
||||
list_del_init(&DATARMNET543491eb0f->list);if(IS_ERR_OR_NULL(DATARMNET54338da2ff)
|
||||
){DATARMNET456ac0e8eb(DATARMNET543491eb0f);continue;}if(DATARMNET4899053671(
|
||||
DATARMNET543491eb0f,DATARMNET54338da2ff)){DATARMNET248f120dd5=
|
||||
DATARMNETba232077da;DATARMNET456ac0e8eb(DATARMNET543491eb0f);}else{
|
||||
DATARMNET248f120dd5=DATARMNET7a58a5c1fc;}DATARMNET5ca94dbc3c(DATARMNET248f120dd5
|
||||
);}}static void DATARMNET2c78b44a19(struct rcu_head*DATARMNET28bfe9e6ad){struct
|
||||
DATARMNET6f3b954709*DATARMNET63b1a086d5;DATARMNET63b1a086d5=container_of(
|
||||
DATARMNET28bfe9e6ad,struct DATARMNET6f3b954709,DATARMNET28bfe9e6ad);if(
|
||||
DATARMNET63b1a086d5)kfree(DATARMNET63b1a086d5);}static enum hrtimer_restart
|
||||
DATARMNETef43eced5f(struct hrtimer*DATARMNET6e4292679f){struct
|
||||
DATARMNET6f3b954709*DATARMNET63b1a086d5;unsigned long DATARMNETfb0677cc3c;
|
||||
spin_lock_irqsave(&DATARMNET531b038fcd,DATARMNETfb0677cc3c);DATARMNET63b1a086d5=
|
||||
container_of(DATARMNET6e4292679f,struct DATARMNET6f3b954709,DATARMNET9f31ce5d2d)
|
||||
;hash_del_rcu(&DATARMNET63b1a086d5->DATARMNETe8608dd267);DATARMNETc7c83f614f(
|
||||
DATARMNET63b1a086d5,false);call_rcu(&DATARMNET63b1a086d5->DATARMNET28bfe9e6ad,
|
||||
DATARMNET2c78b44a19);spin_unlock_irqrestore(&DATARMNET531b038fcd,
|
||||
DATARMNETfb0677cc3c);DATARMNET5ca94dbc3c(DATARMNETd691057b85);return
|
||||
HRTIMER_NORESTART;}static bool DATARMNETc529ac78b2(struct DATARMNETdadb4e2c65*
|
||||
DATARMNET75decd6f60,struct DATARMNETdadb4e2c65*DATARMNET6745cad668){if(
|
||||
DATARMNET75decd6f60->DATARMNET0d956cc77a!=DATARMNET6745cad668->
|
||||
DATARMNET0d956cc77a||DATARMNET75decd6f60->id!=DATARMNET6745cad668->id)return
|
||||
false;if(DATARMNET75decd6f60->DATARMNET0d956cc77a==(0xd11+230-0xdf3))return
|
||||
DATARMNET75decd6f60->DATARMNETdfe430c2d6==DATARMNET6745cad668->
|
||||
DATARMNETdfe430c2d6&&DATARMNET75decd6f60->DATARMNET2cb607d686==
|
||||
DATARMNET6745cad668->DATARMNET2cb607d686;return!ipv6_addr_cmp(&
|
||||
DATARMNET75decd6f60->DATARMNET815cbb4bf5,&DATARMNET6745cad668->
|
||||
DATARMNET815cbb4bf5)&&!ipv6_addr_cmp(&DATARMNET75decd6f60->DATARMNETc3f31215b7,&
|
||||
DATARMNET6745cad668->DATARMNETc3f31215b7);}static struct DATARMNET6f3b954709*
|
||||
DATARMNET52b387f6cd(struct DATARMNETdadb4e2c65*DATARMNET54338da2ff){struct
|
||||
DATARMNET6f3b954709*DATARMNET63b1a086d5;unsigned long DATARMNETfb0677cc3c;
|
||||
spin_lock_irqsave(&DATARMNET531b038fcd,DATARMNETfb0677cc3c);
|
||||
hash_for_each_possible_rcu(DATARMNET6e79f38051,DATARMNET63b1a086d5,
|
||||
DATARMNETe8608dd267,DATARMNET54338da2ff->id){if(DATARMNETc529ac78b2(
|
||||
DATARMNET54338da2ff,&DATARMNET63b1a086d5->DATARMNET54338da2ff))goto
|
||||
DATARMNETbf4095f79e;}DATARMNET63b1a086d5=kzalloc(sizeof(*DATARMNET63b1a086d5),
|
||||
GFP_ATOMIC);if(!DATARMNET63b1a086d5)goto DATARMNETbf4095f79e;INIT_LIST_HEAD(&
|
||||
DATARMNET63b1a086d5->DATARMNET0f34bf3ea9);memcpy(&DATARMNET63b1a086d5->
|
||||
DATARMNET54338da2ff,DATARMNET54338da2ff,sizeof(*DATARMNET54338da2ff));
|
||||
hrtimer_init(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,CLOCK_MONOTONIC,
|
||||
HRTIMER_MODE_REL);DATARMNET63b1a086d5->DATARMNET9f31ce5d2d.function=
|
||||
DATARMNETef43eced5f;hrtimer_start(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,
|
||||
DATARMNET63a285d479,HRTIMER_MODE_REL);INIT_HLIST_NODE(&DATARMNET63b1a086d5->
|
||||
DATARMNETe8608dd267);hash_add_rcu(DATARMNET6e79f38051,&DATARMNET63b1a086d5->
|
||||
DATARMNETe8608dd267,DATARMNET54338da2ff->id);DATARMNETbf4095f79e:
|
||||
spin_unlock_irqrestore(&DATARMNET531b038fcd,DATARMNETfb0677cc3c);return
|
||||
DATARMNET63b1a086d5;}static int DATARMNET9d6ad3b16f(struct sk_buff*
|
||||
DATARMNET543491eb0f,struct DATARMNETb89ecedefc*DATARMNET3396919a68,struct
|
||||
DATARMNETdadb4e2c65*DATARMNET54338da2ff,struct DATARMNET8d3c2559ca*
|
||||
DATARMNET2d4b4cfc9e)__must_hold(RCU){struct DATARMNET6f3b954709*
|
||||
DATARMNET63b1a086d5;int DATARMNET61c2303133=(0xd26+209-0xdf6);
|
||||
DATARMNET5ca94dbc3c(DATARMNETd8273aa7e1);DATARMNET63b1a086d5=DATARMNET52b387f6cd
|
||||
(DATARMNET54338da2ff);if(!DATARMNET63b1a086d5){DATARMNET61c2303133=(-
|
||||
(0xd26+209-0xdf6));goto DATARMNETbf4095f79e;}if(unlikely(!hrtimer_is_queued(&
|
||||
DATARMNET63b1a086d5->DATARMNET9f31ce5d2d))){goto DATARMNETbf4095f79e;}
|
||||
hrtimer_start(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,DATARMNET63a285d479,
|
||||
HRTIMER_MODE_REL);if(DATARMNET63b1a086d5->DATARMNET7ed5754a5c){if(IS_ERR(
|
||||
DATARMNET63b1a086d5->DATARMNET7ed5754a5c))goto DATARMNETbf4095f79e;if(!
|
||||
DATARMNET4899053671(DATARMNET543491eb0f,DATARMNET63b1a086d5->DATARMNET7ed5754a5c
|
||||
)){DATARMNET5ca94dbc3c(DATARMNET7a58a5c1fc);DATARMNET61c2303133=
|
||||
(0xd2d+202-0xdf7);goto DATARMNETbf4095f79e;}DATARMNET5ca94dbc3c(
|
||||
DATARMNETba232077da);goto DATARMNETbf4095f79e;}if(DATARMNET54338da2ff->
|
||||
DATARMNETb65c469a15){list_add_tail(&DATARMNET543491eb0f->list,&
|
||||
DATARMNET63b1a086d5->DATARMNET0f34bf3ea9);DATARMNET61c2303133=(0xd2d+202-0xdf7);
|
||||
DATARMNET5ca94dbc3c(DATARMNETe75ad1a949);goto DATARMNETbf4095f79e;}if(
|
||||
DATARMNET3396919a68->DATARMNET4924e79411==IPPROTO_TCP||DATARMNET3396919a68->
|
||||
DATARMNET4924e79411==IPPROTO_UDP){struct udphdr*DATARMNET75be5f3406=(struct
|
||||
udphdr*)(DATARMNET543491eb0f->data+DATARMNET54338da2ff->DATARMNET611d08d671);
|
||||
DATARMNET3396919a68->DATARMNETf0d9de7e2f=DATARMNET75be5f3406->dest;if(
|
||||
DATARMNETa8b2566e6a(DATARMNET543491eb0f,DATARMNET3396919a68,DATARMNET54338da2ff
|
||||
->DATARMNET611d08d671)){DATARMNET5ca94dbc3c(DATARMNETd1ad664d00);goto
|
||||
DATARMNET07fc49caf2;}}else if(DATARMNET3396919a68->DATARMNET4924e79411==
|
||||
IPPROTO_ESP){struct ip_esp_hdr*DATARMNET73ee6a7020=(struct ip_esp_hdr*)(
|
||||
DATARMNET543491eb0f->data+DATARMNET54338da2ff->DATARMNET611d08d671);
|
||||
DATARMNET3396919a68->DATARMNET906b2ee561=DATARMNET73ee6a7020->spi;}if(
|
||||
DATARMNET4eafcdee07(DATARMNET3396919a68)){u32 DATARMNET248f120dd5;
|
||||
DATARMNET63b1a086d5->DATARMNET7ed5754a5c=DATARMNET2d4b4cfc9e;if(!
|
||||
DATARMNET4899053671(DATARMNET543491eb0f,DATARMNET2d4b4cfc9e)){
|
||||
DATARMNET248f120dd5=DATARMNET7a58a5c1fc;DATARMNET61c2303133=(0xd2d+202-0xdf7);}
|
||||
else{DATARMNET248f120dd5=DATARMNETba232077da;}DATARMNET5ca94dbc3c(
|
||||
DATARMNET248f120dd5);DATARMNETc7c83f614f(DATARMNET63b1a086d5,true);goto
|
||||
DATARMNETbf4095f79e;}DATARMNET07fc49caf2:DATARMNET63b1a086d5->
|
||||
DATARMNET7ed5754a5c=ERR_PTR(-EINVAL);DATARMNETc7c83f614f(DATARMNET63b1a086d5,
|
||||
true);DATARMNETbf4095f79e:return DATARMNET61c2303133;}int DATARMNET579f75aa50(
|
||||
struct sk_buff*DATARMNET543491eb0f,int DATARMNET611d08d671,struct
|
||||
DATARMNETb89ecedefc*DATARMNET3396919a68,struct DATARMNET8d3c2559ca*
|
||||
DATARMNET2d4b4cfc9e)__must_hold(RCU){struct DATARMNETdadb4e2c65
|
||||
DATARMNET54338da2ff={};struct iphdr*DATARMNET86f1f2cdc9=ip_hdr(
|
||||
DATARMNET543491eb0f);if(DATARMNET3396919a68->DATARMNET4924e79411!=IPPROTO_TCP&&
|
||||
DATARMNET3396919a68->DATARMNET4924e79411!=IPPROTO_UDP&&DATARMNET3396919a68->
|
||||
DATARMNET4924e79411!=IPPROTO_ESP)return-(0xd26+209-0xdf6);DATARMNET54338da2ff.
|
||||
DATARMNET0d956cc77a=(0xd11+230-0xdf3);DATARMNET54338da2ff.DATARMNETdfe430c2d6=
|
||||
DATARMNET86f1f2cdc9->saddr;DATARMNET54338da2ff.DATARMNET2cb607d686=
|
||||
DATARMNET86f1f2cdc9->daddr;DATARMNET54338da2ff.id=htonl((u32)ntohs(
|
||||
DATARMNET86f1f2cdc9->id));DATARMNET54338da2ff.DATARMNETb65c469a15=htons(
|
||||
DATARMNET86f1f2cdc9->frag_off)&IP_OFFSET;DATARMNET54338da2ff.DATARMNET611d08d671
|
||||
=(u16)DATARMNET611d08d671;return DATARMNET9d6ad3b16f(DATARMNET543491eb0f,
|
||||
DATARMNET3396919a68,&DATARMNET54338da2ff,DATARMNET2d4b4cfc9e);}int
|
||||
DATARMNETaca8ca54ed(struct sk_buff*DATARMNET543491eb0f,int DATARMNET611d08d671,
|
||||
struct DATARMNETb89ecedefc*DATARMNET3396919a68,struct DATARMNET8d3c2559ca*
|
||||
DATARMNET2d4b4cfc9e)__must_hold(RCU){struct DATARMNETdadb4e2c65
|
||||
DATARMNET54338da2ff={};struct ipv6hdr*DATARMNETbf55123e5b=ipv6_hdr(
|
||||
DATARMNET543491eb0f);struct frag_hdr*frag_hdr;unsigned int DATARMNET7b34b7b5be;
|
||||
if(DATARMNET3396919a68->DATARMNET4924e79411!=IPPROTO_TCP&&DATARMNET3396919a68->
|
||||
DATARMNET4924e79411!=IPPROTO_UDP&&DATARMNET3396919a68->DATARMNET4924e79411!=
|
||||
IPPROTO_ESP&&DATARMNET3396919a68->DATARMNET4924e79411!=NEXTHDR_FRAGMENT)return-
|
||||
(0xd26+209-0xdf6);if(DATARMNET24669a931d(DATARMNET543491eb0f,&
|
||||
DATARMNET7b34b7b5be,NEXTHDR_FRAGMENT,NULL,NULL)<(0xd2d+202-0xdf7))return-
|
||||
(0xd26+209-0xdf6);frag_hdr=(struct frag_hdr*)(DATARMNET543491eb0f->data+
|
||||
DATARMNET7b34b7b5be);DATARMNET54338da2ff.DATARMNET0d956cc77a=(0xd03+244-0xdf1);
|
||||
memcpy(&DATARMNET54338da2ff.DATARMNET815cbb4bf5,&DATARMNETbf55123e5b->saddr,
|
||||
sizeof(DATARMNETbf55123e5b->saddr));memcpy(&DATARMNET54338da2ff.
|
||||
DATARMNETc3f31215b7,&DATARMNETbf55123e5b->daddr,sizeof(DATARMNETbf55123e5b->
|
||||
daddr));DATARMNET54338da2ff.id=frag_hdr->identification;DATARMNET54338da2ff.
|
||||
DATARMNETb65c469a15=htons(frag_hdr->frag_off)&IP6_OFFSET;DATARMNET54338da2ff.
|
||||
DATARMNET611d08d671=(u16)DATARMNET611d08d671;if(DATARMNET3396919a68->
|
||||
DATARMNET4924e79411==NEXTHDR_FRAGMENT)DATARMNET54338da2ff.DATARMNET611d08d671+=
|
||||
sizeof(*frag_hdr);return DATARMNET9d6ad3b16f(DATARMNET543491eb0f,
|
||||
DATARMNET3396919a68,&DATARMNET54338da2ff,DATARMNET2d4b4cfc9e);}void
|
||||
DATARMNET8c0e010dfb(void){struct DATARMNET6f3b954709*DATARMNET63b1a086d5;int
|
||||
DATARMNET5c2fd31d7b;rcu_read_lock();hash_for_each_rcu(DATARMNET6e79f38051,
|
||||
DATARMNET5c2fd31d7b,DATARMNET63b1a086d5,DATARMNETe8608dd267)hrtimer_cancel(&
|
||||
DATARMNET63b1a086d5->DATARMNET9f31ce5d2d);rcu_read_unlock();}void
|
||||
DATARMNETedae8262e1(struct DATARMNET8d3c2559ca*DATARMNET54338da2ff){struct
|
||||
DATARMNET6f3b954709*DATARMNET63b1a086d5;int DATARMNET5c2fd31d7b;rcu_read_lock();
|
||||
hash_for_each_rcu(DATARMNET6e79f38051,DATARMNET5c2fd31d7b,DATARMNET63b1a086d5,
|
||||
DATARMNETe8608dd267){if(DATARMNET63b1a086d5->DATARMNET7ed5754a5c==
|
||||
DATARMNET54338da2ff)DATARMNET63b1a086d5->DATARMNET7ed5754a5c=ERR_PTR(-EINVAL);}
|
||||
rcu_read_unlock();}
|
20
wlan/rmnet_wlan_fragment.h
Normal file
20
wlan/rmnet_wlan_fragment.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* RMNET WLAN fragment handler framework
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DATARMNET836e6c471b
|
||||
#define DATARMNET836e6c471b
|
||||
#include <linux/skbuff.h>
|
||||
#include "rmnet_wlan.h"
|
||||
int DATARMNET579f75aa50(struct sk_buff*DATARMNET543491eb0f,int
|
||||
DATARMNET611d08d671,struct DATARMNETb89ecedefc*DATARMNET3396919a68,struct
|
||||
DATARMNET8d3c2559ca*DATARMNET2d4b4cfc9e);int DATARMNETaca8ca54ed(struct sk_buff*
|
||||
DATARMNET543491eb0f,int DATARMNET611d08d671,struct DATARMNETb89ecedefc*
|
||||
DATARMNET3396919a68,struct DATARMNET8d3c2559ca*DATARMNET2d4b4cfc9e);void
|
||||
DATARMNET8c0e010dfb(void);void DATARMNETedae8262e1(struct DATARMNET8d3c2559ca*
|
||||
DATARMNET54338da2ff);
|
||||
#endif
|
||||
|
232
wlan/rmnet_wlan_genl.c
Normal file
232
wlan/rmnet_wlan_genl.c
Normal file
@@ -0,0 +1,232 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* RMNET WLAN Generic Netlink
|
||||
*
|
||||
*/
|
||||
|
||||
#include <net/genetlink.h>
|
||||
#include <net/netlink.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/inet.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include "rmnet_wlan_genl.h"
|
||||
#include "rmnet_wlan.h"
|
||||
static struct nla_policy DATARMNET19c5fce390[DATARMNETf6bbad94a5+
|
||||
(0xd26+209-0xdf6)]={[DATARMNET8c062d7709]=NLA_POLICY_EXACT_LEN(sizeof(struct
|
||||
DATARMNETb89ecedefc)),};static struct nla_policy DATARMNET0381a65e93[
|
||||
DATARMNETebcc30fe04+(0xd26+209-0xdf6)]={[DATARMNET4e9cd7b8bf]=
|
||||
NLA_POLICY_NESTED_ARRAY(DATARMNET19c5fce390),[DATARMNETb8afde4a5a]={.type=
|
||||
NLA_NUL_STRING,.len=IFNAMSIZ-(0xd26+209-0xdf6),},[DATARMNETea4b56dc2b]={.type=
|
||||
NLA_NUL_STRING,.len=INET6_ADDRSTRLEN,},[DATARMNET8bf80e4b66]={.type=
|
||||
NLA_NUL_STRING,.len=IFNAMSIZ-(0xd26+209-0xdf6),},[DATARMNET44a9a789aa]={.type=
|
||||
NLA_U16,},};
|
||||
#define DATARMNET58eca5265b(DATARMNET5aeb0ef9bc, DATARMNETbd9859b58e) \
|
||||
{ \
|
||||
.cmd = DATARMNET5aeb0ef9bc, \
|
||||
.doit = DATARMNETbd9859b58e, \
|
||||
}
|
||||
static int DATARMNET72501635c8(struct sk_buff*DATARMNET543491eb0f,struct
|
||||
genl_info*DATARMNET54338da2ff){struct nlattr*DATARMNET759bcdbf61[
|
||||
DATARMNETf6bbad94a5+(0xd26+209-0xdf6)];struct DATARMNETb89ecedefc*
|
||||
DATARMNETcadc2ef9aa;struct nlattr*DATARMNETef7cdd7b6b;u32 DATARMNETef77661260=
|
||||
(0xd2d+202-0xdf7);int DATARMNET4b119c4ff3;int DATARMNETb14e52a504=
|
||||
(0xd2d+202-0xdf7);if(!DATARMNET54338da2ff->attrs[DATARMNET4e9cd7b8bf]){
|
||||
GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4d\x75\x73\x74\x20\x73\x75\x70\x70\x6c\x79\x20\x74\x75\x70\x6c\x65\x20\x69\x6e\x66\x6f"
|
||||
);return-EINVAL;}nla_for_each_nested(DATARMNETef7cdd7b6b,DATARMNET54338da2ff->
|
||||
attrs[DATARMNET4e9cd7b8bf],DATARMNET4b119c4ff3)DATARMNETef77661260++;
|
||||
DATARMNETcadc2ef9aa=kcalloc(DATARMNETef77661260,sizeof(*DATARMNETcadc2ef9aa),
|
||||
GFP_KERNEL);if(!DATARMNETcadc2ef9aa){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4b\x65\x72\x6e\x65\x6c\x20\x4f\x4f\x4d");return-ENOMEM;}DATARMNETef77661260=
|
||||
(0xd2d+202-0xdf7);nla_for_each_nested(DATARMNETef7cdd7b6b,DATARMNET54338da2ff->
|
||||
attrs[DATARMNET4e9cd7b8bf],DATARMNET4b119c4ff3){struct DATARMNETb89ecedefc*
|
||||
DATARMNET3396919a68;DATARMNETb14e52a504=nla_parse_nested(DATARMNET759bcdbf61,
|
||||
DATARMNETf6bbad94a5,DATARMNETef7cdd7b6b,DATARMNET19c5fce390,DATARMNET54338da2ff
|
||||
->extack);if(DATARMNETb14e52a504)goto DATARMNETbf4095f79e;if(!
|
||||
DATARMNET759bcdbf61[DATARMNET8c062d7709]){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4d\x75\x73\x74\x20\x73\x70\x65\x63\x69\x66\x79\x20\x74\x75\x70\x6c\x65\x20\x65\x6e\x74\x72\x79"
|
||||
);goto DATARMNETbf4095f79e;}DATARMNET3396919a68=nla_data(DATARMNET759bcdbf61[
|
||||
DATARMNET8c062d7709]);if(DATARMNET3396919a68->DATARMNET0d956cc77a!=
|
||||
(0xd11+230-0xdf3)&&DATARMNET3396919a68->DATARMNET0d956cc77a!=(0xd03+244-0xdf1)){
|
||||
GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x49\x6e\x76\x61\x6c\x69\x64\x20\x49\x50\x20\x70\x72\x6f\x74\x6f\x63\x6f\x6c");
|
||||
goto DATARMNETbf4095f79e;}if(DATARMNET3396919a68->DATARMNET4924e79411!=
|
||||
IPPROTO_TCP&&DATARMNET3396919a68->DATARMNET4924e79411!=IPPROTO_UDP&&
|
||||
DATARMNET3396919a68->DATARMNET4924e79411!=IPPROTO_ESP){GENL_SET_ERR_MSG(
|
||||
DATARMNET54338da2ff,
|
||||
"\x49\x6e\x76\x61\x6c\x69\x64\x20\x74\x72\x61\x6e\x73\x70\x6f\x72\x74\x20\x70\x72\x6f\x74\x6f\x63\x6f\x6c"
|
||||
);goto DATARMNETbf4095f79e;}memcpy(&DATARMNETcadc2ef9aa[DATARMNETef77661260],
|
||||
DATARMNET3396919a68,sizeof(*DATARMNET3396919a68));DATARMNETef77661260++;}
|
||||
DATARMNETb14e52a504=DATARMNET53f12a0f7d(DATARMNETcadc2ef9aa,DATARMNETef77661260,
|
||||
DATARMNET54338da2ff);DATARMNETbf4095f79e:kfree(DATARMNETcadc2ef9aa);return
|
||||
DATARMNETb14e52a504;}static int DATARMNET41dd9b14ab(struct sk_buff*
|
||||
DATARMNET543491eb0f,struct genl_info*DATARMNET54338da2ff){struct nlattr*
|
||||
DATARMNET759bcdbf61[DATARMNETf6bbad94a5+(0xd26+209-0xdf6)];struct
|
||||
DATARMNETb89ecedefc*DATARMNETcadc2ef9aa;struct nlattr*DATARMNETef7cdd7b6b;u32
|
||||
DATARMNETef77661260=(0xd2d+202-0xdf7);int DATARMNET4b119c4ff3;int
|
||||
DATARMNETb14e52a504;if(!DATARMNET54338da2ff->attrs[DATARMNET4e9cd7b8bf]){
|
||||
GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4d\x75\x73\x74\x20\x73\x75\x70\x70\x6c\x79\x20\x74\x75\x70\x6c\x65\x20\x69\x6e\x66\x6f"
|
||||
);return-EINVAL;}nla_for_each_nested(DATARMNETef7cdd7b6b,DATARMNET54338da2ff->
|
||||
attrs[DATARMNET4e9cd7b8bf],DATARMNET4b119c4ff3)DATARMNETef77661260++;
|
||||
DATARMNETcadc2ef9aa=kcalloc(DATARMNETef77661260,sizeof(*DATARMNETcadc2ef9aa),
|
||||
GFP_KERNEL);if(!DATARMNETcadc2ef9aa){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4b\x65\x72\x6e\x65\x6c\x20\x4f\x4f\x4d");return-ENOMEM;}DATARMNETef77661260=
|
||||
(0xd2d+202-0xdf7);nla_for_each_nested(DATARMNETef7cdd7b6b,DATARMNET54338da2ff->
|
||||
attrs[DATARMNET4e9cd7b8bf],DATARMNET4b119c4ff3){struct DATARMNETb89ecedefc*
|
||||
DATARMNET3396919a68;DATARMNETb14e52a504=nla_parse_nested(DATARMNET759bcdbf61,
|
||||
DATARMNETf6bbad94a5,DATARMNETef7cdd7b6b,DATARMNET19c5fce390,DATARMNET54338da2ff
|
||||
->extack);if(DATARMNETb14e52a504)goto DATARMNETbf4095f79e;if(!
|
||||
DATARMNET759bcdbf61[DATARMNET8c062d7709]){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4d\x75\x73\x74\x20\x73\x70\x65\x63\x69\x66\x79\x20\x74\x75\x70\x6c\x65\x20\x65\x6e\x74\x72\x79"
|
||||
);DATARMNETb14e52a504=-EINVAL;goto DATARMNETbf4095f79e;}DATARMNET3396919a68=
|
||||
nla_data(DATARMNET759bcdbf61[DATARMNET8c062d7709]);memcpy(&DATARMNETcadc2ef9aa[
|
||||
DATARMNETef77661260],DATARMNET3396919a68,sizeof(*DATARMNET3396919a68));
|
||||
DATARMNETef77661260++;}DATARMNETb14e52a504=DATARMNET07f6485c9b(
|
||||
DATARMNETcadc2ef9aa,DATARMNETef77661260,DATARMNET54338da2ff);DATARMNETbf4095f79e
|
||||
:kfree(DATARMNETcadc2ef9aa);return DATARMNETb14e52a504;}static int
|
||||
DATARMNETf1fa473089(struct sk_buff*DATARMNET543491eb0f,struct genl_info*
|
||||
DATARMNET54338da2ff){struct nlattr*DATARMNETef7cdd7b6b;DATARMNETef7cdd7b6b=
|
||||
DATARMNET54338da2ff->attrs[DATARMNETb8afde4a5a];if(!DATARMNETef7cdd7b6b){
|
||||
GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4d\x75\x73\x74\x20\x73\x70\x65\x63\x69\x66\x79\x20\x64\x65\x76\x69\x63\x65\x20\x69\x6e\x66\x6f"
|
||||
);return-EINVAL;}return DATARMNET97b2388e63(nla_data(DATARMNETef7cdd7b6b),
|
||||
DATARMNET54338da2ff);}static int DATARMNETcd9478470c(struct sk_buff*
|
||||
DATARMNET543491eb0f,struct genl_info*DATARMNET54338da2ff){struct nlattr*
|
||||
DATARMNETef7cdd7b6b;int DATARMNET268a8314cf;DATARMNETef7cdd7b6b=
|
||||
DATARMNET54338da2ff->attrs[DATARMNETb8afde4a5a];DATARMNET268a8314cf=
|
||||
DATARMNETa903cd5994((DATARMNETef7cdd7b6b)?nla_data(DATARMNETef7cdd7b6b):NULL,
|
||||
DATARMNET54338da2ff);if(DATARMNET268a8314cf)GENL_SET_ERR_MSG(DATARMNET54338da2ff
|
||||
,
|
||||
"\x4b\x65\x72\x6e\x65\x6c\x20\x65\x72\x72\x6f\x72\x2c\x20\x75\x6e\x72\x65\x67\x69\x73\x74\x65\x72\x69\x6e\x67\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x66\x61\x69\x6c\x65\x64"
|
||||
);return DATARMNET268a8314cf;}static int DATARMNETb58e83bef5(const char*
|
||||
DATARMNETc5a5c7fda2,int DATARMNETdb8d3e0f02,u8*DATARMNET1be23954c3){int len=
|
||||
(0xd2d+202-0xdf7),DATARMNET887a22d0e2=(0xd2d+202-0xdf7),DATARMNETb14e52a504=
|
||||
(0xd2d+202-0xdf7);char DATARMNET4306ab415b[(0xec7+1166-0x132d)],*
|
||||
DATARMNETab6f68a65c;u16 DATARMNET87504a9b3a=(0xd2d+202-0xdf7);memset(
|
||||
DATARMNET4306ab415b,(0xd2d+202-0xdf7),(0xec7+1166-0x132d));memcpy(
|
||||
DATARMNET4306ab415b,DATARMNETc5a5c7fda2,DATARMNETdb8d3e0f02>(0xec7+1166-0x132d)?
|
||||
(0xec7+1166-0x132d):DATARMNETdb8d3e0f02);DATARMNETab6f68a65c=DATARMNET4306ab415b
|
||||
;while(len<=DATARMNETdb8d3e0f02){if(DATARMNET4306ab415b[len]!=
|
||||
((char)(0x8a+8919-0x2327))&&DATARMNET4306ab415b[len]!='\0'){len++;continue;}
|
||||
DATARMNET4306ab415b[len]='\0';DATARMNETb14e52a504=kstrtou16((const char*)
|
||||
DATARMNETab6f68a65c,(0xeb7+1158-0x132d),&DATARMNET87504a9b3a);if(
|
||||
DATARMNETb14e52a504)return(0xd2d+202-0xdf7);DATARMNET1be23954c3[
|
||||
DATARMNET887a22d0e2]=(u8)(DATARMNET87504a9b3a>>(0xd35+210-0xdff));
|
||||
DATARMNET1be23954c3[DATARMNET887a22d0e2+(0xd26+209-0xdf6)]=(u8)(
|
||||
DATARMNET87504a9b3a&(0xbf7+4364-0x1c04));DATARMNET887a22d0e2+=(0xd1f+216-0xdf5);
|
||||
if(DATARMNET887a22d0e2==(0xeb7+1158-0x132d))return(0xd26+209-0xdf6);
|
||||
DATARMNETab6f68a65c=&DATARMNET4306ab415b[len+(0xd26+209-0xdf6)];len++;}return
|
||||
(0xd26+209-0xdf6);}static int DATARMNET631d317abe(const char*DATARMNETc5a5c7fda2
|
||||
,int DATARMNETdb8d3e0f02,u8*DATARMNET1be23954c3){int len=(0xd2d+202-0xdf7),
|
||||
DATARMNET887a22d0e2=(0xd2d+202-0xdf7),DATARMNETb14e52a504=(0xd2d+202-0xdf7);char
|
||||
DATARMNET4306ab415b[(0xeb7+1158-0x132d)],*DATARMNETab6f68a65c;u8
|
||||
DATARMNET87504a9b3a=(0xd2d+202-0xdf7);memset(DATARMNET4306ab415b,
|
||||
(0xd2d+202-0xdf7),(0xeb7+1158-0x132d));memcpy(DATARMNET4306ab415b,
|
||||
DATARMNETc5a5c7fda2,DATARMNETdb8d3e0f02>(0xeb7+1158-0x132d)?(0xeb7+1158-0x132d):
|
||||
DATARMNETdb8d3e0f02);DATARMNETab6f68a65c=DATARMNET4306ab415b;while(len<=
|
||||
DATARMNETdb8d3e0f02){if(DATARMNET4306ab415b[len]!=((char)(0x18d0+974-0x1c70))&&
|
||||
DATARMNET4306ab415b[len]!='\0'){len++;continue;}DATARMNET4306ab415b[len]='\0';
|
||||
DATARMNETb14e52a504=kstrtou8((const char*)DATARMNETab6f68a65c,(0xd2d+202-0xdf7),
|
||||
&DATARMNET87504a9b3a);if(DATARMNETb14e52a504)return(0xd2d+202-0xdf7);
|
||||
DATARMNET1be23954c3[DATARMNET887a22d0e2]=DATARMNET87504a9b3a;DATARMNET887a22d0e2
|
||||
++;if(DATARMNET887a22d0e2==(0xd11+230-0xdf3))return(0xd26+209-0xdf6);
|
||||
DATARMNETab6f68a65c=&DATARMNET4306ab415b[len+(0xd26+209-0xdf6)];len++;}return
|
||||
(0xd26+209-0xdf6);}static int DATARMNETb86993aefb(struct sk_buff*
|
||||
DATARMNET543491eb0f,struct genl_info*DATARMNET54338da2ff){struct
|
||||
DATARMNET8d3c2559ca DATARMNET2d4b4cfc9e={};struct nlattr*DATARMNETef7cdd7b6b;
|
||||
char*DATARMNETd7f4d7c495;int DATARMNET268a8314cf;if(!DATARMNET54338da2ff->attrs[
|
||||
DATARMNETea4b56dc2b]||!DATARMNET54338da2ff->attrs[DATARMNET8bf80e4b66]){
|
||||
GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4d\x75\x73\x74\x20\x73\x70\x65\x63\x69\x66\x79\x20\x46\x57\x44\x20\x64\x65\x76\x69\x63\x65\x20\x61\x6e\x64\x20\x61\x64\x64\x72\x65\x73\x73"
|
||||
);return-EINVAL;}DATARMNETef7cdd7b6b=DATARMNET54338da2ff->attrs[
|
||||
DATARMNETea4b56dc2b];DATARMNETd7f4d7c495=nla_data(DATARMNETef7cdd7b6b);if(strchr
|
||||
(DATARMNETd7f4d7c495,((char)(0x1d68+1264-0x221e)))){if(DATARMNETb58e83bef5(
|
||||
DATARMNETd7f4d7c495,nla_len(DATARMNETef7cdd7b6b),DATARMNET2d4b4cfc9e.
|
||||
DATARMNET5700daac01.s6_addr)!=(0xd26+209-0xdf6)){GENL_SET_ERR_MSG(
|
||||
DATARMNET54338da2ff,
|
||||
"\x46\x57\x44\x20\x61\x64\x64\x72\x65\x73\x73\x20\x69\x73\x20\x69\x6e\x76\x61\x6c\x69\x64\x20\x69\x6e\x20\x49\x50\x76\x36"
|
||||
);return-EINVAL;}DATARMNET2d4b4cfc9e.DATARMNET0d956cc77a=(0xd03+244-0xdf1);}else
|
||||
{if(DATARMNET631d317abe(DATARMNETd7f4d7c495,nla_len(DATARMNETef7cdd7b6b),(u8*)&
|
||||
DATARMNET2d4b4cfc9e.DATARMNET0dc14167a1)!=(0xd26+209-0xdf6)){GENL_SET_ERR_MSG(
|
||||
DATARMNET54338da2ff,
|
||||
"\x46\x57\x44\x20\x61\x64\x64\x72\x65\x73\x73\x20\x69\x73\x20\x69\x6e\x76\x61\x6c\x69\x64\x20\x69\x6e\x20\x49\x50\x76\x34"
|
||||
);return-EINVAL;}DATARMNET2d4b4cfc9e.DATARMNET0d956cc77a=(0xd11+230-0xdf3);}
|
||||
DATARMNETef7cdd7b6b=DATARMNET54338da2ff->attrs[DATARMNET8bf80e4b66];
|
||||
DATARMNET2d4b4cfc9e.DATARMNET57656f6f2f=dev_get_by_name(genl_info_net(
|
||||
DATARMNET54338da2ff),nla_data(DATARMNETef7cdd7b6b));if(!DATARMNET2d4b4cfc9e.
|
||||
DATARMNET57656f6f2f){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x49\x6e\x76\x61\x6c\x69\x64\x20\x46\x57\x44\x20\x64\x65\x76\x69\x63\x65\x20\x6e\x61\x6d\x65"
|
||||
);return-EINVAL;}DATARMNET268a8314cf=DATARMNET947eb110d2(&DATARMNET2d4b4cfc9e,
|
||||
DATARMNET54338da2ff);dev_put(DATARMNET2d4b4cfc9e.DATARMNET57656f6f2f);return
|
||||
DATARMNET268a8314cf;}static int DATARMNETc175a08219(struct sk_buff*
|
||||
DATARMNET543491eb0f,struct genl_info*DATARMNET54338da2ff){struct
|
||||
DATARMNET8d3c2559ca DATARMNET2d4b4cfc9e={};struct nlattr*DATARMNETef7cdd7b6b;
|
||||
char*DATARMNETd7f4d7c495;int DATARMNET268a8314cf;if(!DATARMNET54338da2ff->attrs[
|
||||
DATARMNETea4b56dc2b]||!DATARMNET54338da2ff->attrs[DATARMNET8bf80e4b66]){
|
||||
GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4d\x75\x73\x74\x20\x73\x70\x65\x63\x69\x66\x79\x20\x46\x57\x44\x20\x64\x65\x76\x69\x63\x65\x20\x61\x6e\x64\x20\x61\x64\x64\x72\x65\x73\x73"
|
||||
);return-EINVAL;}DATARMNETef7cdd7b6b=DATARMNET54338da2ff->attrs[
|
||||
DATARMNETea4b56dc2b];DATARMNETd7f4d7c495=nla_data(DATARMNETef7cdd7b6b);if(strchr
|
||||
(DATARMNETd7f4d7c495,((char)(0x1352+1724-0x19d4)))){if(DATARMNETb58e83bef5(
|
||||
DATARMNETd7f4d7c495,nla_len(DATARMNETef7cdd7b6b),DATARMNET2d4b4cfc9e.
|
||||
DATARMNET5700daac01.s6_addr)!=(0xd26+209-0xdf6)){GENL_SET_ERR_MSG(
|
||||
DATARMNET54338da2ff,
|
||||
"\x46\x57\x44\x20\x61\x64\x64\x72\x65\x73\x73\x20\x69\x73\x20\x69\x6e\x76\x61\x6c\x69\x64\x20\x69\x6e\x20\x49\x50\x76\x36"
|
||||
);return-EINVAL;}DATARMNET2d4b4cfc9e.DATARMNET0d956cc77a=(0xd03+244-0xdf1);}else
|
||||
{if(DATARMNET631d317abe(DATARMNETd7f4d7c495,nla_len(DATARMNETef7cdd7b6b),(u8*)&
|
||||
DATARMNET2d4b4cfc9e.DATARMNET0dc14167a1)){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x46\x57\x44\x20\x61\x64\x64\x72\x65\x73\x73\x20\x69\x73\x20\x69\x6e\x76\x61\x6c\x69\x64\x20\x69\x6e\x20\x49\x50\x76\x34"
|
||||
);return-EINVAL;}DATARMNET2d4b4cfc9e.DATARMNET0d956cc77a=(0xd11+230-0xdf3);}
|
||||
DATARMNETef7cdd7b6b=DATARMNET54338da2ff->attrs[DATARMNET8bf80e4b66];
|
||||
DATARMNET2d4b4cfc9e.DATARMNET57656f6f2f=dev_get_by_name(genl_info_net(
|
||||
DATARMNET54338da2ff),nla_data(DATARMNETef7cdd7b6b));if(!DATARMNET2d4b4cfc9e.
|
||||
DATARMNET57656f6f2f){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x49\x6e\x76\x61\x6c\x69\x64\x20\x46\x57\x44\x20\x64\x65\x76\x69\x63\x65\x20\x6e\x61\x6d\x65"
|
||||
);return-EINVAL;}DATARMNET268a8314cf=DATARMNETb8b35fdc18(&DATARMNET2d4b4cfc9e,
|
||||
DATARMNET54338da2ff);dev_put(DATARMNET2d4b4cfc9e.DATARMNET57656f6f2f);return
|
||||
DATARMNET268a8314cf;}static int DATARMNETc5f6c112ec(struct sk_buff*
|
||||
DATARMNET543491eb0f,struct genl_info*DATARMNET54338da2ff){struct nlattr*
|
||||
DATARMNETef7cdd7b6b;DATARMNETef7cdd7b6b=DATARMNET54338da2ff->attrs[
|
||||
DATARMNET44a9a789aa];if(!DATARMNETef7cdd7b6b){GENL_SET_ERR_MSG(
|
||||
DATARMNET54338da2ff,
|
||||
"\x4d\x75\x73\x74\x20\x73\x70\x65\x63\x69\x66\x79\x20\x65\x6e\x63\x61\x70\x20\x70\x6f\x72\x74"
|
||||
);return-EINVAL;}return DATARMNET8d5a5a7047(nla_get_be16(DATARMNETef7cdd7b6b),
|
||||
DATARMNET54338da2ff);}static int DATARMNETa6aec23397(struct sk_buff*
|
||||
DATARMNET543491eb0f,struct genl_info*DATARMNET54338da2ff){struct nlattr*
|
||||
DATARMNETef7cdd7b6b;DATARMNETef7cdd7b6b=DATARMNET54338da2ff->attrs[
|
||||
DATARMNET44a9a789aa];if(!DATARMNETef7cdd7b6b){GENL_SET_ERR_MSG(
|
||||
DATARMNET54338da2ff,
|
||||
"\x4d\x75\x73\x74\x20\x73\x70\x65\x63\x69\x66\x79\x20\x65\x6e\x63\x61\x70\x20\x70\x6f\x72\x74"
|
||||
);return-EINVAL;}return DATARMNETc97c6a4265(nla_get_be16(DATARMNETef7cdd7b6b),
|
||||
DATARMNET54338da2ff);}static int DATARMNETa4773cb837(struct sk_buff*
|
||||
DATARMNET543491eb0f,struct genl_info*DATARMNET54338da2ff){(void)
|
||||
DATARMNET543491eb0f;(void)DATARMNET54338da2ff;DATARMNET078f6bd384();return
|
||||
(0xd2d+202-0xdf7);}static const struct genl_ops DATARMNETf9df19988d[]={
|
||||
DATARMNET58eca5265b(DATARMNET0604500302,DATARMNET72501635c8),DATARMNET58eca5265b
|
||||
(DATARMNET91becfb9ac,DATARMNET41dd9b14ab),DATARMNET58eca5265b(
|
||||
DATARMNET14a3625b43,DATARMNETf1fa473089),DATARMNET58eca5265b(DATARMNET4478d3511b
|
||||
,DATARMNETcd9478470c),DATARMNET58eca5265b(DATARMNETc2d5a4e103,
|
||||
DATARMNETb86993aefb),DATARMNET58eca5265b(DATARMNET18145b00f6,DATARMNETc175a08219
|
||||
),DATARMNET58eca5265b(DATARMNETb8857fe6d9,DATARMNETc5f6c112ec),
|
||||
DATARMNET58eca5265b(DATARMNET6d50a30ec2,DATARMNETa6aec23397),DATARMNET58eca5265b
|
||||
(DATARMNET2e5d7ed755,DATARMNETa4773cb837),};struct genl_family
|
||||
DATARMNET61e8f41aae={.name=DATARMNET040266f460,.version=DATARMNET7c442b83bb,.
|
||||
maxattr=DATARMNETebcc30fe04,.policy=DATARMNET0381a65e93,.ops=DATARMNETf9df19988d
|
||||
,.n_ops=ARRAY_SIZE(DATARMNETf9df19988d),};static int __init DATARMNET7eb0fa5c8f(
|
||||
void){int DATARMNET61c2303133;pr_info(
|
||||
"\x25\x73\x28\x29\x3a\x20\x72\x6d\x6e\x65\x74\x5f\x77\x6c\x61\x6e\x20\x69\x6e\x69\x74\x69\x61\x6c\x69\x7a\x69\x6e\x67" "\n"
|
||||
,__func__);DATARMNET61c2303133=genl_register_family(&DATARMNET61e8f41aae);if(
|
||||
DATARMNET61c2303133){pr_err(
|
||||
"\x25\x73\x28\x29\x3a\x20\x72\x65\x67\x69\x73\x74\x65\x72\x69\x6e\x67\x20\x66\x61\x6d\x69\x6c\x79\x20\x66\x61\x69\x6c\x65\x64\x3a\x20\x25\x69" "\n"
|
||||
,__func__,DATARMNET61c2303133);genl_unregister_family(&DATARMNET61e8f41aae);
|
||||
return DATARMNET61c2303133;}return(0xd2d+202-0xdf7);}static void __exit
|
||||
DATARMNET7a381832d5(void){int DATARMNET61c2303133;pr_info(
|
||||
"\x25\x73\x28\x29\x3a\x20\x72\x6d\x6e\x65\x74\x5f\x77\x6c\x61\x6e\x20\x65\x78\x69\x74\x69\x6e\x67" "\n"
|
||||
,__func__);DATARMNETfae36afa03();DATARMNET61c2303133=genl_unregister_family(&
|
||||
DATARMNET61e8f41aae);if(DATARMNET61c2303133)pr_err(
|
||||
"\x25\x73\x28\x29\x3a\x20\x75\x6e\x72\x65\x67\x69\x73\x74\x65\x72\x20\x66\x61\x6d\x69\x6c\x79\x20\x66\x61\x69\x6c\x65\x64\x3a\x20\x25\x69" "\n"
|
||||
,__func__,DATARMNET61c2303133);}MODULE_LICENSE("\x47\x50\x4c\x20\x76\x32");
|
||||
module_init(DATARMNET7eb0fa5c8f);module_exit(DATARMNET7a381832d5);
|
22
wlan/rmnet_wlan_genl.h
Normal file
22
wlan/rmnet_wlan_genl.h
Normal file
@@ -0,0 +1,22 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* RMNET WLAN Generic netlink
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DATARMNET3819523922
|
||||
#define DATARMNET3819523922
|
||||
#define DATARMNET7c442b83bb (0xd26+209-0xdf6)
|
||||
#define DATARMNET040266f460 "\x52\x4d\x4e\x45\x54\x5f\x57\x4c\x41\x4e"
|
||||
enum{DATARMNET6ea2b7cfbe,DATARMNET0604500302,DATARMNET91becfb9ac,
|
||||
DATARMNET14a3625b43,DATARMNET4478d3511b,DATARMNETc2d5a4e103,DATARMNET18145b00f6,
|
||||
DATARMNETb8857fe6d9,DATARMNET6d50a30ec2,DATARMNET2e5d7ed755,DATARMNETce1982dccc,
|
||||
};enum{DATARMNET09a5930cdf,DATARMNET4e9cd7b8bf,DATARMNETb8afde4a5a,
|
||||
DATARMNETea4b56dc2b,DATARMNET8bf80e4b66,DATARMNET44a9a789aa,DATARMNET0bfbea52c0,
|
||||
};
|
||||
#define DATARMNETebcc30fe04 (DATARMNET0bfbea52c0 - (0xd26+209-0xdf6))
|
||||
enum{DATARMNET0dcb7acdac,DATARMNET8c062d7709,DATARMNET93b5e3666d,};
|
||||
#define DATARMNETf6bbad94a5 (DATARMNET93b5e3666d - (0xd26+209-0xdf6))
|
||||
#endif
|
||||
|
308
wlan/rmnet_wlan_main.c
Normal file
308
wlan/rmnet_wlan_main.c
Normal file
@@ -0,0 +1,308 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* RMNET WLAN handler framework
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <net/genetlink.h>
|
||||
#include <net/netlink.h>
|
||||
#include <net/ip.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/hashtable.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include "rmnet_wlan_genl.h"
|
||||
#include "rmnet_wlan.h"
|
||||
#include "rmnet_wlan_stats.h"
|
||||
#include "rmnet_wlan_fragment.h"
|
||||
#include "rmnet_wlan_connection.h"
|
||||
#define DATARMNETaf49b04806 ((0xeb7+1158-0x132d))
|
||||
#define DATARMNET6b4ac8224c (const_ilog2(DATARMNETaf49b04806))
|
||||
struct DATARMNET745f724205{struct hlist_node DATARMNETe8608dd267;struct rcu_head
|
||||
DATARMNET28bfe9e6ad;struct DATARMNETb89ecedefc DATARMNET54338da2ff;};struct
|
||||
DATARMNET41b426061d{struct hlist_node DATARMNETe8608dd267;struct rcu_head
|
||||
DATARMNET28bfe9e6ad;struct notifier_block DATARMNET272c159b3c;char
|
||||
DATARMNET852d4d00e2[IFNAMSIZ];struct DATARMNET8d3c2559ca DATARMNET7ed5754a5c;};
|
||||
static DEFINE_MUTEX(DATARMNET63a2b7773e);static DEFINE_HASHTABLE(
|
||||
DATARMNET1903907456,DATARMNET6b4ac8224c);static DEFINE_MUTEX(DATARMNETf46fb02ac6
|
||||
);static DEFINE_HASHTABLE(DATARMNET78ed39f13b,DATARMNET6b4ac8224c);static char
|
||||
DATARMNET30500ba48c[IFNAMSIZ];static __be16 DATARMNETfbd1701415;static bool
|
||||
DATARMNET1e31b22eff(struct DATARMNETb89ecedefc*DATARMNETae0905b0b3,struct
|
||||
DATARMNETb89ecedefc*DATARMNETdb49f21565){if(DATARMNETae0905b0b3->
|
||||
DATARMNET0d956cc77a!=DATARMNETdb49f21565->DATARMNET0d956cc77a||
|
||||
DATARMNETae0905b0b3->DATARMNET4924e79411!=DATARMNETdb49f21565->
|
||||
DATARMNET4924e79411)return false;if(DATARMNETae0905b0b3->DATARMNET0d956cc77a==
|
||||
IPPROTO_ESP)return DATARMNETae0905b0b3->DATARMNET906b2ee561==DATARMNETdb49f21565
|
||||
->DATARMNET906b2ee561;return DATARMNETae0905b0b3->DATARMNETf0d9de7e2f==
|
||||
DATARMNETdb49f21565->DATARMNETf0d9de7e2f;}static int DATARMNET0b72d312f9(struct
|
||||
DATARMNETb89ecedefc*DATARMNET3396919a68,struct genl_info*DATARMNET54338da2ff)
|
||||
__must_hold(&DATARMNET63a2b7773e){struct DATARMNET745f724205*DATARMNET63b1a086d5
|
||||
;rcu_read_lock();if(DATARMNET4eafcdee07(DATARMNET3396919a68)){rcu_read_unlock();
|
||||
GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x54\x75\x70\x6c\x65\x20\x61\x6c\x72\x65\x61\x64\x79\x20\x70\x72\x65\x73\x65\x6e\x74"
|
||||
);return-EEXIST;}rcu_read_unlock();DATARMNET63b1a086d5=kzalloc(sizeof(*
|
||||
DATARMNET63b1a086d5),GFP_KERNEL);if(!DATARMNET63b1a086d5){GENL_SET_ERR_MSG(
|
||||
DATARMNET54338da2ff,
|
||||
"\x43\x61\x6e\x6e\x6f\x74\x20\x61\x6c\x6c\x6f\x63\x61\x74\x65\x20\x74\x75\x70\x6c\x65\x20\x6d\x65\x6d\x6f\x72\x79"
|
||||
);return-ENOMEM;}memcpy(&DATARMNET63b1a086d5->DATARMNET54338da2ff,
|
||||
DATARMNET3396919a68,sizeof(*DATARMNET3396919a68));INIT_HLIST_NODE(&
|
||||
DATARMNET63b1a086d5->DATARMNETe8608dd267);hash_add_rcu(DATARMNET1903907456,&
|
||||
DATARMNET63b1a086d5->DATARMNETe8608dd267,DATARMNET3396919a68->
|
||||
DATARMNETf0d9de7e2f);DATARMNET5ca94dbc3c(DATARMNET12d881921a);return
|
||||
(0xd2d+202-0xdf7);}static void DATARMNET440ec83e44(struct rcu_head*
|
||||
DATARMNET28bfe9e6ad){struct DATARMNET745f724205*DATARMNET63b1a086d5;
|
||||
DATARMNET63b1a086d5=container_of(DATARMNET28bfe9e6ad,struct DATARMNET745f724205,
|
||||
DATARMNET28bfe9e6ad);if(DATARMNET63b1a086d5)kfree(DATARMNET63b1a086d5);}static
|
||||
int DATARMNET79343e3135(struct DATARMNETb89ecedefc*DATARMNET3396919a68,struct
|
||||
genl_info*DATARMNET54338da2ff)__must_hold(&DATARMNET63a2b7773e){struct
|
||||
DATARMNET745f724205*DATARMNET63b1a086d5;struct hlist_node*DATARMNET0386f6f82a;
|
||||
hash_for_each_possible_safe(DATARMNET1903907456,DATARMNET63b1a086d5,
|
||||
DATARMNET0386f6f82a,DATARMNETe8608dd267,DATARMNET3396919a68->DATARMNETf0d9de7e2f
|
||||
){if(DATARMNET1e31b22eff(&DATARMNET63b1a086d5->DATARMNET54338da2ff,
|
||||
DATARMNET3396919a68)){hash_del_rcu(&DATARMNET63b1a086d5->DATARMNETe8608dd267);
|
||||
call_rcu(&DATARMNET63b1a086d5->DATARMNET28bfe9e6ad,DATARMNET440ec83e44);
|
||||
DATARMNET5ca94dbc3c(DATARMNET9f24b86462);return(0xd2d+202-0xdf7);}}
|
||||
GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4e\x6f\x20\x73\x75\x63\x68\x20\x74\x75\x70\x6c\x65");return-ESRCH;}static
|
||||
void DATARMNETad43e44c7e(void){struct DATARMNET745f724205*DATARMNET63b1a086d5;
|
||||
struct hlist_node*DATARMNET0386f6f82a;int DATARMNET5c2fd31d7b;mutex_lock(&
|
||||
DATARMNET63a2b7773e);hash_for_each_safe(DATARMNET1903907456,DATARMNET5c2fd31d7b,
|
||||
DATARMNET0386f6f82a,DATARMNET63b1a086d5,DATARMNETe8608dd267){hash_del_rcu(&
|
||||
DATARMNET63b1a086d5->DATARMNETe8608dd267);call_rcu(&DATARMNET63b1a086d5->
|
||||
DATARMNET28bfe9e6ad,DATARMNET440ec83e44);}mutex_unlock(&DATARMNET63a2b7773e);}
|
||||
static bool DATARMNET55aac1386b(struct DATARMNET8d3c2559ca*DATARMNET1476c48228,
|
||||
struct DATARMNET8d3c2559ca*DATARMNET57a0f36a25){struct in6_addr
|
||||
DATARMNET4c8c2ca74e={.s6_addr32={4294967295,4294967295,(0xd2d+202-0xdf7),
|
||||
(0xd2d+202-0xdf7)},};if(DATARMNET1476c48228->DATARMNET0d956cc77a!=
|
||||
DATARMNET57a0f36a25->DATARMNET0d956cc77a)return false;if(DATARMNET1476c48228->
|
||||
DATARMNET0d956cc77a==(0xd11+230-0xdf3))return DATARMNET1476c48228->
|
||||
DATARMNET0dc14167a1==DATARMNET57a0f36a25->DATARMNET0dc14167a1;return!
|
||||
ipv6_masked_addr_cmp(&DATARMNET1476c48228->DATARMNET5700daac01,&
|
||||
DATARMNET4c8c2ca74e,&DATARMNET57a0f36a25->DATARMNET5700daac01);}static struct
|
||||
DATARMNET41b426061d*DATARMNETcc0a01df2a(struct DATARMNET8d3c2559ca*
|
||||
DATARMNET54338da2ff)__must_hold(RCU){struct DATARMNET41b426061d*
|
||||
DATARMNET63b1a086d5;hash_for_each_possible_rcu(DATARMNET78ed39f13b,
|
||||
DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNET54338da2ff->DATARMNET0dc14167a1
|
||||
){if(DATARMNET55aac1386b(&DATARMNET63b1a086d5->DATARMNET7ed5754a5c,
|
||||
DATARMNET54338da2ff))return DATARMNET63b1a086d5;}return NULL;}static int
|
||||
DATARMNETe98553a8fc(struct notifier_block*DATARMNET272c159b3c,unsigned long
|
||||
DATARMNET7f045a1e6e,void*data){struct net_device*DATARMNET00dcb79bc4=
|
||||
netdev_notifier_info_to_dev(data);struct DATARMNET41b426061d*DATARMNET2d4b4cfc9e
|
||||
;DATARMNET2d4b4cfc9e=container_of(DATARMNET272c159b3c,struct DATARMNET41b426061d
|
||||
,DATARMNET272c159b3c);if(!DATARMNET00dcb79bc4||strncmp(DATARMNET00dcb79bc4->name
|
||||
,DATARMNET2d4b4cfc9e->DATARMNET852d4d00e2,IFNAMSIZ))return NOTIFY_DONE;switch(
|
||||
DATARMNET7f045a1e6e){case NETDEV_UNREGISTER:if(DATARMNET2d4b4cfc9e->
|
||||
DATARMNET7ed5754a5c.DATARMNET57656f6f2f){dev_put(DATARMNET2d4b4cfc9e->
|
||||
DATARMNET7ed5754a5c.DATARMNET57656f6f2f);WRITE_ONCE(DATARMNET2d4b4cfc9e->
|
||||
DATARMNET7ed5754a5c.DATARMNET57656f6f2f,NULL);}break;case NETDEV_REGISTER:if(!
|
||||
DATARMNET2d4b4cfc9e->DATARMNET7ed5754a5c.DATARMNET57656f6f2f){dev_hold(
|
||||
DATARMNET00dcb79bc4);WRITE_ONCE(DATARMNET2d4b4cfc9e->DATARMNET7ed5754a5c.
|
||||
DATARMNET57656f6f2f,DATARMNET00dcb79bc4);}break;default:break;}return
|
||||
NOTIFY_DONE;}static int DATARMNET1ac13d5a2a(struct DATARMNET8d3c2559ca*
|
||||
DATARMNET7ed5754a5c,struct genl_info*DATARMNET54338da2ff)__must_hold(&
|
||||
DATARMNETf46fb02ac6){struct DATARMNET41b426061d*DATARMNET2d4b4cfc9e;int
|
||||
DATARMNET268a8314cf;rcu_read_lock();DATARMNET2d4b4cfc9e=DATARMNETcc0a01df2a(
|
||||
DATARMNET7ed5754a5c);if(DATARMNET2d4b4cfc9e){GENL_SET_ERR_MSG(
|
||||
DATARMNET54338da2ff,
|
||||
"\x46\x57\x44\x20\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e\x20\x61\x6c\x72\x65\x61\x64\x79\x20\x70\x72\x65\x73\x65\x6e\x74"
|
||||
);rcu_read_unlock();return-EEXIST;}rcu_read_unlock();DATARMNET2d4b4cfc9e=kzalloc
|
||||
(sizeof(*DATARMNET2d4b4cfc9e),GFP_KERNEL);if(!DATARMNET2d4b4cfc9e){
|
||||
GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x43\x61\x6e\x6e\x6f\x74\x20\x61\x6c\x6c\x6f\x63\x61\x74\x65\x20\x46\x57\x44\x20\x63\x6f\x6e\x74\x65\x78\x74"
|
||||
);return-ENOMEM;}memcpy(&DATARMNET2d4b4cfc9e->DATARMNET7ed5754a5c,
|
||||
DATARMNET7ed5754a5c,sizeof(*DATARMNET7ed5754a5c));DATARMNET2d4b4cfc9e->
|
||||
DATARMNET7ed5754a5c.DATARMNET57656f6f2f=NULL;strlcpy(DATARMNET2d4b4cfc9e->
|
||||
DATARMNET852d4d00e2,DATARMNET7ed5754a5c->DATARMNET57656f6f2f->name,IFNAMSIZ);
|
||||
DATARMNET2d4b4cfc9e->DATARMNET272c159b3c.notifier_call=DATARMNETe98553a8fc;
|
||||
DATARMNET268a8314cf=register_netdevice_notifier(&DATARMNET2d4b4cfc9e->
|
||||
DATARMNET272c159b3c);if(DATARMNET268a8314cf){GENL_SET_ERR_MSG(
|
||||
DATARMNET54338da2ff,
|
||||
"\x52\x65\x67\x69\x73\x74\x65\x72\x69\x6e\x67\x20\x46\x57\x44\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x66\x61\x69\x6c\x65\x64"
|
||||
);kfree(DATARMNET2d4b4cfc9e);return DATARMNET268a8314cf;}INIT_HLIST_NODE(&
|
||||
DATARMNET2d4b4cfc9e->DATARMNETe8608dd267);hash_add_rcu(DATARMNET78ed39f13b,&
|
||||
DATARMNET2d4b4cfc9e->DATARMNETe8608dd267,DATARMNET7ed5754a5c->
|
||||
DATARMNET0dc14167a1);return(0xd2d+202-0xdf7);}static void DATARMNET70718e4fdd(
|
||||
struct rcu_head*DATARMNET28bfe9e6ad){struct DATARMNET41b426061d*
|
||||
DATARMNET63b1a086d5;DATARMNET63b1a086d5=container_of(DATARMNET28bfe9e6ad,struct
|
||||
DATARMNET41b426061d,DATARMNET28bfe9e6ad);if(DATARMNET63b1a086d5)kfree(
|
||||
DATARMNET63b1a086d5);}static int DATARMNET6518a28641(struct DATARMNET41b426061d*
|
||||
DATARMNET2d4b4cfc9e)__must_hold(&DATARMNETf46fb02ac6){int DATARMNET268a8314cf;
|
||||
DATARMNET268a8314cf=unregister_netdevice_notifier(&DATARMNET2d4b4cfc9e->
|
||||
DATARMNET272c159b3c);if(DATARMNET268a8314cf)return DATARMNET268a8314cf;
|
||||
hash_del_rcu(&DATARMNET2d4b4cfc9e->DATARMNETe8608dd267);DATARMNETedae8262e1(&
|
||||
DATARMNET2d4b4cfc9e->DATARMNET7ed5754a5c);call_rcu(&DATARMNET2d4b4cfc9e->
|
||||
DATARMNET28bfe9e6ad,DATARMNET70718e4fdd);return DATARMNET268a8314cf;}static int
|
||||
DATARMNET6b6be8e27f(struct DATARMNET8d3c2559ca*DATARMNET7ed5754a5c,struct
|
||||
genl_info*DATARMNET54338da2ff)__must_hold(&DATARMNETf46fb02ac6){struct
|
||||
DATARMNET41b426061d*DATARMNET2d4b4cfc9e;int DATARMNET268a8314cf;rcu_read_lock();
|
||||
DATARMNET2d4b4cfc9e=DATARMNETcc0a01df2a(DATARMNET7ed5754a5c);rcu_read_unlock();
|
||||
if(!DATARMNET2d4b4cfc9e){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4e\x6f\x20\x73\x75\x63\x68\x20\x46\x57\x44\x20\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e"
|
||||
);return-ESRCH;}if(strncmp(DATARMNET2d4b4cfc9e->DATARMNET852d4d00e2,
|
||||
DATARMNET7ed5754a5c->DATARMNET57656f6f2f->name,IFNAMSIZ)){GENL_SET_ERR_MSG(
|
||||
DATARMNET54338da2ff,
|
||||
"\x49\x6e\x63\x6f\x72\x72\x65\x63\x74\x20\x46\x57\x44\x20\x64\x65\x76\x69\x63\x65"
|
||||
);return-ENODEV;}DATARMNET268a8314cf=DATARMNET6518a28641(DATARMNET2d4b4cfc9e);if
|
||||
(DATARMNET268a8314cf){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x55\x6e\x72\x65\x67\x69\x73\x74\x65\x72\x69\x6e\x67\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x66\x61\x69\x6c\x65\x64"
|
||||
);return DATARMNET268a8314cf;}return DATARMNET268a8314cf;}static void
|
||||
DATARMNETe5b03fe375(void){struct DATARMNET41b426061d*DATARMNET54338da2ff;struct
|
||||
hlist_node*DATARMNET0386f6f82a;int DATARMNET5c2fd31d7b;mutex_lock(&
|
||||
DATARMNETf46fb02ac6);hash_for_each_safe(DATARMNET78ed39f13b,DATARMNET5c2fd31d7b,
|
||||
DATARMNET0386f6f82a,DATARMNET54338da2ff,DATARMNETe8608dd267)DATARMNET6518a28641(
|
||||
DATARMNET54338da2ff);mutex_unlock(&DATARMNETf46fb02ac6);}static
|
||||
rx_handler_result_t DATARMNET37a92021f9(struct sk_buff**DATARMNET89946cec52){
|
||||
struct DATARMNET0ca9d8ead7 DATARMNETa76763310b={};struct DATARMNETb89ecedefc
|
||||
DATARMNET3396919a68={};struct DATARMNET41b426061d*DATARMNET72f0eefdce;struct
|
||||
DATARMNET8d3c2559ca*DATARMNET2d4b4cfc9e,DATARMNET54338da2ff;struct sk_buff*
|
||||
DATARMNET543491eb0f=*DATARMNET89946cec52;rx_handler_result_t DATARMNET1dec89a127
|
||||
=RX_HANDLER_PASS;int DATARMNET611d08d671;if(!DATARMNET543491eb0f||
|
||||
DATARMNET543491eb0f->pkt_type==PACKET_LOOPBACK)return DATARMNET1dec89a127;
|
||||
rcu_read_lock();DATARMNET5ca94dbc3c(DATARMNET735bb8578c);if(DATARMNET543491eb0f
|
||||
->protocol==htons(ETH_P_IP)){struct iphdr*DATARMNET86f1f2cdc9=ip_hdr(
|
||||
DATARMNET543491eb0f);if(DATARMNET86f1f2cdc9->protocol==IPPROTO_ICMP){
|
||||
DATARMNETa76763310b.DATARMNETdfe430c2d6=DATARMNET86f1f2cdc9->daddr;
|
||||
DATARMNETa76763310b.DATARMNET2cb607d686=DATARMNET86f1f2cdc9->saddr;
|
||||
DATARMNETa76763310b.DATARMNET0d956cc77a=(0xd11+230-0xdf3);DATARMNET2d4b4cfc9e=
|
||||
DATARMNET07f0e0f286(&DATARMNETa76763310b);if(DATARMNET2d4b4cfc9e)goto
|
||||
DATARMNET1e5291b369;}DATARMNET54338da2ff.DATARMNET0dc14167a1=DATARMNET86f1f2cdc9
|
||||
->daddr;DATARMNET54338da2ff.DATARMNET0d956cc77a=(0xd11+230-0xdf3);
|
||||
DATARMNET72f0eefdce=DATARMNETcc0a01df2a(&DATARMNET54338da2ff);if(!
|
||||
DATARMNET72f0eefdce)goto DATARMNETbf4095f79e;DATARMNET2d4b4cfc9e=&
|
||||
DATARMNET72f0eefdce->DATARMNET7ed5754a5c;DATARMNET3396919a68.DATARMNET0d956cc77a
|
||||
=(0xd11+230-0xdf3);DATARMNET3396919a68.DATARMNET4924e79411=DATARMNET86f1f2cdc9->
|
||||
protocol;DATARMNET611d08d671=DATARMNET86f1f2cdc9->ihl*(0xd11+230-0xdf3);if(
|
||||
ip_is_fragment(DATARMNET86f1f2cdc9)){if(!DATARMNET579f75aa50(DATARMNET543491eb0f
|
||||
,DATARMNET611d08d671,&DATARMNET3396919a68,DATARMNET2d4b4cfc9e))
|
||||
DATARMNET1dec89a127=RX_HANDLER_CONSUMED;goto DATARMNETbf4095f79e;}}else if(
|
||||
DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6)){struct ipv6hdr*
|
||||
DATARMNETbf55123e5b=ipv6_hdr(DATARMNET543491eb0f);__be16 frag_off;u8
|
||||
DATARMNET65293f17c4;DATARMNET65293f17c4=DATARMNETbf55123e5b->nexthdr;
|
||||
DATARMNET611d08d671=ipv6_skip_exthdr(DATARMNET543491eb0f,sizeof(*
|
||||
DATARMNETbf55123e5b),&DATARMNET65293f17c4,&frag_off);if(DATARMNET611d08d671<
|
||||
(0xd2d+202-0xdf7))goto DATARMNETbf4095f79e;if(DATARMNET65293f17c4==
|
||||
IPPROTO_ICMPV6){memcpy(&DATARMNETa76763310b.DATARMNET815cbb4bf5,&
|
||||
DATARMNETbf55123e5b->daddr,sizeof(DATARMNETa76763310b.DATARMNET815cbb4bf5));
|
||||
memcpy(&DATARMNETa76763310b.DATARMNETc3f31215b7,&DATARMNETbf55123e5b->saddr,
|
||||
sizeof(DATARMNETa76763310b.DATARMNETc3f31215b7));DATARMNETa76763310b.
|
||||
DATARMNET0d956cc77a=(0xd03+244-0xdf1);DATARMNET2d4b4cfc9e=DATARMNET07f0e0f286(&
|
||||
DATARMNETa76763310b);if(DATARMNET2d4b4cfc9e)goto DATARMNET1e5291b369;}memcpy(&
|
||||
DATARMNET54338da2ff.DATARMNET5700daac01,&DATARMNETbf55123e5b->daddr,sizeof(
|
||||
DATARMNET54338da2ff.DATARMNET5700daac01));DATARMNET54338da2ff.
|
||||
DATARMNET0d956cc77a=(0xd03+244-0xdf1);DATARMNET72f0eefdce=DATARMNETcc0a01df2a(&
|
||||
DATARMNET54338da2ff);if(!DATARMNET72f0eefdce)goto DATARMNETbf4095f79e;
|
||||
DATARMNET2d4b4cfc9e=&DATARMNET72f0eefdce->DATARMNET7ed5754a5c;
|
||||
DATARMNET3396919a68.DATARMNET0d956cc77a=(0xd03+244-0xdf1);DATARMNET3396919a68.
|
||||
DATARMNET4924e79411=DATARMNET65293f17c4;if(frag_off){if(!DATARMNETaca8ca54ed(
|
||||
DATARMNET543491eb0f,DATARMNET611d08d671,&DATARMNET3396919a68,DATARMNET2d4b4cfc9e
|
||||
))DATARMNET1dec89a127=RX_HANDLER_CONSUMED;goto DATARMNETbf4095f79e;}}else{goto
|
||||
DATARMNETbf4095f79e;}if(DATARMNET3396919a68.DATARMNET4924e79411==IPPROTO_TCP||
|
||||
DATARMNET3396919a68.DATARMNET4924e79411==IPPROTO_UDP){struct udphdr*
|
||||
DATARMNET75be5f3406=(struct udphdr*)(DATARMNET543491eb0f->data+
|
||||
DATARMNET611d08d671);DATARMNET3396919a68.DATARMNETf0d9de7e2f=DATARMNET75be5f3406
|
||||
->dest;if(DATARMNETa8b2566e6a(DATARMNET543491eb0f,&DATARMNET3396919a68,
|
||||
DATARMNET611d08d671)){DATARMNET5ca94dbc3c(DATARMNETd1ad664d00);goto
|
||||
DATARMNETbf4095f79e;}}else if(DATARMNET3396919a68.DATARMNET4924e79411==
|
||||
IPPROTO_ESP){struct ip_esp_hdr*DATARMNET73ee6a7020=(struct ip_esp_hdr*)(
|
||||
DATARMNET543491eb0f->data+DATARMNET611d08d671);DATARMNET3396919a68.
|
||||
DATARMNET906b2ee561=DATARMNET73ee6a7020->spi;}else{goto DATARMNETbf4095f79e;}if(
|
||||
DATARMNET4eafcdee07(&DATARMNET3396919a68))goto DATARMNET1e5291b369;goto
|
||||
DATARMNETbf4095f79e;DATARMNET1e5291b369:if(!DATARMNET4899053671(
|
||||
DATARMNET543491eb0f,DATARMNET2d4b4cfc9e))DATARMNET1dec89a127=RX_HANDLER_CONSUMED
|
||||
;DATARMNETbf4095f79e:rcu_read_unlock();return DATARMNET1dec89a127;}static int
|
||||
DATARMNET0ed065ddb7(struct notifier_block*DATARMNET272c159b3c,unsigned long
|
||||
DATARMNET7f045a1e6e,void*data){struct net_device*DATARMNET00dcb79bc4=
|
||||
netdev_notifier_info_to_dev(data);if(!DATARMNET00dcb79bc4||strncmp(
|
||||
DATARMNET00dcb79bc4->name,DATARMNET30500ba48c,IFNAMSIZ))return NOTIFY_DONE;
|
||||
switch(DATARMNET7f045a1e6e){case NETDEV_UNREGISTER:netdev_rx_handler_unregister(
|
||||
DATARMNET00dcb79bc4);break;case NETDEV_REGISTER:if(netdev_rx_handler_register(
|
||||
DATARMNET00dcb79bc4,DATARMNET37a92021f9,NULL))pr_err(
|
||||
"\x25\x73\x28\x29\x3a\x20\x52\x65\x67\x69\x73\x74\x65\x72\x69\x6e\x67\x20\x68\x61\x6e\x64\x6c\x65\x72\x20\x66\x61\x69\x6c\x65\x64" "\n"
|
||||
,__func__);break;default:break;}return NOTIFY_DONE;}static struct notifier_block
|
||||
DATARMNETa1726000d8={.notifier_call=DATARMNET0ed065ddb7,};static int
|
||||
DATARMNET116f9a46aa(void){int DATARMNET268a8314cf;if(!DATARMNET30500ba48c[
|
||||
(0xd2d+202-0xdf7)])return(0xd2d+202-0xdf7);DATARMNET268a8314cf=
|
||||
unregister_netdevice_notifier(&DATARMNETa1726000d8);if(!DATARMNET268a8314cf)
|
||||
DATARMNET30500ba48c[(0xd2d+202-0xdf7)]=(0xd2d+202-0xdf7);return
|
||||
DATARMNET268a8314cf;}static void DATARMNETbb4efa5b3d(void){DATARMNET116f9a46aa()
|
||||
;DATARMNETfbd1701415=(0xd2d+202-0xdf7);DATARMNET8c0e010dfb();DATARMNETe5b03fe375
|
||||
();DATARMNETad43e44c7e();}int DATARMNET4899053671(struct sk_buff*
|
||||
DATARMNET543491eb0f,struct DATARMNET8d3c2559ca*DATARMNET54338da2ff){struct
|
||||
net_device*DATARMNET00dcb79bc4;DATARMNET00dcb79bc4=READ_ONCE(DATARMNET54338da2ff
|
||||
->DATARMNET57656f6f2f);if(!DATARMNET00dcb79bc4){DATARMNET5ca94dbc3c(
|
||||
DATARMNET591885a019);return-ENODEV;}DATARMNET543491eb0f->dev=DATARMNET00dcb79bc4
|
||||
;dev_queue_xmit(DATARMNET543491eb0f);DATARMNET5ca94dbc3c(DATARMNETf4c2a83526);
|
||||
return(0xd2d+202-0xdf7);}bool DATARMNET4eafcdee07(struct DATARMNETb89ecedefc*
|
||||
DATARMNET3396919a68)__must_hold(RCU){struct DATARMNET745f724205*
|
||||
DATARMNET63b1a086d5;hash_for_each_possible_rcu(DATARMNET1903907456,
|
||||
DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNET3396919a68->DATARMNETf0d9de7e2f
|
||||
){if(DATARMNET1e31b22eff(&DATARMNET63b1a086d5->DATARMNET54338da2ff,
|
||||
DATARMNET3396919a68))return true;}return false;}int DATARMNET53f12a0f7d(struct
|
||||
DATARMNETb89ecedefc*DATARMNETcadc2ef9aa,u32 DATARMNETef77661260,struct genl_info
|
||||
*DATARMNET54338da2ff){int DATARMNET268a8314cf;u32 DATARMNETefc9df3df2;mutex_lock
|
||||
(&DATARMNET63a2b7773e);for(DATARMNETefc9df3df2=(0xd2d+202-0xdf7);
|
||||
DATARMNETefc9df3df2<DATARMNETef77661260;DATARMNETefc9df3df2++){
|
||||
DATARMNET268a8314cf=DATARMNET0b72d312f9(&DATARMNETcadc2ef9aa[DATARMNETefc9df3df2
|
||||
],DATARMNET54338da2ff);if(DATARMNET268a8314cf){if(DATARMNET268a8314cf==-EEXIST)
|
||||
DATARMNET268a8314cf=(0xd2d+202-0xdf7);else break;}}mutex_unlock(&
|
||||
DATARMNET63a2b7773e);return DATARMNET268a8314cf;}int DATARMNET07f6485c9b(struct
|
||||
DATARMNETb89ecedefc*DATARMNETcadc2ef9aa,u32 DATARMNETef77661260,struct genl_info
|
||||
*DATARMNET54338da2ff){int DATARMNET268a8314cf;u32 DATARMNETefc9df3df2;mutex_lock
|
||||
(&DATARMNET63a2b7773e);for(DATARMNETefc9df3df2=(0xd2d+202-0xdf7);
|
||||
DATARMNETefc9df3df2<DATARMNETef77661260;DATARMNETefc9df3df2++){
|
||||
DATARMNET268a8314cf=DATARMNET79343e3135(&DATARMNETcadc2ef9aa[DATARMNETefc9df3df2
|
||||
],DATARMNET54338da2ff);if(DATARMNET268a8314cf){if(DATARMNET268a8314cf==-ESRCH)
|
||||
DATARMNET268a8314cf=(0xd2d+202-0xdf7);else break;}}mutex_unlock(&
|
||||
DATARMNET63a2b7773e);return DATARMNET268a8314cf;}int DATARMNET97b2388e63(char*
|
||||
DATARMNET852d4d00e2,struct genl_info*DATARMNET54338da2ff){int
|
||||
DATARMNET268a8314cf;if(!strncmp(DATARMNET30500ba48c,DATARMNET852d4d00e2,IFNAMSIZ
|
||||
)){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x44\x65\x76\x69\x63\x65\x20\x69\x73\x20\x61\x6c\x72\x65\x61\x64\x79\x20\x73\x65\x74"
|
||||
);return(0xd2d+202-0xdf7);}DATARMNET268a8314cf=DATARMNET116f9a46aa();if(
|
||||
DATARMNET268a8314cf){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4b\x65\x72\x6e\x65\x6c\x20\x65\x72\x72\x6f\x72\x2c\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x75\x6e\x72\x65\x67\x69\x73\x74\x65\x72\x20\x66\x61\x69\x6c\x65\x64"
|
||||
);return DATARMNET268a8314cf;}strlcpy(DATARMNET30500ba48c,DATARMNET852d4d00e2,
|
||||
IFNAMSIZ);DATARMNET268a8314cf=register_netdevice_notifier(&DATARMNETa1726000d8);
|
||||
if(DATARMNET268a8314cf){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
||||
"\x4b\x65\x72\x6e\x65\x6c\x20\x65\x72\x72\x6f\x72\x2c\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x66\x61\x69\x6c\x65\x64"
|
||||
);DATARMNET30500ba48c[(0xd2d+202-0xdf7)]=(0xd2d+202-0xdf7);}return
|
||||
DATARMNET268a8314cf;}int DATARMNETa903cd5994(char*DATARMNET852d4d00e2,struct
|
||||
genl_info*DATARMNET54338da2ff){return DATARMNET116f9a46aa();}int
|
||||
DATARMNET947eb110d2(struct DATARMNET8d3c2559ca*DATARMNET2d4b4cfc9e,struct
|
||||
genl_info*DATARMNET54338da2ff){int DATARMNET268a8314cf;mutex_lock(&
|
||||
DATARMNETf46fb02ac6);DATARMNET268a8314cf=DATARMNET1ac13d5a2a(DATARMNET2d4b4cfc9e
|
||||
,DATARMNET54338da2ff);mutex_unlock(&DATARMNETf46fb02ac6);return
|
||||
DATARMNET268a8314cf;}int DATARMNETb8b35fdc18(struct DATARMNET8d3c2559ca*
|
||||
DATARMNET2d4b4cfc9e,struct genl_info*DATARMNET54338da2ff){int
|
||||
DATARMNET268a8314cf;mutex_lock(&DATARMNETf46fb02ac6);DATARMNET268a8314cf=
|
||||
DATARMNET6b6be8e27f(DATARMNET2d4b4cfc9e,DATARMNET54338da2ff);mutex_unlock(&
|
||||
DATARMNETf46fb02ac6);return DATARMNET268a8314cf;}int DATARMNET8d5a5a7047(__be16
|
||||
DATARMNETf0d9de7e2f,struct genl_info*DATARMNET54338da2ff){WRITE_ONCE(
|
||||
DATARMNETfbd1701415,DATARMNETf0d9de7e2f);return(0xd2d+202-0xdf7);}int
|
||||
DATARMNETc97c6a4265(__be16 DATARMNETf0d9de7e2f,struct genl_info*
|
||||
DATARMNET54338da2ff){__be16 DATARMNET07fc49caf2=READ_ONCE(DATARMNETfbd1701415);
|
||||
if(DATARMNET07fc49caf2!=DATARMNETf0d9de7e2f){GENL_SET_ERR_MSG(
|
||||
DATARMNET54338da2ff,
|
||||
"\x49\x6e\x76\x61\x6c\x69\x64\x20\x70\x6f\x72\x74\x20\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e"
|
||||
);return-EINVAL;}WRITE_ONCE(DATARMNETfbd1701415,(0xd2d+202-0xdf7));return
|
||||
(0xd2d+202-0xdf7);}bool DATARMNETa8b2566e6a(struct sk_buff*DATARMNET543491eb0f,
|
||||
struct DATARMNETb89ecedefc*DATARMNET3396919a68,int DATARMNET611d08d671){struct
|
||||
udphdr*DATARMNET75be5f3406,DATARMNETc82d2f4e16;__be32*DATARMNETdf2dbc641f,
|
||||
DATARMNET6c56902362;if(DATARMNET3396919a68->DATARMNET4924e79411!=IPPROTO_UDP||
|
||||
DATARMNET3396919a68->DATARMNETf0d9de7e2f!=READ_ONCE(DATARMNETfbd1701415))return
|
||||
false;DATARMNET75be5f3406=skb_header_pointer(DATARMNET543491eb0f,
|
||||
DATARMNET611d08d671,sizeof(*DATARMNET75be5f3406),&DATARMNETc82d2f4e16);if(!
|
||||
DATARMNET75be5f3406)return false;if(DATARMNET75be5f3406->source==htons(
|
||||
(0xdf7+6169-0x241c)))return false;DATARMNETdf2dbc641f=skb_header_pointer(
|
||||
DATARMNET543491eb0f,DATARMNET611d08d671+sizeof(*DATARMNET75be5f3406),sizeof(*
|
||||
DATARMNETdf2dbc641f),&DATARMNET6c56902362);if(!DATARMNETdf2dbc641f)return false;
|
||||
return!!(*DATARMNETdf2dbc641f);}int DATARMNET078f6bd384(void){
|
||||
DATARMNETbb4efa5b3d();return(0xd2d+202-0xdf7);}void DATARMNETfae36afa03(void){
|
||||
DATARMNETbb4efa5b3d();}
|
14
wlan/rmnet_wlan_stats.c
Normal file
14
wlan/rmnet_wlan_stats.c
Normal file
@@ -0,0 +1,14 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* RMNET WLAN stats framework
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/moduleparam.h>
|
||||
#include "rmnet_wlan_stats.h"
|
||||
static u64 DATARMNET24d235c444[DATARMNETc6bf075f65];module_param_array_named(
|
||||
rmnet_wlan_stat,DATARMNET24d235c444,ullong,NULL,(0xcb7+5769-0x221c));void
|
||||
DATARMNET5ca94dbc3c(u32 DATARMNET248f120dd5){if(DATARMNET248f120dd5<
|
||||
DATARMNETc6bf075f65)DATARMNET24d235c444[DATARMNET248f120dd5]+=(0xd26+209-0xdf6);
|
||||
}
|
16
wlan/rmnet_wlan_stats.h
Normal file
16
wlan/rmnet_wlan_stats.h
Normal file
@@ -0,0 +1,16 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* RMNET WLAN stats framework
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DATARMNETb0d32a80bc
|
||||
#define DATARMNETb0d32a80bc
|
||||
#include <linux/types.h>
|
||||
enum{DATARMNET12d881921a,DATARMNET9f24b86462,DATARMNET735bb8578c,
|
||||
DATARMNETf4c2a83526,DATARMNET591885a019,DATARMNETd8273aa7e1,DATARMNET7a58a5c1fc,
|
||||
DATARMNETba232077da,DATARMNETe75ad1a949,DATARMNETd691057b85,DATARMNETd1ad664d00,
|
||||
DATARMNETc6bf075f65,};void DATARMNET5ca94dbc3c(u32 DATARMNET248f120dd5);
|
||||
#endif
|
||||
|
Viittaa uudesa ongelmassa
Block a user