Browse Source

rmnet_aps: 1.0

rmnet_aps version 1.0.

Change-Id: I71412c591236da71eecff26cf2d1a1c29f6681b4
Signed-off-by: Weiyi Chen <[email protected]>
Weiyi Chen 3 years ago
parent
commit
5ef29f8984

+ 34 - 0
aps/Android.mk

@@ -0,0 +1,34 @@
+ifneq ($(TARGET_BOARD_AUTO),true)
+ifneq ($(TARGET_BOARD_PLATFORM),qssi)
+
+RMNET_APS_DLKM_PLATFORMS_LIST := taro
+RMNET_APS_DLKM_PLATFORMS_LIST += kalama
+
+ifeq ($(call is-board-platform-in-list, $(RMNET_APS_DLKM_PLATFORMS_LIST)),true)
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := rmnet_aps.ko
+LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT)
+LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/**/*) $(wildcard $(LOCAL_PATH)/*)
+
+DATARMNET_CORE_PATH := datarmnet/core
+RMNET_CORE_PATH := vendor/qcom/opensource/$(DATARMNET_CORE_PATH)
+DLKM_DIR := $(TOP)/device/qcom/common/dlkm
+RMNET_CORE_INC_DIR := $(abspath $(RMNET_CORE_PATH))
+
+KBUILD_OPTIONS := RMNET_CORE_INC_DIR=$(RMNET_CORE_INC_DIR)
+KBUILD_OPTIONS += RMNET_CORE_PATH=$(RMNET_CORE_PATH)
+KBUILD_OPTIONS += DATARMNET_CORE_PATH=$(DATARMNET_CORE_PATH)
+KBUILD_OPTIONS_GKI := RMNET_CORE_INC_DIR=$(RMNET_CORE_INC_DIR)
+KBUILD_OPTIONS_GKI += RMNET_CORE_PATH=$(RMNET_CORE_PATH)/gki
+
+#Must be built after the core rmnet module
+LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/DLKM_OBJ/$(RMNET_CORE_PATH)/rmnet_core.ko
+LOCAL_ADDITIONAL_DEPENDENCIES_GKI := $(TARGET_OUT_INTERMEDIATES)/DLKM_OBJ/$(RMNET_CORE_PATH)/gki/rmnet_core.ko
+
+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

+ 6 - 0
aps/Kbuild

@@ -0,0 +1,6 @@
+obj-m += rmnet_aps.o
+ccflags-y := -I$(RMNET_CORE_INC_DIR) \
+             $(call cc-option,-Wno-misleading-indentation)
+rmnet_aps-y := \
+        rmnet_aps_main.o \
+	rmnet_aps_genl.o

+ 9 - 0
aps/Kconfig

@@ -0,0 +1,9 @@
+#
+# RMNET_APS drivers
+#
+
+menuconfig RMNET_APS
+    tristate "Rmnet APS support"
+    default m
+    ---help---
+        Apps prioritization module for RmNet driver

+ 16 - 0
aps/Makefile

@@ -0,0 +1,16 @@
+#By default build for CLD
+RMNET_APS_SELECT := CONFIG_RMNET_APS=m
+KBUILD_OPTIONS += $(RMNET_APS_SELECT)
+KBUILD_OPTIONS += $(KBUILD_EXTRA) # Extra config if any
+KBUILD_EXTRA_SYMBOLS := $(M)/../../$(DATARMNET_CORE_PATH)/Module.symvers
+
+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

+ 28 - 0
aps/rmnet_aps.h

@@ -0,0 +1,28 @@
+/* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef DATARMNETa70542332d
+#define DATARMNETa70542332d
+#include <linux/skbuff.h>
+#include <net/genetlink.h>
+#ifdef DATARMNETd7ef88d6df
+#define DATARMNET112d724eff(...) pr_err(__VA_ARGS__)
+#else
+#define DATARMNET112d724eff(...)
+#endif
+struct DATARMNET5d4139d9d7{u32 cmd;u32 DATARMNETbb588401ec;u32 
+DATARMNET655f822a62;u32 ifindex;u8 DATARMNET6c2cba039d;u8 DATARMNET626c626b74;u8
+ DATARMNET40bb1d945b;u8 DATARMNETecca9147fd;};struct DATARMNETca79857d4a{u32 cmd
+;u32 DATARMNETe65883bfce;u32 DATARMNETbb588401ec;};int DATARMNET37a9efbbcb(
+struct sk_buff*DATARMNETaafc1d9519,struct genl_info*DATARMNET54338da2ff);
+#endif 
+

+ 32 - 0
aps/rmnet_aps_genl.c

@@ -0,0 +1,32 @@
+/* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include "rmnet_aps_genl.h"
+#include "rmnet_aps.h"
+static struct nla_policy DATARMNET157d4c7a8a[DATARMNET3b044438b9+
+(0xd26+209-0xdf6)]={[DATARMNET98b93f2e86]=NLA_POLICY_EXACT_LEN(sizeof(struct 
+DATARMNET5d4139d9d7)),[DATARMNET818a0b6438]=NLA_POLICY_EXACT_LEN(sizeof(struct 
+DATARMNETca79857d4a)),};
+#define DATARMNET7dc6237681(DATARMNET5aeb0ef9bc, DATARMNETbd9859b58e)\
+                                         \
+	{                                                                      \
+		.cmd = DATARMNET5aeb0ef9bc, .doit = DATARMNETbd9859b58e, .dumpit = NULL, .\
+flags = (0xd2d+202-0xdf7),        \
+	}
+static const struct genl_ops DATARMNET27a52625e4[]={DATARMNET7dc6237681(
+DATARMNET15437be67e,DATARMNET37a9efbbcb),};struct genl_family 
+DATARMNETcdba30eca9={.hdrsize=(0xd2d+202-0xdf7),.name=DATARMNETa4a6e34e45,.
+version=DATARMNET33d1a3e23a,.maxattr=DATARMNET3b044438b9,.policy=
+DATARMNET157d4c7a8a,.ops=DATARMNET27a52625e4,.n_ops=ARRAY_SIZE(
+DATARMNET27a52625e4),};int DATARMNETcfa8d492f8(void){return genl_register_family
+(&DATARMNETcdba30eca9);}void DATARMNETca7606cfd1(void){genl_unregister_family(&
+DATARMNETcdba30eca9);}

+ 24 - 0
aps/rmnet_aps_genl.h

@@ -0,0 +1,24 @@
+/* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef DATARMNET975050c527
+#define DATARMNET975050c527
+#include <net/genetlink.h>
+#define DATARMNET33d1a3e23a (0xd26+209-0xdf6)
+#define DATARMNETa4a6e34e45 "\x52\x4d\x4e\x45\x54\x5f\x41\x50\x53"
+enum{DATARMNETeafde44f15,DATARMNET15437be67e,DATARMNET4ac82df478,};enum{
+DATARMNET900754429d,DATARMNET98b93f2e86,DATARMNET818a0b6438,DATARMNET074e71007e,
+};
+#define DATARMNET3b044438b9 (DATARMNET074e71007e - (0xd26+209-0xdf6))
+int DATARMNETcfa8d492f8(void);void DATARMNETca7606cfd1(void);
+#endif 
+

+ 289 - 0
aps/rmnet_aps_main.c

@@ -0,0 +1,289 @@
+/* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/timer.h>
+#include <linux/list_sort.h>
+#include <linux/workqueue.h>
+#include <linux/hashtable.h>
+#include <linux/netdevice.h>
+#include "rmnet_config.h"
+#include "rmnet_aps.h"
+#include "rmnet_aps_genl.h"
+#define DATARMNET63ff5c35c2 (0xd26+209-0xdf6)
+#define DATARMNETceae994093 (0xd1f+216-0xdf5)
+#define DATARMNET3412b803e1 (0xd18+223-0xdf4)
+#define DATARMNET1efd633004 (0xd11+230-0xdf3)
+#define DATARMNETdc217f1b29 (0xd0a+237-0xdf2)
+#define DATARMNETee209ff1f9 (0xd26+209-0xdf6)
+#define DATARMNET24e4186a83 (0xd1f+216-0xdf5)
+#define DATARMNET94016043b8 (0xd18+223-0xdf4)
+#define DATARMNET50dac65bef (0xd2d+202-0xdf7)
+#define DATARMNETe1763a8705 (0xbf7+4364-0x1c04)
+#define DATARMNET3bc5e7094a (0xd0a+237-0xdf2)
+#define DATARMNET810b8d04cd 55932
+#define DATARMNET7b5bbaa047 ((0xd18+223-0xdf4))
+#define DATARMNETfd026b105a (DATARMNET7b5bbaa047 * HZ)
+#define DATARMNET65d0d735fa ((0xdf7+6169-0x241c) * (0xdf7+2629-0x143c) * \
+(0xdf7+2629-0x143c) / (0xd35+210-0xdff) * DATARMNET7b5bbaa047)
+#define DATARMNETb8ab933cae ((0xc07+4861-0x1e3c) * (0xdf7+2629-0x143c) * \
+(0xdf7+2629-0x143c) / (0xd35+210-0xdff) * DATARMNET7b5bbaa047)
+static const char*DATARMNETe5ef0e617c="\x31\x2e\x30";static u16 
+DATARMNET2fe4661b82=DATARMNET810b8d04cd;static struct genl_info 
+DATARMNET7d98961cbe;static u32 DATARMNETfef55eaf9a;static u8 DATARMNET9628311a6b
+[DATARMNET3bc5e7094a]={(0xd2d+202-0xdf7),(0xd03+244-0xdf1),(0xcfc+267-0xe00),
+(0xd35+210-0xdff),9};static DEFINE_SPINLOCK(DATARMNET33bd4139f4);static 
+DEFINE_HASHTABLE(DATARMNET2ee773c365,(0xd0a+237-0xdf2));static LIST_HEAD(
+DATARMNET7520901fb5);struct DATARMNET6fd48c33f6{struct hlist_node hash_list;
+struct list_head DATARMNETed4d7b4a3c;struct DATARMNET5d4139d9d7 
+DATARMNET54338da2ff;u32 DATARMNET556cdfb5eb;u32 DATARMNETee01ad514b;unsigned 
+long expires;u64 DATARMNETa27e524d8a;bool DATARMNET626c626b74;bool 
+DATARMNET40bb1d945b;};extern void(*rmnet_aps_set_prio)(struct net_device*
+DATARMNET413e8dcf7b,struct sk_buff*DATARMNET543491eb0f);extern struct 
+genl_family DATARMNETcdba30eca9;static void DATARMNET30dd480cad(struct 
+net_device*DATARMNET413e8dcf7b,struct sk_buff*DATARMNET543491eb0f);static void 
+DATARMNET446f780f19(u32 DATARMNETbb588401ec,u8 DATARMNETf8bbe3b0fb);static void 
+DATARMNETf844db79d9(struct timer_list*DATARMNET6e4292679f);static DEFINE_TIMER(
+DATARMNETd21629e047,DATARMNETf844db79d9);static void DATARMNET5979020f87(struct 
+work_struct*DATARMNET33110a3ff5);static DECLARE_DELAYED_WORK(DATARMNET3481998252
+,DATARMNET5979020f87);static int DATARMNET998f6cbce7(struct notifier_block*
+DATARMNET272c159b3c,unsigned long DATARMNET9a4761f31c,void*DATARMNETaef95eabe8);
+static struct notifier_block DATARMNETc580548769 __read_mostly={.notifier_call=
+DATARMNET998f6cbce7,.priority=(0xd1f+216-0xdf5),};static struct 
+DATARMNET6fd48c33f6*DATARMNET3ed11fdc8d(u32 DATARMNETbb588401ec){struct 
+DATARMNET6fd48c33f6*DATARMNETaa568481cf;hash_for_each_possible(
+DATARMNET2ee773c365,DATARMNETaa568481cf,hash_list,DATARMNETbb588401ec){if(
+DATARMNETaa568481cf->DATARMNET54338da2ff.DATARMNETbb588401ec==
+DATARMNETbb588401ec)return DATARMNETaa568481cf;}return NULL;}static void 
+DATARMNET1e616c2160(struct DATARMNET6fd48c33f6*DATARMNETaa568481cf){hash_add(
+DATARMNET2ee773c365,&DATARMNETaa568481cf->hash_list,DATARMNETaa568481cf->
+DATARMNET54338da2ff.DATARMNETbb588401ec);list_add(&DATARMNETaa568481cf->
+DATARMNETed4d7b4a3c,&DATARMNET7520901fb5);DATARMNETfef55eaf9a++;if(
+DATARMNETaa568481cf->expires){if(!timer_pending(&DATARMNETd21629e047)||
+time_before(DATARMNETaa568481cf->expires,DATARMNETd21629e047.expires))mod_timer(
+&DATARMNETd21629e047,DATARMNETaa568481cf->expires);}if(DATARMNETfef55eaf9a==
+(0xd26+209-0xdf6))WRITE_ONCE(rmnet_aps_set_prio,DATARMNET30dd480cad);}static 
+void DATARMNET7fa3dd63cb(struct DATARMNET6fd48c33f6*DATARMNETaa568481cf){
+hash_del(&DATARMNETaa568481cf->hash_list);list_del(&DATARMNETaa568481cf->
+DATARMNETed4d7b4a3c);if(likely(DATARMNETfef55eaf9a))DATARMNETfef55eaf9a--;else 
+DATARMNET112d724eff("aps: flow count is aleady 0\n");if(!DATARMNETfef55eaf9a){
+WRITE_ONCE(rmnet_aps_set_prio,NULL);del_timer(&DATARMNETd21629e047);}kfree(
+DATARMNETaa568481cf);}static void DATARMNET9ac8a34003(void){struct 
+DATARMNET6fd48c33f6*DATARMNETaa568481cf,*DATARMNETaf503e06a5;struct hlist_node*
+DATARMNET0386f6f82a;int DATARMNET5c2fd31d7b;del_timer(&DATARMNETd21629e047);
+list_for_each_entry_safe(DATARMNETaa568481cf,DATARMNETaf503e06a5,&
+DATARMNET7520901fb5,DATARMNETed4d7b4a3c){list_del(&DATARMNETaa568481cf->
+DATARMNETed4d7b4a3c);}hash_for_each_safe(DATARMNET2ee773c365,DATARMNET5c2fd31d7b
+,DATARMNET0386f6f82a,DATARMNETaa568481cf,hash_list){hash_del(&
+DATARMNETaa568481cf->hash_list);kfree(DATARMNETaa568481cf);}DATARMNETfef55eaf9a=
+(0xd2d+202-0xdf7);WRITE_ONCE(rmnet_aps_set_prio,NULL);DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x61\x6c\x6c\x20\x66\x6c\x6f\x77\x73\x20\x72\x65\x6d\x6f\x76\x65\x64" "\n"
+);}static void DATARMNET250448eb06(int ifindex){struct DATARMNET6fd48c33f6*
+DATARMNETaa568481cf;struct hlist_node*DATARMNET0386f6f82a;int 
+DATARMNET5c2fd31d7b;hash_for_each_safe(DATARMNET2ee773c365,DATARMNET5c2fd31d7b,
+DATARMNET0386f6f82a,DATARMNETaa568481cf,hash_list){if(DATARMNETaa568481cf->
+DATARMNET54338da2ff.ifindex==ifindex){DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x66\x6c\x6f\x77\x20\x30\x78\x25\x78\x20\x64\x6f\x77\x6e" "\n"
+,DATARMNETaa568481cf->DATARMNET54338da2ff.DATARMNETbb588401ec);
+DATARMNET446f780f19(DATARMNETaa568481cf->DATARMNET54338da2ff.DATARMNETbb588401ec
+,DATARMNET24e4186a83);DATARMNET7fa3dd63cb(DATARMNETaa568481cf);}}}static void 
+DATARMNETf844db79d9(struct timer_list*DATARMNET6e4292679f){struct 
+DATARMNET6fd48c33f6*DATARMNETaa568481cf;struct hlist_node*DATARMNET0386f6f82a;
+unsigned long DATARMNET02dfdbc38d=jiffies;unsigned long DATARMNET2cf3deab22;int 
+DATARMNET5c2fd31d7b;u32 DATARMNETbb588401ec;DATARMNET2cf3deab22=
+DATARMNET02dfdbc38d;spin_lock_bh(&DATARMNET33bd4139f4);hash_for_each_safe(
+DATARMNET2ee773c365,DATARMNET5c2fd31d7b,DATARMNET0386f6f82a,DATARMNETaa568481cf,
+hash_list){if(!DATARMNETaa568481cf->expires)continue;if(time_before_eq(
+DATARMNETaa568481cf->expires,DATARMNET02dfdbc38d)){DATARMNETbb588401ec=
+DATARMNETaa568481cf->DATARMNET54338da2ff.DATARMNETbb588401ec;DATARMNET112d724eff
+(
+"\x61\x70\x73\x3a\x20\x66\x6c\x6f\x77\x20\x30\x78\x25\x78\x20\x65\x78\x70\x69\x72\x65\x64" "\n"
+,DATARMNETbb588401ec);DATARMNET7fa3dd63cb(DATARMNETaa568481cf);
+DATARMNET446f780f19(DATARMNETbb588401ec,DATARMNETee209ff1f9);}else if(
+DATARMNET2cf3deab22==DATARMNET02dfdbc38d||time_before(DATARMNETaa568481cf->
+expires,DATARMNET2cf3deab22)){DATARMNET2cf3deab22=DATARMNETaa568481cf->expires;}
+}if(DATARMNET2cf3deab22!=DATARMNET02dfdbc38d)mod_timer(&DATARMNETd21629e047,
+DATARMNET2cf3deab22);spin_unlock_bh(&DATARMNET33bd4139f4);}static void 
+DATARMNET3281082da4(struct DATARMNET6fd48c33f6*DATARMNETaa568481cf){
+DATARMNETaa568481cf->DATARMNET556cdfb5eb=RMNET_APS_MAJOR<<(0xeb7+1158-0x132d);if
+(DATARMNETaa568481cf->DATARMNET54338da2ff.DATARMNET6c2cba039d>=
+DATARMNET3bc5e7094a)DATARMNETaa568481cf->DATARMNET556cdfb5eb|=
+DATARMNET9628311a6b[(0xd2d+202-0xdf7)];else DATARMNETaa568481cf->
+DATARMNET556cdfb5eb|=DATARMNET9628311a6b[DATARMNETaa568481cf->
+DATARMNET54338da2ff.DATARMNET6c2cba039d];if(DATARMNETaa568481cf->
+DATARMNET626c626b74)DATARMNETaa568481cf->DATARMNET556cdfb5eb|=RMNET_APS_LLC_MASK
+;if(DATARMNETaa568481cf->DATARMNET40bb1d945b)DATARMNETaa568481cf->
+DATARMNET556cdfb5eb|=RMNET_APS_LLB_MASK;}static int DATARMNET772c0b87c5(void*
+DATARMNETe823dcf978,const struct list_head*DATARMNET9cf7d31274,const struct 
+list_head*DATARMNET5444bd3b6f){struct DATARMNET6fd48c33f6*DATARMNET40e125212a;
+struct DATARMNET6fd48c33f6*DATARMNETdcaff77beb;DATARMNET40e125212a=list_entry(
+DATARMNET9cf7d31274,struct DATARMNET6fd48c33f6,DATARMNETed4d7b4a3c);
+DATARMNETdcaff77beb=list_entry(DATARMNET5444bd3b6f,struct DATARMNET6fd48c33f6,
+DATARMNETed4d7b4a3c);return DATARMNET40e125212a->DATARMNETa27e524d8a>
+DATARMNETdcaff77beb->DATARMNETa27e524d8a;}static void DATARMNET5979020f87(struct
+ work_struct*DATARMNET33110a3ff5){struct DATARMNET6fd48c33f6*DATARMNETaa568481cf
+;u64 DATARMNETf78537d374=(0xd2d+202-0xdf7);u64 DATARMNETd39b09fa66=
+(0xd2d+202-0xdf7);u64 DATARMNETedd419d6e2;bool DATARMNETd3eb49eab3=false;
+spin_lock_bh(&DATARMNET33bd4139f4);list_sort(NULL,&DATARMNET7520901fb5,
+DATARMNET772c0b87c5);list_for_each_entry(DATARMNETaa568481cf,&
+DATARMNET7520901fb5,DATARMNETed4d7b4a3c){if(DATARMNETaa568481cf->
+DATARMNET54338da2ff.DATARMNET626c626b74){DATARMNETedd419d6e2=DATARMNETf78537d374
++DATARMNETaa568481cf->DATARMNETa27e524d8a;if(DATARMNETedd419d6e2<
+DATARMNET65d0d735fa){DATARMNETaa568481cf->DATARMNET626c626b74=true;
+DATARMNETaa568481cf->DATARMNET556cdfb5eb|=RMNET_APS_LLC_MASK;DATARMNETf78537d374
+=DATARMNETedd419d6e2;}else{DATARMNETaa568481cf->DATARMNET626c626b74=false;
+DATARMNETaa568481cf->DATARMNET556cdfb5eb&=~RMNET_APS_LLC_MASK;}
+DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x66\x6c\x6f\x77\x20\x30\x78\x25\x78\x20\x74\x78\x5f\x62\x79\x74\x65\x73\x20\x25\x6c\x6c\x75\x20\x6c\x6c\x63\x20\x25\x64\x20\x6c\x6c\x63\x5f\x62\x79\x74\x65\x73\x20"
+"\x25\x6c\x6c\x75" "\n",DATARMNETaa568481cf->DATARMNET54338da2ff.
+DATARMNETbb588401ec,DATARMNETaa568481cf->DATARMNETa27e524d8a,DATARMNETaa568481cf
+->DATARMNET626c626b74,DATARMNETf78537d374);}if(DATARMNETaa568481cf->
+DATARMNET54338da2ff.DATARMNET40bb1d945b){DATARMNETedd419d6e2=DATARMNETd39b09fa66
++DATARMNETaa568481cf->DATARMNETa27e524d8a;if(DATARMNETedd419d6e2<
+DATARMNETb8ab933cae){DATARMNETaa568481cf->DATARMNET40bb1d945b=true;
+DATARMNETaa568481cf->DATARMNET556cdfb5eb|=RMNET_APS_LLB_MASK;DATARMNETd39b09fa66
+=DATARMNETedd419d6e2;}else{DATARMNETaa568481cf->DATARMNET40bb1d945b=false;
+DATARMNETaa568481cf->DATARMNET556cdfb5eb&=~RMNET_APS_LLB_MASK;}
+DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x66\x6c\x6f\x77\x20\x30\x78\x25\x78\x20\x74\x78\x5f\x62\x79\x74\x65\x73\x20\x25\x6c\x6c\x75\x20\x6c\x6c\x62\x20\x25\x64\x20\x6c\x6c\x62\x5f\x62\x79\x74\x65\x73\x20"
+"\x25\x6c\x6c\x75" "\n",DATARMNETaa568481cf->DATARMNET54338da2ff.
+DATARMNETbb588401ec,DATARMNETaa568481cf->DATARMNETa27e524d8a,DATARMNETaa568481cf
+->DATARMNET40bb1d945b,DATARMNETd39b09fa66);}if(DATARMNETaa568481cf->
+DATARMNETa27e524d8a){DATARMNETd3eb49eab3=true;DATARMNETaa568481cf->
+DATARMNETa27e524d8a=(0xd2d+202-0xdf7);}}spin_unlock_bh(&DATARMNET33bd4139f4);if(
+DATARMNETd3eb49eab3)schedule_delayed_work(&DATARMNET3481998252,
+DATARMNETfd026b105a);}static int DATARMNET82d65f9ca6(struct DATARMNET5d4139d9d7*
+DATARMNETddcafd8b91){struct DATARMNET6fd48c33f6*DATARMNETaa568481cf;
+DATARMNETaa568481cf=DATARMNET3ed11fdc8d(DATARMNETddcafd8b91->DATARMNETbb588401ec
+);if(DATARMNETddcafd8b91->cmd==DATARMNET3412b803e1){if(DATARMNETaa568481cf){
+DATARMNET7fa3dd63cb(DATARMNETaa568481cf);DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x66\x6c\x6f\x77\x20\x30\x78\x25\x78\x20\x72\x65\x6d\x6f\x76\x65\x64\x2c\x20\x63\x6e\x74\x20\x25\x75" "\n"
+,DATARMNETddcafd8b91->DATARMNETbb588401ec,DATARMNETfef55eaf9a);}else{
+DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x66\x6c\x6f\x77\x20\x30\x78\x25\x78\x20\x61\x6c\x72\x65\x61\x64\x79\x20\x72\x65\x6d\x6f\x76\x65\x64" "\n"
+,DATARMNETddcafd8b91->DATARMNETbb588401ec);}return(0xd2d+202-0xdf7);}if(
+DATARMNETddcafd8b91->cmd==DATARMNETceae994093&&DATARMNETaa568481cf){
+DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x66\x6c\x6f\x77\x20\x30\x78\x25\x78\x20\x72\x65\x6d\x6f\x76\x65\x20\x62\x65\x66\x6f\x72\x65\x20\x61\x64\x64" "\n"
+,DATARMNETddcafd8b91->DATARMNETbb588401ec);DATARMNET7fa3dd63cb(
+DATARMNETaa568481cf);DATARMNETaa568481cf=NULL;}if(!DATARMNETaa568481cf){if(
+DATARMNETfef55eaf9a>=DATARMNETe1763a8705){DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x66\x6c\x6f\x77\x20\x63\x6f\x75\x6e\x74\x20\x25\x75\x20\x65\x78\x63\x65\x65\x64\x73\x20\x6d\x61\x78" "\n"
+,DATARMNETfef55eaf9a);return-EINVAL;}DATARMNETaa568481cf=kzalloc(sizeof(*
+DATARMNETaa568481cf),GFP_ATOMIC);if(!DATARMNETaa568481cf){DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x6e\x6f\x20\x6d\x65\x6d\x6f\x72\x79" "\n");return-ENOMEM;}
+memcpy(&DATARMNETaa568481cf->DATARMNET54338da2ff,DATARMNETddcafd8b91,sizeof(
+DATARMNETaa568481cf->DATARMNET54338da2ff));DATARMNETaa568481cf->
+DATARMNET626c626b74=DATARMNETaa568481cf->DATARMNET54338da2ff.DATARMNET626c626b74
+;DATARMNETaa568481cf->DATARMNET40bb1d945b=DATARMNETaa568481cf->
+DATARMNET54338da2ff.DATARMNET40bb1d945b;DATARMNET3281082da4(DATARMNETaa568481cf)
+;if(DATARMNETddcafd8b91->DATARMNET655f822a62){DATARMNETaa568481cf->
+DATARMNETee01ad514b=DATARMNETddcafd8b91->DATARMNET655f822a62*HZ;
+DATARMNETaa568481cf->expires=jiffies+DATARMNETaa568481cf->DATARMNETee01ad514b;}
+DATARMNET1e616c2160(DATARMNETaa568481cf);DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x66\x6c\x6f\x77\x20\x30\x78\x25\x78\x20\x61\x64\x64\x65\x64\x2c\x20\x63\x6e\x74\x20\x25\x75" "\n"
+,DATARMNETaa568481cf->DATARMNET54338da2ff.DATARMNETbb588401ec,
+DATARMNETfef55eaf9a);}else{memcpy(&DATARMNETaa568481cf->DATARMNET54338da2ff,
+DATARMNETddcafd8b91,sizeof(DATARMNETaa568481cf->DATARMNET54338da2ff));
+DATARMNETaa568481cf->DATARMNET626c626b74=DATARMNETaa568481cf->
+DATARMNET54338da2ff.DATARMNET626c626b74;DATARMNETaa568481cf->DATARMNET40bb1d945b
+=DATARMNETaa568481cf->DATARMNET54338da2ff.DATARMNET40bb1d945b;
+DATARMNET3281082da4(DATARMNETaa568481cf);DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x66\x6c\x6f\x77\x20\x30\x78\x25\x78\x20\x75\x70\x64\x61\x74\x65\x64\x2c\x20\x63\x6e\x74\x20\x25\x75" "\n"
+,DATARMNETaa568481cf->DATARMNET54338da2ff.DATARMNETbb588401ec,
+DATARMNETfef55eaf9a);}return(0xd2d+202-0xdf7);}static int DATARMNET1d51fe00f2(
+struct genl_info*DATARMNET54338da2ff,struct DATARMNETca79857d4a*
+DATARMNETa13fcf9070,gfp_t flags){struct sk_buff*DATARMNET543491eb0f;void*
+DATARMNETd7f97e2e5a;int DATARMNETb14e52a504;if(!DATARMNET54338da2ff||!
+DATARMNETa13fcf9070)return-EINVAL;DATARMNET543491eb0f=genlmsg_new(sizeof(*
+DATARMNETa13fcf9070),flags);if(!DATARMNET543491eb0f)goto DATARMNETbf4095f79e;
+DATARMNETd7f97e2e5a=genlmsg_put(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
+DATARMNET54338da2ff->snd_seq+(0xd26+209-0xdf6),&DATARMNETcdba30eca9,
+(0xd2d+202-0xdf7),DATARMNET15437be67e);if(!DATARMNETd7f97e2e5a)goto 
+DATARMNETbf4095f79e;DATARMNETb14e52a504=nla_put(DATARMNET543491eb0f,
+DATARMNET818a0b6438,sizeof(*DATARMNETa13fcf9070),DATARMNETa13fcf9070);if(
+DATARMNETb14e52a504!=(0xd2d+202-0xdf7))goto DATARMNETbf4095f79e;genlmsg_end(
+DATARMNET543491eb0f,DATARMNETd7f97e2e5a);DATARMNETb14e52a504=genlmsg_unicast(
+genl_info_net(DATARMNET54338da2ff),DATARMNET543491eb0f,DATARMNET54338da2ff->
+snd_portid);if(DATARMNETb14e52a504!=(0xd2d+202-0xdf7))goto DATARMNETbf4095f79e;
+return(0xd2d+202-0xdf7);DATARMNETbf4095f79e:DATARMNET112d724eff("\x25\x73",
+"\x41\x50\x53\x5f\x47\x4e\x4c\x3a\x20\x46\x41\x49\x4c\x45\x44\x20\x74\x6f\x20\x73\x65\x6e\x64\x20\x61\x70\x73\x20\x61\x64\x64\x20\x66\x6c\x6f\x77\x20\x72\x65\x73\x70" "\n"
+);return-EFAULT;}static void DATARMNET446f780f19(u32 DATARMNETbb588401ec,u8 
+DATARMNETf8bbe3b0fb){struct DATARMNETca79857d4a DATARMNETa13fcf9070;if(!
+DATARMNET7d98961cbe.snd_portid){DATARMNET112d724eff(
+"\x61\x70\x73\x20\x63\x6c\x69\x65\x6e\x74\x20\x6e\x6f\x74\x20\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64" "\n"
+);return;}DATARMNETa13fcf9070.cmd=DATARMNETdc217f1b29;DATARMNETa13fcf9070.
+DATARMNETe65883bfce=DATARMNETf8bbe3b0fb;DATARMNETa13fcf9070.DATARMNETbb588401ec=
+DATARMNETbb588401ec;if(DATARMNET1d51fe00f2(&DATARMNET7d98961cbe,&
+DATARMNETa13fcf9070,GFP_ATOMIC)){DATARMNET112d724eff(
+"\x61\x70\x73\x20\x63\x6c\x69\x65\x6e\x74\x20\x73\x65\x6e\x64\x20\x66\x61\x69\x6c\x65\x64\x2e\x20\x64\x69\x73\x61\x62\x6c\x65\x20\x63\x6c\x69\x65\x6e\x74" "\n"
+);DATARMNET7d98961cbe.snd_portid=(0xd2d+202-0xdf7);}}static void 
+DATARMNET30dd480cad(struct net_device*DATARMNET413e8dcf7b,struct sk_buff*
+DATARMNET543491eb0f){struct DATARMNET6fd48c33f6*DATARMNETaa568481cf;if(
+DATARMNET543491eb0f->priority>>(0xeb7+1158-0x132d)!=DATARMNET2fe4661b82)return;
+if(!READ_ONCE(DATARMNETfef55eaf9a))return;spin_lock_bh(&DATARMNET33bd4139f4);
+DATARMNETaa568481cf=DATARMNET3ed11fdc8d(DATARMNET543491eb0f->priority);if(
+DATARMNETaa568481cf){DATARMNET543491eb0f->priority=DATARMNETaa568481cf->
+DATARMNET556cdfb5eb;DATARMNETaa568481cf->expires=jiffies+DATARMNETaa568481cf->
+DATARMNETee01ad514b;DATARMNETaa568481cf->DATARMNETa27e524d8a+=
+DATARMNET543491eb0f->len;}spin_unlock_bh(&DATARMNET33bd4139f4);if(
+DATARMNETaa568481cf)schedule_delayed_work(&DATARMNET3481998252,
+DATARMNETfd026b105a);}static int DATARMNET998f6cbce7(struct notifier_block*
+DATARMNET272c159b3c,unsigned long DATARMNET9a4761f31c,void*DATARMNETaef95eabe8){
+struct net_device*DATARMNET413e8dcf7b;DATARMNET413e8dcf7b=
+netdev_notifier_info_to_dev(DATARMNETaef95eabe8);if(unlikely(!
+DATARMNET413e8dcf7b))return NOTIFY_DONE;if(strncmp(DATARMNET413e8dcf7b->name,
+"\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61",(0xd27+224-0xdfd)))return NOTIFY_DONE
+;switch(DATARMNET9a4761f31c){case NETDEV_DOWN:spin_lock_bh(&DATARMNET33bd4139f4)
+;DATARMNET250448eb06(DATARMNET413e8dcf7b->ifindex);spin_unlock_bh(&
+DATARMNET33bd4139f4);break;default:break;}return NOTIFY_DONE;}int 
+DATARMNET37a9efbbcb(struct sk_buff*DATARMNETaafc1d9519,struct genl_info*
+DATARMNET54338da2ff){struct nlattr*DATARMNET9c5e00ef03;struct 
+DATARMNET5d4139d9d7 DATARMNETddcafd8b91;struct DATARMNETca79857d4a 
+DATARMNETa13fcf9070;int DATARMNETb14e52a504;DATARMNET112d724eff(
+"\x41\x50\x53\x5f\x47\x4e\x4c\x3a\x20\x25\x73" "\n",__func__);if(!
+DATARMNET54338da2ff){DATARMNET112d724eff(
+"\x41\x50\x53\x5f\x47\x4e\x4c\x3a\x20\x65\x72\x72\x6f\x72\x20\x2d\x20\x69\x6e\x66\x6f\x20\x69\x73\x20\x6e\x75\x6c\x6c" "\n"
+);return-EINVAL;}DATARMNET9c5e00ef03=DATARMNET54338da2ff->attrs[
+DATARMNET98b93f2e86];if(DATARMNET9c5e00ef03){if(nla_memcpy(&DATARMNETddcafd8b91,
+DATARMNET9c5e00ef03,sizeof(DATARMNETddcafd8b91))<=(0xd2d+202-0xdf7)){
+DATARMNET112d724eff(
+"\x41\x50\x53\x5f\x47\x4e\x4c\x3a\x20\x6e\x6c\x61\x5f\x6d\x65\x6d\x63\x70\x79\x20\x66\x61\x69\x6c\x65\x64\x20\x25\x64" "\n"
+,DATARMNET98b93f2e86);return-EINVAL;}}else{DATARMNET112d724eff(
+"\x41\x50\x53\x5f\x47\x4e\x4c\x3a\x20\x6e\x6f\x20\x69\x6e\x66\x6f\x2d\x3e\x61\x74\x74\x72\x73\x20\x25\x64" "\n"
+,DATARMNET98b93f2e86);return-EINVAL;}spin_lock_bh(&DATARMNET33bd4139f4);switch(
+DATARMNETddcafd8b91.cmd){case DATARMNET63ff5c35c2:DATARMNET7d98961cbe=*
+DATARMNET54338da2ff;DATARMNET9ac8a34003();DATARMNET2fe4661b82=(u16)
+DATARMNETddcafd8b91.DATARMNETbb588401ec;DATARMNET112d724eff(
+"\x61\x70\x73\x20\x63\x6c\x69\x65\x6e\x74\x20\x69\x6e\x69\x74\x20\x63\x6f\x6f\x6b\x69\x65\x20\x30\x78\x25\x78" "\n"
+,DATARMNET2fe4661b82);DATARMNETb14e52a504=(0xd2d+202-0xdf7);break;case 
+DATARMNETceae994093:case DATARMNET3412b803e1:case DATARMNET1efd633004:
+DATARMNETb14e52a504=DATARMNET82d65f9ca6(&DATARMNETddcafd8b91);break;default:
+DATARMNETb14e52a504=-EINVAL;break;}spin_unlock_bh(&DATARMNET33bd4139f4);
+DATARMNETa13fcf9070.cmd=DATARMNETddcafd8b91.cmd;DATARMNETa13fcf9070.
+DATARMNETe65883bfce=DATARMNETb14e52a504;DATARMNETa13fcf9070.DATARMNETbb588401ec=
+DATARMNETddcafd8b91.DATARMNETbb588401ec;DATARMNETb14e52a504=DATARMNET1d51fe00f2(
+DATARMNET54338da2ff,&DATARMNETa13fcf9070,GFP_KERNEL);return DATARMNETb14e52a504;
+}static int __init DATARMNET0718a3fa4c(void){int DATARMNETb14e52a504;pr_info(
+"\x61\x70\x73\x3a\x20\x69\x6e\x69\x74\x20\x28\x25\x73\x29" "\n",
+DATARMNETe5ef0e617c);DATARMNETb14e52a504=DATARMNETcfa8d492f8();if(
+DATARMNETb14e52a504){pr_err(
+"\x61\x70\x73\x3a\x20\x66\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x72\x65\x67\x69\x73\x74\x65\x72\x20\x67\x65\x6e\x6c\x20\x66\x61\x6d\x69\x6c\x79" "\n"
+);return DATARMNETb14e52a504;}register_netdevice_notifier(&DATARMNETc580548769);
+return(0xd2d+202-0xdf7);}static void __exit DATARMNETff67054ba9(void){
+DATARMNET446f780f19((0xd2d+202-0xdf7),DATARMNET94016043b8);spin_lock_bh(&
+DATARMNET33bd4139f4);DATARMNET9ac8a34003();spin_unlock_bh(&DATARMNET33bd4139f4);
+cancel_delayed_work_sync(&DATARMNET3481998252);del_timer_sync(&
+DATARMNETd21629e047);unregister_netdevice_notifier(&DATARMNETc580548769);
+DATARMNETca7606cfd1();DATARMNET112d724eff(
+"\x61\x70\x73\x3a\x20\x65\x78\x69\x74" "\n");}MODULE_LICENSE(
+"\x47\x50\x4c\x20\x76\x32");module_init(DATARMNET0718a3fa4c);module_exit(
+DATARMNETff67054ba9);

+ 5 - 0
datarmnet_ext_dlkm_vendor_board.mk

@@ -5,6 +5,8 @@ DATA_OFFLOAD_DLKM_BOARD_PLATFORMS_LIST += kalama
 DATA_SHS_DLKM_BOARD_PLATFORMS_LIST := lahaina
 DATA_SHS_DLKM_BOARD_PLATFORMS_LIST += taro
 DATA_SHS_DLKM_BOARD_PLATFORMS_LIST += kalama
+DATA_APS_DLKM_BOARD_PLATFORMS_LIST := taro
+DATA_APS_DLKM_BOARD_PLATFORMS_LIST += kalama
 ifneq ($(TARGET_BOARD_AUTO),true)
 ifeq ($(call is-board-platform-in-list,$(DATA_OFFLOAD_DLKM_BOARD_PLATFORMS_LIST)),true)
 BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_offload.ko
@@ -15,4 +17,7 @@ ifeq ($(call is-board-platform-in-list,$(DATA_SHS_DLKM_BOARD_PLATFORMS_LIST)),tr
 BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_shs.ko
 BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_wlan.ko
 endif
+ifeq ($(call is-board-platform-in-list,$(DATA_APS_DLKM_BOARD_PLATFORMS_LIST)),true)
+BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_aps.ko
+endif
 endif

+ 1 - 0
datarmnet_ext_dlkm_vendor_product.mk

@@ -3,3 +3,4 @@ PRODUCT_PACKAGES += rmnet_shs.ko
 PRODUCT_PACKAGES += rmnet_wlan.ko
 PRODUCT_PACKAGES += rmnet_perf_tether.ko
 PRODUCT_PACKAGES += rmnet_perf.ko
+PRODUCT_PACKAGES += rmnet_aps.ko