Add 'qcom/opensource/datarmnet-ext/' from commit 'e7a27480ae7c8dbc5508a8dcfa69c5628d3afe2d'
git-subtree-dir: qcom/opensource/datarmnet-ext git-subtree-mainline:16648ad2df
git-subtree-split:e7a27480ae
Change-Id: repo: https://git.codelinaro.org/clo/la/platform/vendor/qcom/opensource/datarmnet-ext tag: LA.VENDOR.14.3.0.r1-17300-lanai.QSSI15.0
This commit is contained in:
364
qcom/opensource/datarmnet-ext/wlan/rmnet_wlan_connection.c
Normal file
364
qcom/opensource/datarmnet-ext/wlan/rmnet_wlan_connection.c
Normal file
@@ -0,0 +1,364 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. 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/workqueue.h>
|
||||
#include <net/ip.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/dst.h>
|
||||
#include <net/netfilter/nf_conntrack.h>
|
||||
#include "rmnet_module.h"
|
||||
#include "rmnet_wlan.h"
|
||||
#include "rmnet_wlan_connection.h"
|
||||
#include "rmnet_wlan_stats.h"
|
||||
#define DATARMNET5da8c68c19 ((0x16a8+1565-0x14f5))
|
||||
#define DATARMNET4d011802ef ((0xdf7+6169-0x241c))
|
||||
#define DATARMNET8fc07fbb24 ((0xeb7+1158-0x132d))
|
||||
#define DATARMNETeaf0945284 \
|
||||
(const_ilog2(DATARMNET8fc07fbb24))
|
||||
extern void(*rmnet_wlan_ll_tuple_hook)(struct sk_buff*DATARMNET543491eb0f);
|
||||
struct DATARMNET4f49486833{struct hlist_node DATARMNETe8608dd267;struct rcu_head
|
||||
DATARMNET28bfe9e6ad;struct DATARMNET0ca9d8ead7 DATARMNET54338da2ff;struct
|
||||
DATARMNET8d3c2559ca*DATARMNET7ed5754a5c;unsigned long DATARMNET763f2e5fac;bool
|
||||
DATARMNET1717afebc7;};struct DATARMNETeb4a7e58d8{struct delayed_work
|
||||
DATARMNET190b4452e8;bool DATARMNETcd94e0d3c7;};static DEFINE_SPINLOCK(
|
||||
DATARMNET820642743b);static DEFINE_HASHTABLE(DATARMNET5413d6f8ec,
|
||||
DATARMNETeaf0945284);static u32 DATARMNETf658004dbc;static struct
|
||||
DATARMNETeb4a7e58d8 DATARMNET0b04fde883;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 bool DATARMNET64cb643bf6(struct DATARMNET4f49486833
|
||||
*DATARMNET63b1a086d5,unsigned long DATARMNET763f2e5fac){unsigned long
|
||||
DATARMNETc2d5c71ce1;DATARMNETc2d5c71ce1=msecs_to_jiffies(DATARMNET5da8c68c19);if
|
||||
(DATARMNET763f2e5fac-DATARMNET63b1a086d5->DATARMNET763f2e5fac>
|
||||
DATARMNETc2d5c71ce1)return true;return false;}static bool DATARMNETd0a7ffc2d1(
|
||||
bool DATARMNETe78ad140cc){struct DATARMNET4f49486833*DATARMNET63b1a086d5;struct
|
||||
hlist_node*DATARMNET0386f6f82a;unsigned long DATARMNET763f2e5fac;int
|
||||
DATARMNET5c2fd31d7b;DATARMNET763f2e5fac=jiffies;hash_for_each_safe(
|
||||
DATARMNET5413d6f8ec,DATARMNET5c2fd31d7b,DATARMNET0386f6f82a,DATARMNET63b1a086d5,
|
||||
DATARMNETe8608dd267){if(DATARMNET63b1a086d5->DATARMNET1717afebc7)continue;if(
|
||||
DATARMNETe78ad140cc||DATARMNET64cb643bf6(DATARMNET63b1a086d5,DATARMNET763f2e5fac
|
||||
)){DATARMNET63b1a086d5->DATARMNET1717afebc7=true;hash_del_rcu(&
|
||||
DATARMNET63b1a086d5->DATARMNETe8608dd267);kfree_rcu(DATARMNET63b1a086d5,
|
||||
DATARMNET28bfe9e6ad);DATARMNETf658004dbc--;}}return!!DATARMNETf658004dbc;}static
|
||||
void DATARMNET8211acc766(struct work_struct*DATARMNET190b4452e8){struct
|
||||
DATARMNETeb4a7e58d8*DATARMNET563f32ea64;unsigned long DATARMNETfb0677cc3c;bool
|
||||
DATARMNET6e1c466378;DATARMNET563f32ea64=container_of(to_delayed_work(
|
||||
DATARMNET190b4452e8),struct DATARMNETeb4a7e58d8,DATARMNET190b4452e8);
|
||||
spin_lock_irqsave(&DATARMNET820642743b,DATARMNETfb0677cc3c);DATARMNET6e1c466378=
|
||||
DATARMNETd0a7ffc2d1(DATARMNET563f32ea64->DATARMNETcd94e0d3c7);if(
|
||||
DATARMNET6e1c466378){unsigned long DATARMNETf71ef1b8da;DATARMNETf71ef1b8da=
|
||||
msecs_to_jiffies(DATARMNET4d011802ef);schedule_delayed_work(&DATARMNET563f32ea64
|
||||
->DATARMNET190b4452e8,DATARMNETf71ef1b8da);}spin_unlock_irqrestore(&
|
||||
DATARMNET820642743b,DATARMNETfb0677cc3c);}static rx_handler_result_t
|
||||
DATARMNETc9ed97754a(struct sk_buff*DATARMNET543491eb0f,uint8_t
|
||||
DATARMNET1a901c3d09){if(skb_is_nonlinear(DATARMNET543491eb0f)&&!skb_headlen(
|
||||
DATARMNET543491eb0f)){int DATARMNETcab577d6ad=(0xd2d+202-0xdf7);if(
|
||||
DATARMNET543491eb0f->protocol==htons(ETH_P_IP)){DATARMNETcab577d6ad=sizeof(
|
||||
struct iphdr);}else if(DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6)){
|
||||
DATARMNETcab577d6ad=sizeof(struct ipv6hdr);}else{DATARMNET17f6bc1be5(
|
||||
DATARMNETcea0a33786);goto DATARMNETc1174a0f45;}if(!__pskb_pull_tail(
|
||||
DATARMNET543491eb0f,DATARMNETcab577d6ad)){DATARMNET17f6bc1be5(
|
||||
DATARMNETe1f92d8061);goto DATARMNETc1174a0f45;}else{skb_reset_network_header(
|
||||
DATARMNET543491eb0f);DATARMNET17f6bc1be5(DATARMNETce7e5f4f28);}}if(
|
||||
DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IP))&&
|
||||
DATARMNET1a901c3d09==DATARMNET9bfbc31cd6){struct iphdr*DATARMNET86f1f2cdc9,
|
||||
DATARMNETbf6548198e;struct net_device*DATARMNET813ca18d06=NULL;struct flowi4
|
||||
DATARMNET099aa93adc={};struct rtable*DATARMNET066b8bd537;struct neighbour*
|
||||
DATARMNET3f85732c70;int DATARMNET268a8314cf=(0xd2d+202-0xdf7);
|
||||
DATARMNET86f1f2cdc9=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
|
||||
sizeof(*DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9){
|
||||
DATARMNET17f6bc1be5(DATARMNET15454f969d);goto DATARMNETc1174a0f45;}
|
||||
DATARMNET813ca18d06=dev_get_by_name_rcu(&init_net,DATARMNET934406764d());if(!
|
||||
DATARMNET813ca18d06){DATARMNET17f6bc1be5(DATARMNETfa4b3dd44a);goto
|
||||
DATARMNETc1174a0f45;}DATARMNET543491eb0f->dev=DATARMNET813ca18d06;memcpy(&
|
||||
DATARMNET099aa93adc.saddr,&DATARMNET86f1f2cdc9->saddr,sizeof(__be32));memcpy(&
|
||||
DATARMNET099aa93adc.daddr,&DATARMNET86f1f2cdc9->daddr,sizeof(__be32));
|
||||
DATARMNET099aa93adc.flowi4_oif=DATARMNET813ca18d06->ifindex;DATARMNET099aa93adc.
|
||||
flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537=ip_route_output_key(&
|
||||
init_net,&DATARMNET099aa93adc);if(IS_ERR(DATARMNET066b8bd537)){
|
||||
DATARMNET17f6bc1be5(DATARMNET72ab5e86d8);goto DATARMNETc1174a0f45;}
|
||||
DATARMNET3f85732c70=dst_neigh_lookup(&DATARMNET066b8bd537->dst,&
|
||||
DATARMNET099aa93adc.daddr);ip_rt_put(DATARMNET066b8bd537);if(!
|
||||
DATARMNET3f85732c70){DATARMNET17f6bc1be5(DATARMNET0e6bd55b8b);goto
|
||||
DATARMNETc1174a0f45;}if(DATARMNET3f85732c70->dev!=DATARMNET543491eb0f->dev||!
|
||||
DATARMNET3f85732c70->dev->header_ops){DATARMNET17f6bc1be5(DATARMNET64aecaa865);
|
||||
neigh_release(DATARMNET3f85732c70);goto DATARMNETc1174a0f45;}DATARMNET268a8314cf
|
||||
=neigh_resolve_output(DATARMNET3f85732c70,DATARMNET543491eb0f);neigh_release(
|
||||
DATARMNET3f85732c70);if(likely(DATARMNET268a8314cf==NET_XMIT_SUCCESS||
|
||||
DATARMNET268a8314cf==NET_XMIT_CN)){DATARMNET17f6bc1be5(DATARMNETc1b437465b);}
|
||||
else{DATARMNET17f6bc1be5(DATARMNET43a65c0be7);}return RX_HANDLER_CONSUMED;}else
|
||||
if(DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6))
|
||||
&&DATARMNET1a901c3d09==DATARMNET9bfbc31cd6){struct ipv6hdr*DATARMNETbf55123e5b,
|
||||
DATARMNETcf1d9e2c1e;struct net_device*DATARMNET813ca18d06=NULL;struct flowi6
|
||||
DATARMNET8fbe36a2fa={};struct neighbour*DATARMNET3f85732c70;struct dst_entry*dst
|
||||
;int DATARMNET268a8314cf=(0xd2d+202-0xdf7);DATARMNETbf55123e5b=
|
||||
skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*
|
||||
DATARMNETbf55123e5b),&DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b){
|
||||
DATARMNET17f6bc1be5(DATARMNET72f4fdd48a);goto DATARMNETc1174a0f45;}
|
||||
DATARMNET813ca18d06=dev_get_by_name_rcu(&init_net,DATARMNET934406764d());if(!
|
||||
DATARMNET813ca18d06){DATARMNET17f6bc1be5(DATARMNET9cff15f94d);goto
|
||||
DATARMNETc1174a0f45;}DATARMNET543491eb0f->dev=DATARMNET813ca18d06;memcpy(&
|
||||
DATARMNET8fbe36a2fa.saddr,&DATARMNETbf55123e5b->saddr,sizeof(struct in6_addr));
|
||||
memcpy(&DATARMNET8fbe36a2fa.daddr,&DATARMNETbf55123e5b->daddr,sizeof(struct
|
||||
in6_addr));DATARMNET8fbe36a2fa.flowi6_oif=DATARMNET813ca18d06->ifindex;
|
||||
DATARMNET8fbe36a2fa.flowi6_flags=FLOWI_FLAG_KNOWN_NH;dst=ipv6_stub->
|
||||
ipv6_dst_lookup_flow(&init_net,NULL,&DATARMNET8fbe36a2fa,NULL);if(IS_ERR(dst)){
|
||||
DATARMNET17f6bc1be5(DATARMNETbf6e6853f9);goto DATARMNETc1174a0f45;}
|
||||
DATARMNET3f85732c70=dst_neigh_lookup(dst,&DATARMNET8fbe36a2fa.daddr);dst_release
|
||||
(dst);if(!DATARMNET3f85732c70){DATARMNET17f6bc1be5(DATARMNETa0da722329);goto
|
||||
DATARMNETc1174a0f45;}if(DATARMNET3f85732c70->dev!=DATARMNET543491eb0f->dev||!
|
||||
DATARMNET3f85732c70->dev->header_ops){DATARMNET17f6bc1be5(DATARMNET729e252fb9);
|
||||
neigh_release(DATARMNET3f85732c70);goto DATARMNETc1174a0f45;}DATARMNET268a8314cf
|
||||
=neigh_resolve_output(DATARMNET3f85732c70,DATARMNET543491eb0f);neigh_release(
|
||||
DATARMNET3f85732c70);if(likely(DATARMNET268a8314cf==NET_XMIT_SUCCESS||
|
||||
DATARMNET268a8314cf==NET_XMIT_CN)){DATARMNET17f6bc1be5(DATARMNET04311361a2);}
|
||||
else{DATARMNET17f6bc1be5(DATARMNET13bbe5f5c5);}return RX_HANDLER_CONSUMED;}else
|
||||
if(DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IP))&&
|
||||
DATARMNET1a901c3d09==DATARMNET45ee632553){struct iphdr*DATARMNET86f1f2cdc9,
|
||||
DATARMNETbf6548198e;struct net_device*DATARMNET813ca18d06=NULL;struct flowi4
|
||||
DATARMNET099aa93adc={};struct dst_entry*DATARMNETb5af46179c;struct rtable*
|
||||
DATARMNET066b8bd537;struct net_device*DATARMNET39542b437e=NULL;
|
||||
DATARMNET86f1f2cdc9=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
|
||||
sizeof(*DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9){
|
||||
DATARMNET17f6bc1be5(DATARMNET7803c877c0);goto DATARMNETc1174a0f45;}
|
||||
DATARMNET813ca18d06=dev_get_by_name_rcu(&init_net,DATARMNETe447822105());if(!
|
||||
DATARMNET813ca18d06){DATARMNET17f6bc1be5(DATARMNET0978ff973f);goto
|
||||
DATARMNETc1174a0f45;}memcpy(&DATARMNET099aa93adc.daddr,&DATARMNET86f1f2cdc9->
|
||||
daddr,sizeof(__be32));DATARMNET099aa93adc.flowi4_oif=DATARMNET813ca18d06->
|
||||
ifindex;DATARMNET099aa93adc.flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537
|
||||
=ip_route_output_key(&init_net,&DATARMNET099aa93adc);if(IS_ERR(
|
||||
DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET666fc9a664);
|
||||
DATARMNET39542b437e=dev_get_by_name_rcu(&init_net,"dummy0");if(!
|
||||
DATARMNET39542b437e){DATARMNET17f6bc1be5(DATARMNET521b065310);goto
|
||||
DATARMNETc1174a0f45;}DATARMNET099aa93adc.flowi4_oif=DATARMNET39542b437e->ifindex
|
||||
;DATARMNET099aa93adc.flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537=
|
||||
ip_route_output_key(&init_net,&DATARMNET099aa93adc);if(IS_ERR(
|
||||
DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET8a15bcdcc7);goto
|
||||
DATARMNETc1174a0f45;}}memcpy(&DATARMNET099aa93adc.saddr,&DATARMNET86f1f2cdc9->
|
||||
saddr,sizeof(__be32));DATARMNETb5af46179c=xfrm_lookup(&init_net,&
|
||||
DATARMNET066b8bd537->dst,flowi4_to_flowi(&DATARMNET099aa93adc),NULL,
|
||||
(0xd2d+202-0xdf7));DATARMNET066b8bd537=(struct rtable*)DATARMNETb5af46179c;if(
|
||||
IS_ERR(DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNETddb1bc27cb);goto
|
||||
DATARMNETc1174a0f45;}skb_dst_set(DATARMNET543491eb0f,DATARMNETb5af46179c);
|
||||
dst_output(&init_net,NULL,DATARMNET543491eb0f);DATARMNET17f6bc1be5(
|
||||
DATARMNETc730640bf7);return RX_HANDLER_CONSUMED;}else if(DATARMNET543491eb0f->
|
||||
dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6))&&DATARMNET1a901c3d09==
|
||||
DATARMNET45ee632553){struct ipv6hdr*DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;
|
||||
struct flowi6 DATARMNET8fbe36a2fa={};struct dst_entry*dst=NULL,*
|
||||
DATARMNETb5af46179c;struct rtable*DATARMNET066b8bd537;struct net_device*
|
||||
DATARMNET39542b437e=NULL;DATARMNETbf55123e5b=skb_header_pointer(
|
||||
DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*DATARMNETbf55123e5b),&
|
||||
DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b){DATARMNET17f6bc1be5(
|
||||
DATARMNET0b9541c9b3);goto DATARMNETc1174a0f45;}memcpy(&DATARMNET8fbe36a2fa.saddr
|
||||
,&DATARMNETbf55123e5b->saddr,sizeof(struct in6_addr));memcpy(&
|
||||
DATARMNET8fbe36a2fa.daddr,&DATARMNETbf55123e5b->daddr,sizeof(struct in6_addr));
|
||||
dst=ipv6_stub->ipv6_dst_lookup_flow(&init_net,NULL,&DATARMNET8fbe36a2fa,NULL);if
|
||||
(IS_ERR(dst)){DATARMNET17f6bc1be5(DATARMNET0078f1d36d);DATARMNET39542b437e=
|
||||
dev_get_by_name_rcu(&init_net,"\x64\x75\x6d\x6d\x79\x30");if(!
|
||||
DATARMNET39542b437e){DATARMNET17f6bc1be5(DATARMNET7c6c30b7d2);goto
|
||||
DATARMNETc1174a0f45;}DATARMNET8fbe36a2fa.flowi6_oif=DATARMNET39542b437e->ifindex
|
||||
;DATARMNET8fbe36a2fa.flowi6_flags=FLOWI_FLAG_KNOWN_NH;dst=ipv6_stub->
|
||||
ipv6_dst_lookup_flow(&init_net,NULL,&DATARMNET8fbe36a2fa,NULL);if(IS_ERR(dst)){
|
||||
DATARMNET17f6bc1be5(DATARMNET39d80cc483);goto DATARMNETc1174a0f45;}}
|
||||
DATARMNETb5af46179c=xfrm_lookup(&init_net,dst,flowi6_to_flowi(&
|
||||
DATARMNET8fbe36a2fa),NULL,(0xd2d+202-0xdf7));DATARMNET066b8bd537=(struct rtable*
|
||||
)DATARMNETb5af46179c;if(IS_ERR(DATARMNET066b8bd537)){DATARMNET17f6bc1be5(
|
||||
DATARMNET661bdeccd4);goto DATARMNETc1174a0f45;}skb_dst_set(DATARMNET543491eb0f,
|
||||
DATARMNETb5af46179c);dst_output(&init_net,NULL,DATARMNET543491eb0f);
|
||||
DATARMNET17f6bc1be5(DATARMNET28e7704d13);return RX_HANDLER_CONSUMED;}else if(
|
||||
DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IP))&&
|
||||
DATARMNET1a901c3d09==DATARMNET356f2a237e){struct iphdr*DATARMNET86f1f2cdc9,
|
||||
DATARMNETbf6548198e;struct flowi4 DATARMNET099aa93adc={};struct net_device*
|
||||
DATARMNET813ca18d06=NULL;struct dst_entry*DATARMNETb5af46179c;struct net_device*
|
||||
DATARMNET39542b437e=NULL;struct rtable*DATARMNET066b8bd537;DATARMNET86f1f2cdc9=
|
||||
skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*
|
||||
DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9){
|
||||
DATARMNET17f6bc1be5(DATARMNET15454f969d);goto DATARMNETc1174a0f45;}
|
||||
DATARMNET813ca18d06=dev_get_by_name_rcu(&init_net,DATARMNET934406764d());if(!
|
||||
DATARMNET813ca18d06){DATARMNET17f6bc1be5(DATARMNET4c5aeeb476);goto
|
||||
DATARMNETc1174a0f45;}memcpy(&DATARMNET099aa93adc.daddr,&DATARMNET86f1f2cdc9->
|
||||
daddr,sizeof(__be32));DATARMNET099aa93adc.flowi4_oif=DATARMNET813ca18d06->
|
||||
ifindex;DATARMNET099aa93adc.flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537
|
||||
=ip_route_output_key(&init_net,&DATARMNET099aa93adc);if(IS_ERR(
|
||||
DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET9bdb1c4072);
|
||||
DATARMNET39542b437e=dev_get_by_name_rcu(&init_net,"\x64\x75\x6d\x6d\x79\x30");if
|
||||
(!DATARMNET39542b437e){DATARMNET17f6bc1be5(DATARMNET5abdc89190);goto
|
||||
DATARMNETc1174a0f45;}DATARMNET099aa93adc.flowi4_oif=DATARMNET39542b437e->ifindex
|
||||
;DATARMNET099aa93adc.flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537=
|
||||
ip_route_output_key(&init_net,&DATARMNET099aa93adc);if(IS_ERR(
|
||||
DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET101af46c1c);goto
|
||||
DATARMNETc1174a0f45;}}memcpy(&DATARMNET099aa93adc.saddr,&DATARMNET86f1f2cdc9->
|
||||
saddr,sizeof(__be32));DATARMNETb5af46179c=xfrm_lookup(&init_net,&
|
||||
DATARMNET066b8bd537->dst,flowi4_to_flowi(&DATARMNET099aa93adc),NULL,
|
||||
(0xd2d+202-0xdf7));DATARMNET066b8bd537=(struct rtable*)DATARMNETb5af46179c;if(
|
||||
IS_ERR(DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET9a57ef32d3);goto
|
||||
DATARMNETc1174a0f45;}skb_dst_set(DATARMNET543491eb0f,DATARMNETb5af46179c);
|
||||
dst_output(&init_net,NULL,DATARMNET543491eb0f);DATARMNET17f6bc1be5(
|
||||
DATARMNET9a940d93dc);return RX_HANDLER_CONSUMED;}else if(DATARMNET543491eb0f->
|
||||
dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6))&&DATARMNET1a901c3d09==
|
||||
DATARMNET356f2a237e){struct ipv6hdr*DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;
|
||||
struct flowi6 DATARMNET8fbe36a2fa={};struct dst_entry*dst=NULL,*
|
||||
DATARMNETb5af46179c;struct rtable*DATARMNET066b8bd537;struct net_device*
|
||||
DATARMNET39542b437e=NULL;DATARMNETbf55123e5b=skb_header_pointer(
|
||||
DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*DATARMNETbf55123e5b),&
|
||||
DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b){DATARMNET17f6bc1be5(
|
||||
DATARMNET6b0ed53aab);goto DATARMNETc1174a0f45;}memcpy(&DATARMNET8fbe36a2fa.saddr
|
||||
,&DATARMNETbf55123e5b->saddr,sizeof(struct in6_addr));memcpy(&
|
||||
DATARMNET8fbe36a2fa.daddr,&DATARMNETbf55123e5b->daddr,sizeof(struct in6_addr));
|
||||
dst=ipv6_stub->ipv6_dst_lookup_flow(&init_net,NULL,&DATARMNET8fbe36a2fa,NULL);if
|
||||
(IS_ERR(dst)){DATARMNET17f6bc1be5(DATARMNET22ac945cae);DATARMNET39542b437e=
|
||||
dev_get_by_name_rcu(&init_net,"\x64\x75\x6d\x6d\x79\x30");if(!
|
||||
DATARMNET39542b437e){DATARMNET17f6bc1be5(DATARMNETf326b7c906);goto
|
||||
DATARMNETc1174a0f45;}DATARMNET8fbe36a2fa.flowi6_oif=DATARMNET39542b437e->ifindex
|
||||
;DATARMNET8fbe36a2fa.flowi6_flags=FLOWI_FLAG_KNOWN_NH;dst=ipv6_stub->
|
||||
ipv6_dst_lookup_flow(&init_net,NULL,&DATARMNET8fbe36a2fa,NULL);if(IS_ERR(dst)){
|
||||
DATARMNET17f6bc1be5(DATARMNET544d78ede7);goto DATARMNETc1174a0f45;}}
|
||||
DATARMNETb5af46179c=xfrm_lookup(&init_net,dst,flowi6_to_flowi(&
|
||||
DATARMNET8fbe36a2fa),NULL,(0xd2d+202-0xdf7));DATARMNET066b8bd537=(struct rtable*
|
||||
)DATARMNETb5af46179c;if(IS_ERR(DATARMNET066b8bd537)){DATARMNET17f6bc1be5(
|
||||
DATARMNET97b44d0c09);goto DATARMNETc1174a0f45;}skb_dst_set(DATARMNET543491eb0f,
|
||||
DATARMNETb5af46179c);dst_output(&init_net,NULL,DATARMNET543491eb0f);
|
||||
DATARMNET17f6bc1be5(DATARMNETf954265acb);return RX_HANDLER_CONSUMED;}
|
||||
DATARMNETc1174a0f45:kfree_skb(DATARMNET543491eb0f);return RX_HANDLER_CONSUMED;}
|
||||
static rx_handler_result_t DATARMNET68fe094884(struct sk_buff**
|
||||
DATARMNET89946cec52){struct DATARMNET0ca9d8ead7 DATARMNETa76763310b={};struct
|
||||
DATARMNET4f49486833*DATARMNET63b1a086d5;struct sk_buff*DATARMNET543491eb0f=*
|
||||
DATARMNET89946cec52;unsigned long DATARMNETfb0677cc3c;struct DATARMNET8d3c2559ca
|
||||
DATARMNET2d4b4cfc9e;struct DATARMNET41b426061d*DATARMNET8184934307;uint8_t
|
||||
DATARMNET1a901c3d09=DATARMNETdcafdec32a;if(!DATARMNET543491eb0f||
|
||||
DATARMNET543491eb0f->pkt_type==PACKET_LOOPBACK)return RX_HANDLER_PASS;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;DATARMNET2d4b4cfc9e.
|
||||
DATARMNET0dc14167a1=DATARMNET86f1f2cdc9->saddr;DATARMNET2d4b4cfc9e.
|
||||
DATARMNET0d956cc77a=(0xd11+230-0xdf3);}else if(DATARMNET543491eb0f->protocol==
|
||||
htons(ETH_P_IPV6)){struct ipv6hdr*DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;
|
||||
DATARMNETbf55123e5b=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
|
||||
sizeof(*DATARMNETbf55123e5b),&DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b)goto
|
||||
DATARMNETbf4095f79e;memcpy(&DATARMNET2d4b4cfc9e.DATARMNET5700daac01,&
|
||||
DATARMNETbf55123e5b->saddr,sizeof(DATARMNET2d4b4cfc9e.DATARMNET5700daac01));
|
||||
DATARMNET2d4b4cfc9e.DATARMNET0d956cc77a=(0xd03+244-0xdf1);}else{goto
|
||||
DATARMNETbf4095f79e;}rcu_read_lock();DATARMNET8184934307=DATARMNETcc0a01df2a(&
|
||||
DATARMNET2d4b4cfc9e);rcu_read_unlock();if(!DATARMNET8184934307)goto
|
||||
DATARMNETbf4095f79e;DATARMNET1a901c3d09=DATARMNET8184934307->DATARMNET7ed5754a5c
|
||||
.DATARMNET9954a624ac;if(DATARMNET1a901c3d09==DATARMNETdcafdec32a)goto
|
||||
DATARMNETbf4095f79e;if(DATARMNET543491eb0f->dev)nf_ct_set(DATARMNET543491eb0f,
|
||||
NULL,IP_CT_UNTRACKED);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_TCP)goto
|
||||
DATARMNET9b3d23a43b;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_TCP)goto DATARMNET9b3d23a43b;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(DATARMNET63b1a086d5->DATARMNET1717afebc7)continue;if(!
|
||||
DATARMNET5f3c9ed4da(&DATARMNET63b1a086d5->DATARMNET54338da2ff,&
|
||||
DATARMNETa76763310b))continue;DATARMNET63b1a086d5->DATARMNET763f2e5fac=jiffies;
|
||||
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=&
|
||||
DATARMNET8184934307->DATARMNET7ed5754a5c;hash_add_rcu(DATARMNET5413d6f8ec,&
|
||||
DATARMNET63b1a086d5->DATARMNETe8608dd267,DATARMNETa76763310b.DATARMNET2cb607d686
|
||||
);if(!DATARMNETf658004dbc){unsigned long DATARMNETf71ef1b8da;DATARMNETf71ef1b8da
|
||||
=msecs_to_jiffies(DATARMNET4d011802ef);schedule_delayed_work(&
|
||||
DATARMNET0b04fde883.DATARMNET190b4452e8,DATARMNETf71ef1b8da);}
|
||||
DATARMNETf658004dbc++;spin_unlock_irqrestore(&DATARMNET820642743b,
|
||||
DATARMNETfb0677cc3c);DATARMNETbf4095f79e:return DATARMNETc9ed97754a(
|
||||
DATARMNET543491eb0f,DATARMNET1a901c3d09);DATARMNET9b3d23a43b:DATARMNET7ca470d54b
|
||||
(DATARMNET543491eb0f,TCP_FLAG_SYN);return DATARMNETc9ed97754a(
|
||||
DATARMNET543491eb0f,DATARMNET1a901c3d09);}struct DATARMNET8d3c2559ca*
|
||||
DATARMNET07f0e0f286(struct DATARMNET0ca9d8ead7*DATARMNET54338da2ff)__must_hold(
|
||||
RCU){struct DATARMNET4f49486833*DATARMNET63b1a086d5;hash_for_each_possible_rcu(
|
||||
DATARMNET5413d6f8ec,DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNET54338da2ff
|
||||
->DATARMNET2cb607d686){if(DATARMNET63b1a086d5->DATARMNET1717afebc7)continue;if(!
|
||||
DATARMNET5f3c9ed4da(&DATARMNET63b1a086d5->DATARMNET54338da2ff,
|
||||
DATARMNET54338da2ff))continue;return DATARMNET63b1a086d5->DATARMNET7ed5754a5c;}
|
||||
return NULL;}void DATARMNETf4e1a29dbc(void){cancel_delayed_work_sync(&
|
||||
DATARMNET0b04fde883.DATARMNET190b4452e8);DATARMNET0b04fde883.DATARMNETcd94e0d3c7
|
||||
=true;schedule_delayed_work(&DATARMNET0b04fde883.DATARMNET190b4452e8,
|
||||
(0xd2d+202-0xdf7));cancel_delayed_work_sync(&DATARMNET0b04fde883.
|
||||
DATARMNET190b4452e8);}void DATARMNET6f73df41cd(struct sk_buff*
|
||||
DATARMNET543491eb0f){int protocol=-(0xd26+209-0xdf6);struct DATARMNETe117226f58*
|
||||
DATARMNET3396919a68=rcu_dereference(DATARMNETcde6e442f5);if(!DATARMNET3396919a68
|
||||
)return;if(DATARMNET543491eb0f->protocol==htons(ETH_P_IP)){struct iphdr*
|
||||
DATARMNET86f1f2cdc9,DATARMNETbf6548198e;DATARMNET86f1f2cdc9=skb_header_pointer(
|
||||
DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*DATARMNET86f1f2cdc9),&
|
||||
DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9)return;if(DATARMNET86f1f2cdc9->
|
||||
version!=DATARMNET3396919a68->DATARMNET0d956cc77a&&DATARMNET86f1f2cdc9->saddr!=
|
||||
DATARMNET3396919a68->DATARMNETdfe430c2d6&&DATARMNET86f1f2cdc9->daddr!=
|
||||
DATARMNET3396919a68->DATARMNET2cb607d686)return;protocol=DATARMNET86f1f2cdc9->
|
||||
protocol;}else if(DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6)){struct
|
||||
ipv6hdr*DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;DATARMNETbf55123e5b=
|
||||
skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*
|
||||
DATARMNETbf55123e5b),&DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b)return;if(
|
||||
DATARMNETbf55123e5b->version!=DATARMNET3396919a68->DATARMNET0d956cc77a&&
|
||||
ipv6_addr_cmp(&DATARMNETbf55123e5b->saddr,&DATARMNET3396919a68->
|
||||
DATARMNET815cbb4bf5)&&ipv6_addr_cmp(&DATARMNETbf55123e5b->daddr,&
|
||||
DATARMNET3396919a68->DATARMNETc3f31215b7))return;protocol=DATARMNETbf55123e5b->
|
||||
nexthdr;}if(protocol==IPPROTO_UDP){if(udp_hdr(DATARMNET543491eb0f)->source==
|
||||
DATARMNET3396919a68->DATARMNET08e913477e&&udp_hdr(DATARMNET543491eb0f)->dest==
|
||||
DATARMNET3396919a68->DATARMNETda7f7fa492)goto DATARMNET9573fcc9c6;}return;
|
||||
DATARMNET9573fcc9c6:DATARMNET543491eb0f->priority=2607612160;DATARMNET5ca94dbc3c
|
||||
(DATARMNETc2cade1d75);}static rx_handler_result_t DATARMNETd2f80b03ce(struct
|
||||
sk_buff**DATARMNET89946cec52){struct net_device*DATARMNET00dcb79bc4;if(!
|
||||
DATARMNET89946cec52||!(*DATARMNET89946cec52)||!(*DATARMNET89946cec52)->dev)
|
||||
return RX_HANDLER_PASS;DATARMNET00dcb79bc4=(*DATARMNET89946cec52)->dev;if(!
|
||||
DATARMNETaba2beb199(DATARMNET00dcb79bc4->name,
|
||||
"\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61",(0xd19+238-0xdfb)))return
|
||||
DATARMNET68fe094884(DATARMNET89946cec52);if(!DATARMNETaba2beb199(
|
||||
DATARMNET00dcb79bc4->name,DATARMNETe447822105(),IFNAMSIZ))return
|
||||
DATARMNET37a92021f9(DATARMNET89946cec52);if(!DATARMNETaba2beb199(
|
||||
DATARMNET00dcb79bc4->name,DATARMNET934406764d(),IFNAMSIZ))return
|
||||
DATARMNET37a92021f9(DATARMNET89946cec52);return RX_HANDLER_PASS;}static const
|
||||
struct rmnet_module_hook_register_info DATARMNET1928843de7[]={{.hooknum=
|
||||
RMNET_MODULE_HOOK_WLAN_FLOW_MATCH,.func=DATARMNET6f73df41cd,},{.hooknum=
|
||||
RMNET_MODULE_HOOK_WLAN_INGRESS_RX_HANDLER,.func=DATARMNETd2f80b03ce,},};void
|
||||
DATARMNET333c107558(void){rcu_assign_pointer(rmnet_wlan_ll_tuple_hook,
|
||||
DATARMNET6f73df41cd);rmnet_module_hook_register(DATARMNET1928843de7,ARRAY_SIZE(
|
||||
DATARMNET1928843de7));}void DATARMNET4c08c7210c(void){rcu_assign_pointer(
|
||||
rmnet_wlan_ll_tuple_hook,NULL);rmnet_module_hook_unregister(DATARMNET1928843de7,
|
||||
ARRAY_SIZE(DATARMNET1928843de7));}int DATARMNET9f106ed933(void){
|
||||
INIT_DELAYED_WORK(&DATARMNET0b04fde883.DATARMNET190b4452e8,DATARMNET8211acc766);
|
||||
return(0xd2d+202-0xdf7);}int DATARMNETf56cbaa2b1(void){DATARMNETf4e1a29dbc();
|
||||
return(0xd2d+202-0xdf7);}
|
Reference in New Issue
Block a user