|
@@ -1,5 +1,6 @@
|
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
|
/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
|
|
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
|
*
|
|
|
* RMNET WLAN handler framework
|
|
|
*
|
|
@@ -37,6 +38,7 @@ DATARMNET63a2b7773e);static DEFINE_HASHTABLE(DATARMNET1903907456,
|
|
|
DATARMNET6b4ac8224c);static DEFINE_MUTEX(DATARMNETf46fb02ac6);static
|
|
|
DEFINE_HASHTABLE(DATARMNET78ed39f13b,DATARMNET6b4ac8224c);static DEFINE_MUTEX(
|
|
|
DATARMNET954bef55d0);static DEFINE_HASHTABLE(DATARMNET133502ca0e,
|
|
|
+DATARMNET6b4ac8224c);static DEFINE_HASHTABLE(DATARMNET665d2f133f,
|
|
|
DATARMNET6b4ac8224c);static char DATARMNET30500ba48c[IFNAMSIZ];static bool
|
|
|
DATARMNET1e31b22eff(struct DATARMNETb89ecedefc*DATARMNETae0905b0b3,struct
|
|
|
DATARMNETb89ecedefc*DATARMNETdb49f21565){if(DATARMNETae0905b0b3->
|
|
@@ -180,9 +182,36 @@ DATARMNET63b1a086d5->DATARMNETe8608dd267);kfree_rcu(DATARMNET63b1a086d5,
|
|
|
DATARMNET28bfe9e6ad);DATARMNET5ca94dbc3c(DATARMNETb7c9f010b2);return
|
|
|
(0xd2d+202-0xdf7);}}GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
|
|
"\x4e\x6f\x20\x73\x75\x63\x68\x20\x70\x6f\x72\x74\x20\x76\x61\x6c\x75\x65");
|
|
|
-return-ESRCH;}static void DATARMNET1f36d4813c(void){struct DATARMNETda06413d0d*
|
|
|
-DATARMNET63b1a086d5;struct hlist_node*DATARMNET0386f6f82a;int
|
|
|
-DATARMNET5c2fd31d7b;mutex_lock(&DATARMNET954bef55d0);hash_for_each_safe(
|
|
|
+return-ESRCH;}static bool DATARMNETa96214b53c(__be16 DATARMNETf0d9de7e2f)
|
|
|
+__must_hold(RCU){struct DATARMNETda06413d0d*DATARMNET63b1a086d5;
|
|
|
+hash_for_each_possible_rcu(DATARMNET665d2f133f,DATARMNET63b1a086d5,
|
|
|
+DATARMNETe8608dd267,DATARMNETf0d9de7e2f){if(DATARMNET63b1a086d5->
|
|
|
+DATARMNETf0d9de7e2f==DATARMNETf0d9de7e2f)return true;}return false;}int
|
|
|
+DATARMNET59b8376224(__be16 DATARMNETf0d9de7e2f,struct genl_info*
|
|
|
+DATARMNET54338da2ff)__must_hold(&DATARMNET954bef55d0){struct DATARMNETda06413d0d
|
|
|
+*DATARMNET63b1a086d5;struct hlist_node*DATARMNET0386f6f82a;
|
|
|
+hash_for_each_possible_safe(DATARMNET665d2f133f,DATARMNET63b1a086d5,
|
|
|
+DATARMNET0386f6f82a,DATARMNETe8608dd267,DATARMNETf0d9de7e2f){if(
|
|
|
+DATARMNET63b1a086d5->DATARMNETf0d9de7e2f==DATARMNETf0d9de7e2f){hash_del_rcu(&
|
|
|
+DATARMNET63b1a086d5->DATARMNETe8608dd267);kfree_rcu(DATARMNET63b1a086d5,
|
|
|
+DATARMNET28bfe9e6ad);DATARMNET5ca94dbc3c(DATARMNETa726eebea4);return
|
|
|
+(0xd2d+202-0xdf7);}}return(0xd2d+202-0xdf7);}int DATARMNET0b12e969c5(__be16
|
|
|
+DATARMNETf0d9de7e2f,struct genl_info*DATARMNET54338da2ff)__must_hold(&
|
|
|
+DATARMNET954bef55d0){struct DATARMNETda06413d0d*DATARMNET63b1a086d5;
|
|
|
+rcu_read_lock();if(DATARMNETa96214b53c(DATARMNETf0d9de7e2f)){rcu_read_unlock();
|
|
|
+GENL_SET_ERR_MSG(DATARMNET54338da2ff,
|
|
|
+"\x45\x6e\x63\x61\x70\x20\x70\x6f\x72\x74\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\x65\x6e\x63\x61\x70\x20\x70\x6f\x72\x74\x20\x6d\x65\x6d\x6f\x72\x79"
|
|
|
+);return-ENOMEM;}DATARMNET63b1a086d5->DATARMNETf0d9de7e2f=DATARMNETf0d9de7e2f;
|
|
|
+INIT_HLIST_NODE(&DATARMNET63b1a086d5->DATARMNETe8608dd267);hash_add_rcu(
|
|
|
+DATARMNET665d2f133f,&DATARMNET63b1a086d5->DATARMNETe8608dd267,
|
|
|
+DATARMNETf0d9de7e2f);DATARMNET5ca94dbc3c(DATARMNET990edaea89);return
|
|
|
+(0xd2d+202-0xdf7);}static void DATARMNET1f36d4813c(void){struct
|
|
|
+DATARMNETda06413d0d*DATARMNET63b1a086d5;struct hlist_node*DATARMNET0386f6f82a;
|
|
|
+int DATARMNET5c2fd31d7b;mutex_lock(&DATARMNET954bef55d0);hash_for_each_safe(
|
|
|
DATARMNET133502ca0e,DATARMNET5c2fd31d7b,DATARMNET0386f6f82a,DATARMNET63b1a086d5,
|
|
|
DATARMNETe8608dd267){hash_del_rcu(&DATARMNET63b1a086d5->DATARMNETe8608dd267);
|
|
|
kfree_rcu(DATARMNET63b1a086d5,DATARMNET28bfe9e6ad);}mutex_unlock(&
|
|
@@ -236,10 +265,12 @@ 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.
|
|
|
+DATARMNET611d08d671)){if(DATARMNET0a4704e5e0(&DATARMNET3396919a68)){kfree_skb(
|
|
|
+DATARMNET543491eb0f);DATARMNET1dec89a127=RX_HANDLER_CONSUMED;DATARMNET5ca94dbc3c
|
|
|
+(DATARMNET0981317411);goto DATARMNETbf4095f79e;}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(
|
|
@@ -427,7 +458,9 @@ 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
|
|
|
+DATARMNETdf2dbc641f)return false;return!!(*DATARMNETdf2dbc641f);}bool
|
|
|
+DATARMNET0a4704e5e0(struct DATARMNETb89ecedefc*DATARMNET3396919a68){return
|
|
|
+DATARMNETa96214b53c(DATARMNET3396919a68->DATARMNETf0d9de7e2f);}int
|
|
|
DATARMNET078f6bd384(void){DATARMNETbb4efa5b3d();return(0xd2d+202-0xdf7);}void
|
|
|
DATARMNETfae36afa03(void){DATARMNETbb4efa5b3d();}char*DATARMNET934406764d(void){
|
|
|
return DATARMNET30500ba48c;}
|