diff --git a/qca-nss-cfi/Makefile b/qca-nss-cfi/Makefile index 844769b..1253173 100644 --- a/qca-nss-cfi/Makefile +++ b/qca-nss-cfi/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=qca-nss-cfi -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_SOURCE_URL:=https://git.codelinaro.org/clo/qsdk/oss/lklm/nss-cfi.git PKG_SOURCE_PROTO:=git diff --git a/qca-nss-cfi/patches/0007-cryptoapi-v2.0-fix-crash.patch b/qca-nss-cfi/patches/0007-cryptoapi-v2.0-fix-crash.patch new file mode 100644 index 0000000..ee8e901 --- /dev/null +++ b/qca-nss-cfi/patches/0007-cryptoapi-v2.0-fix-crash.patch @@ -0,0 +1,72 @@ +--- a/cryptoapi/v2.0/nss_cryptoapi_aead.c ++++ b/cryptoapi/v2.0/nss_cryptoapi_aead.c +@@ -97,9 +97,9 @@ int nss_cryptoapi_aead_init(struct crypt + bool need_fallback; + + BUG_ON(!ctx); +- NSS_CRYPTOAPI_SET_MAGIC(ctx); + + memset(ctx, 0, sizeof(struct nss_cryptoapi_ctx)); ++ NSS_CRYPTOAPI_SET_MAGIC(ctx); + + ctx->user = g_cryptoapi.user; + ctx->stats.init++; +--- a/cryptoapi/v2.0/nss_cryptoapi_ahash.c ++++ b/cryptoapi/v2.0/nss_cryptoapi_ahash.c +@@ -231,8 +231,10 @@ int nss_cryptoapi_ahash_setkey(struct cr + void nss_cryptoapi_ahash_done(void *app_data, struct nss_crypto_hdr *ch, uint8_t status) + { + struct ahash_request *req = app_data; +- struct nss_cryptoapi_ctx *ctx = crypto_tfm_ctx(req->base.tfm); ++ struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); ++ struct nss_cryptoapi_ctx *ctx = crypto_ahash_ctx(ahash); + struct nss_cryptoapi_req_ctx *rctx = ahash_request_ctx(req); ++ + uint8_t *hw_hmac; + int error; + +@@ -268,7 +270,7 @@ void nss_cryptoapi_ahash_done(void *app_ + * Decrement cryptoapi reference + */ + nss_cryptoapi_ref_dec(ctx); +- req->base.complete(&req->base, error); ++ ahash_request_complete(req, error); + } + + /* +--- a/cryptoapi/v2.0/nss_cryptoapi_skcipher.c ++++ b/cryptoapi/v2.0/nss_cryptoapi_skcipher.c +@@ -92,9 +92,9 @@ int nss_cryptoapi_skcipher_init(struct c + struct nss_cryptoapi_ctx *ctx = crypto_skcipher_ctx(tfm); + + BUG_ON(!ctx); +- NSS_CRYPTOAPI_SET_MAGIC(ctx); + + memset(ctx, 0, sizeof(struct nss_cryptoapi_ctx)); ++ NSS_CRYPTOAPI_SET_MAGIC(ctx); + + ctx->user = g_cryptoapi.user; + ctx->stats.init++; +@@ -220,11 +220,11 @@ int nss_cryptoapi_skcipher_setkey(struct + void nss_cryptoapi_skcipher_done(void *app_data, struct nss_crypto_hdr *ch, uint8_t status) + { + struct skcipher_request *req = app_data; +- struct nss_cryptoapi_ctx *ctx = skcipher_request_ctx(req); ++ struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req); ++ struct nss_cryptoapi_ctx *ctx = crypto_skcipher_ctx(cipher); + int error; + + BUG_ON(!ch); +- + /* + * Check cryptoapi context magic number. + */ +@@ -256,7 +256,7 @@ void nss_cryptoapi_skcipher_done(void *a + * Decrement cryptoapi reference + */ + nss_cryptoapi_ref_dec(ctx); +- req->base.complete(&req->base, error); ++ skcipher_request_complete(req, error); + } + + /* diff --git a/qca-nss-crypto/Makefile b/qca-nss-crypto/Makefile index c099903..b093975 100644 --- a/qca-nss-crypto/Makefile +++ b/qca-nss-crypto/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=qca-nss-crypto -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_SOURCE_URL:=https://git.codelinaro.org/clo/qsdk/oss/lklm/nss-crypto.git PKG_SOURCE_PROTO:=git @@ -28,7 +28,7 @@ define KernelPackage/qca-nss-crypto SECTION:=kernel CATEGORY:=Kernel modules SUBMENU:=Cryptographic API modules - DEPENDS:=@TARGET_qualcommax +kmod-qca-nss-drv +@NSS_DRV_CRYPTO_ENABLE @BROKEN + DEPENDS:=@TARGET_qualcommax +kmod-qca-nss-drv +nss-eip-firmware +@NSS_DRV_CRYPTO_ENABLE TITLE:=Kernel driver for NSS crypto driver FILES:=$(PKG_BUILD_DIR)/$(NSS_CRYPTO_DIR)/src/qca-nss-crypto.ko \ $(PKG_BUILD_DIR)/$(NSS_CRYPTO_DIR)/tool/qca-nss-crypto-tool.ko diff --git a/qca-nss-drv/patches-11.4/0023-nss-drv-add-missing-wifili-err-codes.patch b/qca-nss-drv/patches-11.4/0023-nss-drv-add-missing-wifili-err-codes.patch new file mode 100644 index 0000000..e94b696 --- /dev/null +++ b/qca-nss-drv/patches-11.4/0023-nss-drv-add-missing-wifili-err-codes.patch @@ -0,0 +1,76 @@ +commit 1db9e5510558817d138de87f5a4942293a9fcb91 +Author: syed touqeer pasha +AuthorDate: Thu May 16 14:59:48 2024 +0530 +Commit: syed touqeer pasha +CommitDate: Thu May 16 14:59:48 2024 +0530 + +[qca-nss-drv] Add missing error code for wifili pkg. + +Add missing error code between nss fw and nss drv. + +Change-Id: I3f81da10b33fd15b1817a40eb906df9642a10d98 +Signed-off-by: syed touqeer pasha + +--- a/exports/nss_wifili_if.h ++++ b/exports/nss_wifili_if.h +@@ -392,6 +392,60 @@ enum nss_wifili_error_types { + /**< Invalid TLV length. */ + NSS_WIFILI_EMESG_RX_BUF_LEN_INVALID, + /**< Invalid Rx buffer length. */ ++ NSS_WIFILI_EMSG_INVALID_PDEV_ID, ++ /**< Invalid pdev id from host. */ ++ NSS_WIFILI_EMSG_NO_PDEV_PRESENT, ++ /**< Pdev corresponding to this pdev id is not present. */ ++ NSS_WIFILI_EMESG_WDS_UPDATE_FAIL, ++ /**< Wds peer ast update failed. */ ++ NSS_WIFILI_EMSG_VLAN_ID_SET_FAIL, ++ /**< Vlan id set failed. */ ++ NSS_WIFILI_EMSG_PDEV_UPDATE_INVALID_RADIOID_FAIL, ++ /**< Pdev update failed due to invalid radio id. */ ++ NSS_WIFILI_EMSG_PDEV_UPDATE_INVALID_LMACID_FAIL, ++ /**< Pdev update failed due to invalid lmac id. */ ++ NSS_WIFILI_EMSG_PDEV_UPDATE_INVALID_TARGETPDEVID_FAIL, ++ /**< Pdev update failed due to invalid target pdev id. */ ++ NSS_WIFILI_EMESG_PEER_AST_FLOWID_MAP_VAPID_INVALID_FAIL, ++ /**< Peer ast flow map failed due to invalid vdev_id. */ ++ NSS_WIFILI_EMESG_PEER_AST_FLOWID_MAP_VDEV_NULL_FAIL, ++ /**< Peer ast flow map failed due to vdev null. */ ++ NSS_WIFILI_EMESG_PEER_AST_FLOWID_MAP_PEERID_INVALID_FAIL, ++ /**< Peer ast flow map failed due to invalid peer_id. */ ++ NSS_WIFILI_EMSG_PEER_AST_FLOWID_MAP_STA_VAP_FAIL, ++ /**< Peer ast flowid map failed due to sta vap. */ ++ NSS_WIFILI_EMESG_PEER_AST_FLOWID_MAP_PEERID_MISMATCH_FAIL, ++ /**< Peer ast flow map failed due to mismatched peer_id. */ ++ NSS_WIFILI_EMESG_PEER_AST_FLOWID_MAP_PEER_NULL_FAIL, ++ /**< Peer ast flow map failed due to peer null. */ ++ NSS_WIFILI_EMSG_PEER_AST_FLOWID_MAP_AST_MISMATCH_FAIL, ++ /**< Peer ast flow map failed due to mismatched ast index. */ ++ NSS_WIFILI_EMSG_INVALID_V3_STATS_TYPE, ++ /**< Invalid v3 stats type. */ ++ NSS_WIFILI_EMSG_ISOLATION_SET_FAIL, ++ /**< Peer isolation set failed. */ ++ NSS_WIFILI_EMESG_WDS_ALREADY_PRESENT, ++ /**< Wds peer ast add failed. */ ++ NSS_WIFILI_EMSG_STATS_CLR_VDEV_NULL_FAIL, ++ /**< Statistics clear failed due to null vdev. */ ++ NSS_WIFILI_EMSG_INVALID_VDEV_ID, ++ /**< Invalid vdev id from host. */ ++ NSS_WIFILI_EMSG_PDEV_INIT_FAIL_INVALID_THREAD_SCHEME_ID, ++ /**< Incorrect scheme ID sent from host. */ ++ NSS_WIFILI_EMSG_PEER_WDS_4ADDR_EVENT_INV_PEER, ++ /**< Invalid peer ID sent from host. */ ++ NSS_WIFILI_EMSG_PEER_WDS_INVALID_IFNUM, ++ /**< Invalid peer ID sent from host. */ ++ NSS_WIFILI_EMSG_PEER_AUTH_FLAG_UPDATE_FAIL, ++ /**< Peer authentication flag update failed. */ ++ NSS_WIFILI_EMSG_PEER_TEARDOWN_ALLOC_FAIL, ++ /**< Alloc fail in peer tear down path. */ ++ NSS_WIFILI_EMSG_TX_CAPTURE_MODE_UPDATE_FAIL, ++ /**< Tx capture mode update failure. */ ++ NSS_WIFILI_EMSG_PEER_MEMORY_INSUFFICIENT_FROM_HOST, ++ /**< Peer memory from host is less than NSS peer struct. */ ++ NSS_WIFILI_EMSG_DUPLICATE_MPASS_ID_SET, ++ /**< Duplicate mpass vlan id set. */ + NSS_WIFILI_EMSG_UNKNOWN + /**< Unknown error message. */ + }; diff --git a/qca-nss-drv/patches-11.4/0024-fix-mesh-stats-naming.patch b/qca-nss-drv/patches-11.4/0024-fix-mesh-stats-naming.patch new file mode 100644 index 0000000..0b7bb91 --- /dev/null +++ b/qca-nss-drv/patches-11.4/0024-fix-mesh-stats-naming.patch @@ -0,0 +1,39 @@ +--- a/nss_wifi_mesh_strings.c ++++ b/nss_wifi_mesh_strings.c +@@ -80,8 +80,8 @@ struct nss_stats_info nss_wifi_mesh_stri + {"not_found", NSS_STATS_TYPE_SPECIAL}, + {"delete_success", NSS_STATS_TYPE_SPECIAL}, + {"update_success", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_path_expired", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_path_refresh_needed", NSS_STATS_TYPE_SPECIAL}, ++ {"path_expired", NSS_STATS_TYPE_SPECIAL}, ++ {"path_refresh_needed", NSS_STATS_TYPE_SPECIAL}, + {"add_requests", NSS_STATS_TYPE_SPECIAL}, + {"del_requests", NSS_STATS_TYPE_SPECIAL}, + {"update_requests", NSS_STATS_TYPE_SPECIAL}, +@@ -91,8 +91,8 @@ struct nss_stats_info nss_wifi_mesh_stri + {"metric_updations", NSS_STATS_TYPE_SPECIAL}, + {"block_mesh_fwd_updations", NSS_STATS_TYPE_SPECIAL}, + {"delete_failures", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_path_dummy_add_failures",NSS_STATS_TYPE_SPECIAL}, +- {"mesh_path_dummy_add_success", NSS_STATS_TYPE_SPECIAL} ++ {"path_dummy_add_failures", NSS_STATS_TYPE_SPECIAL}, ++ {"path_dummy_add_success", NSS_STATS_TYPE_SPECIAL} + + }; + +@@ -126,10 +126,10 @@ struct nss_stats_info nss_wifi_mesh_stri + {"update_requests", NSS_STATS_TYPE_SPECIAL}, + {"mda_updations", NSS_STATS_TYPE_SPECIAL}, + {"flag_updations", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_proxy_path_dummy_lookup_success", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_proxy_path_dummy_lookup_failures", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_proxy_path_dummy_add_failures", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_proxy_path_dummy_add_success", NSS_STATS_TYPE_SPECIAL} ++ {"proxy_path_dummy_lookup_success", NSS_STATS_TYPE_SPECIAL}, ++ {"proxy_path_dummy_lookup_failures", NSS_STATS_TYPE_SPECIAL}, ++ {"proxy_path_dummy_add_failures", NSS_STATS_TYPE_SPECIAL}, ++ {"proxy_path_dummy_add_success", NSS_STATS_TYPE_SPECIAL} + }; + + /* diff --git a/qca-nss-drv/patches/0023-nss-drv-add-missing-wifili-err-codes.patch b/qca-nss-drv/patches/0023-nss-drv-add-missing-wifili-err-codes.patch new file mode 100644 index 0000000..194dc12 --- /dev/null +++ b/qca-nss-drv/patches/0023-nss-drv-add-missing-wifili-err-codes.patch @@ -0,0 +1,76 @@ +commit 1db9e5510558817d138de87f5a4942293a9fcb91 +Author: syed touqeer pasha +AuthorDate: Thu May 16 14:59:48 2024 +0530 +Commit: syed touqeer pasha +CommitDate: Thu May 16 14:59:48 2024 +0530 + +[qca-nss-drv] Add missing error code for wifili pkg. + +Add missing error code between nss fw and nss drv. + +Change-Id: I3f81da10b33fd15b1817a40eb906df9642a10d98 +Signed-off-by: syed touqeer pasha + +--- a/exports/nss_wifili_if.h ++++ b/exports/nss_wifili_if.h +@@ -404,8 +404,60 @@ enum nss_wifili_error_types { + /**< Invalid TLV length. */ + NSS_WIFILI_EMESG_RX_BUF_LEN_INVALID, + /**< Invalid Rx buffer length. */ ++ NSS_WIFILI_EMSG_INVALID_PDEV_ID, ++ /**< Invalid pdev id from host. */ ++ NSS_WIFILI_EMSG_NO_PDEV_PRESENT, ++ /**< Pdev corresponding to this pdev id is not present. */ ++ NSS_WIFILI_EMESG_WDS_UPDATE_FAIL, ++ /**< Wds peer ast update failed. */ ++ NSS_WIFILI_EMSG_VLAN_ID_SET_FAIL, ++ /**< Vlan id set failed. */ ++ NSS_WIFILI_EMSG_PDEV_UPDATE_INVALID_RADIOID_FAIL, ++ /**< Pdev update failed due to invalid radio id. */ ++ NSS_WIFILI_EMSG_PDEV_UPDATE_INVALID_LMACID_FAIL, ++ /**< Pdev update failed due to invalid lmac id. */ ++ NSS_WIFILI_EMSG_PDEV_UPDATE_INVALID_TARGETPDEVID_FAIL, ++ /**< Pdev update failed due to invalid target pdev id. */ ++ NSS_WIFILI_EMESG_PEER_AST_FLOWID_MAP_VAPID_INVALID_FAIL, ++ /**< Peer ast flow map failed due to invalid vdev_id. */ ++ NSS_WIFILI_EMESG_PEER_AST_FLOWID_MAP_VDEV_NULL_FAIL, ++ /**< Peer ast flow map failed due to vdev null. */ ++ NSS_WIFILI_EMESG_PEER_AST_FLOWID_MAP_PEERID_INVALID_FAIL, ++ /**< Peer ast flow map failed due to invalid peer_id. */ ++ NSS_WIFILI_EMSG_PEER_AST_FLOWID_MAP_STA_VAP_FAIL, ++ /**< Peer ast flowid map failed due to sta vap. */ ++ NSS_WIFILI_EMESG_PEER_AST_FLOWID_MAP_PEERID_MISMATCH_FAIL, ++ /**< Peer ast flow map failed due to mismatched peer_id. */ ++ NSS_WIFILI_EMESG_PEER_AST_FLOWID_MAP_PEER_NULL_FAIL, ++ /**< Peer ast flow map failed due to peer null. */ ++ NSS_WIFILI_EMSG_PEER_AST_FLOWID_MAP_AST_MISMATCH_FAIL, ++ /**< Peer ast flow map failed due to mismatched ast index. */ ++ NSS_WIFILI_EMSG_INVALID_V3_STATS_TYPE, ++ /**< Invalid v3 stats type. */ ++ NSS_WIFILI_EMSG_ISOLATION_SET_FAIL, ++ /**< Peer isolation set failed. */ ++ NSS_WIFILI_EMESG_WDS_ALREADY_PRESENT, ++ /**< Wds peer ast add failed. */ ++ NSS_WIFILI_EMSG_STATS_CLR_VDEV_NULL_FAIL, ++ /**< Statistics clear failed due to null vdev. */ ++ NSS_WIFILI_EMSG_INVALID_VDEV_ID, ++ /**< Invalid vdev id from host. */ ++ NSS_WIFILI_EMSG_PDEV_INIT_FAIL_INVALID_THREAD_SCHEME_ID, ++ /**< Incorrect scheme ID sent from host. */ ++ NSS_WIFILI_EMSG_PEER_WDS_4ADDR_EVENT_INV_PEER, ++ /**< Invalid peer ID sent from host. */ ++ NSS_WIFILI_EMSG_PEER_WDS_INVALID_IFNUM, ++ /**< Invalid peer ID sent from host. */ ++ NSS_WIFILI_EMSG_PEER_AUTH_FLAG_UPDATE_FAIL, ++ /**< Peer authentication flag update failed. */ ++ NSS_WIFILI_EMSG_PEER_TEARDOWN_ALLOC_FAIL, ++ /**< Alloc fail in peer tear down path. */ + NSS_WIFILI_EMSG_TX_CAPTURE_MODE_UPDATE_FAIL, + /**< Tx capture mode update failure. */ ++ NSS_WIFILI_EMSG_PEER_MEMORY_INSUFFICIENT_FROM_HOST, ++ /**< Peer memory from host is less than NSS peer struct. */ ++ NSS_WIFILI_EMSG_DUPLICATE_MPASS_ID_SET, ++ /**< Duplicate mpass vlan id set. */ + NSS_WIFILI_EMSG_UNKNOWN + /**< Unknown error message. */ + }; diff --git a/qca-nss-drv/patches/0024-fix-mesh-stats-naming.patch b/qca-nss-drv/patches/0024-fix-mesh-stats-naming.patch new file mode 100644 index 0000000..0b7bb91 --- /dev/null +++ b/qca-nss-drv/patches/0024-fix-mesh-stats-naming.patch @@ -0,0 +1,39 @@ +--- a/nss_wifi_mesh_strings.c ++++ b/nss_wifi_mesh_strings.c +@@ -80,8 +80,8 @@ struct nss_stats_info nss_wifi_mesh_stri + {"not_found", NSS_STATS_TYPE_SPECIAL}, + {"delete_success", NSS_STATS_TYPE_SPECIAL}, + {"update_success", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_path_expired", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_path_refresh_needed", NSS_STATS_TYPE_SPECIAL}, ++ {"path_expired", NSS_STATS_TYPE_SPECIAL}, ++ {"path_refresh_needed", NSS_STATS_TYPE_SPECIAL}, + {"add_requests", NSS_STATS_TYPE_SPECIAL}, + {"del_requests", NSS_STATS_TYPE_SPECIAL}, + {"update_requests", NSS_STATS_TYPE_SPECIAL}, +@@ -91,8 +91,8 @@ struct nss_stats_info nss_wifi_mesh_stri + {"metric_updations", NSS_STATS_TYPE_SPECIAL}, + {"block_mesh_fwd_updations", NSS_STATS_TYPE_SPECIAL}, + {"delete_failures", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_path_dummy_add_failures",NSS_STATS_TYPE_SPECIAL}, +- {"mesh_path_dummy_add_success", NSS_STATS_TYPE_SPECIAL} ++ {"path_dummy_add_failures", NSS_STATS_TYPE_SPECIAL}, ++ {"path_dummy_add_success", NSS_STATS_TYPE_SPECIAL} + + }; + +@@ -126,10 +126,10 @@ struct nss_stats_info nss_wifi_mesh_stri + {"update_requests", NSS_STATS_TYPE_SPECIAL}, + {"mda_updations", NSS_STATS_TYPE_SPECIAL}, + {"flag_updations", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_proxy_path_dummy_lookup_success", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_proxy_path_dummy_lookup_failures", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_proxy_path_dummy_add_failures", NSS_STATS_TYPE_SPECIAL}, +- {"mesh_proxy_path_dummy_add_success", NSS_STATS_TYPE_SPECIAL} ++ {"proxy_path_dummy_lookup_success", NSS_STATS_TYPE_SPECIAL}, ++ {"proxy_path_dummy_lookup_failures", NSS_STATS_TYPE_SPECIAL}, ++ {"proxy_path_dummy_add_failures", NSS_STATS_TYPE_SPECIAL}, ++ {"proxy_path_dummy_add_success", NSS_STATS_TYPE_SPECIAL} + }; + + /* diff --git a/qca-nss-ecm/Makefile b/qca-nss-ecm/Makefile index 3d1132d..7922232 100644 --- a/qca-nss-ecm/Makefile +++ b/qca-nss-ecm/Makefile @@ -1,14 +1,14 @@ include $(TOPDIR)/rules.mk PKG_NAME:=qca-nss-ecm -PKG_RELEASE:=4 +PKG_RELEASE:=1 PKG_SOURCE_URL:=https://git.codelinaro.org/clo/qsdk/oss/lklm/qca-nss-ecm.git PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2024-06-20 -PKG_SOURCE_VERSION:=92c7fa1 -PKG_MIRROR_HASH:=d69d09fe8e3d6339085854de4f5a44dbfdc9648f5d5f9001a874ac177e2bf16b -QSDK_VERSION:=12.5 +PKG_SOURCE_DATE:=2024-09-02 +PKG_SOURCE_VERSION:=bd5057b +PKG_MIRROR_HASH:=b50130ee65b575226e1d715d38b09cc496a901ea1d2ef48a83e727d61e0d8283 +QSDK_VERSION:=12.5.5 PKG_VERSION:=$(QSDK_VERSION).$(subst -,.,$(PKG_SOURCE_DATE))~$(PKG_SOURCE_VERSION) PKG_BUILD_PARALLEL:=1 diff --git a/qca-nss-ecm/patches/0001-treewide-componentize-the-module-even-more.patch b/qca-nss-ecm/patches/0001-treewide-componentize-the-module-even-more.patch index 7d765b6..3ad62c8 100644 --- a/qca-nss-ecm/patches/0001-treewide-componentize-the-module-even-more.patch +++ b/qca-nss-ecm/patches/0001-treewide-componentize-the-module-even-more.patch @@ -32,7 +32,7 @@ Signed-off-by: Ansuel Smith ecm-y := \ frontends/cmn/ecm_ae_classifier.o \ -@@ -115,10 +117,18 @@ ccflags-$(ECM_INTERFACE_BOND_ENABLE) += +@@ -117,10 +119,18 @@ ccflags-$(ECM_INTERFACE_BOND_ENABLE) += # Define ECM_INTERFACE_PPPOE_ENABLE=y in order # to enable support for PPPoE acceleration. # ############################################################################# @@ -52,7 +52,7 @@ Signed-off-by: Ansuel Smith # Define ECM_INTERFACE_L2TPV2_ENABLE=y in order # to enable support for l2tpv2 acceleration. # ############################################################################# -@@ -151,6 +161,12 @@ endif +@@ -153,6 +163,12 @@ endif ccflags-$(ECM_INTERFACE_PPP_ENABLE) += -DECM_INTERFACE_PPP_ENABLE # ############################################################################# @@ -65,7 +65,7 @@ Signed-off-by: Ansuel Smith # Define ECM_INTERFACE_GRE_TAP_ENABLE=y in order # to enable support for GRE TAP interface. # ############################################################################# -@@ -233,7 +249,9 @@ ccflags-$(ECM_INTERFACE_OVS_BRIDGE_ENABL +@@ -235,7 +251,9 @@ ccflags-$(ECM_INTERFACE_OVS_BRIDGE_ENABL # ############################################################################# # Define ECM_INTERFACE_VLAN_ENABLE=y in order to enable support for VLAN # ############################################################################# @@ -76,7 +76,7 @@ Signed-off-by: Ansuel Smith ccflags-$(ECM_INTERFACE_VLAN_ENABLE) += -DECM_INTERFACE_VLAN_ENABLE # ############################################################################# -@@ -275,7 +293,9 @@ ccflags-$(ECM_CLASSIFIER_OVS_ENABLE) += +@@ -279,7 +297,9 @@ ccflags-$(ECM_CLASSIFIER_OVS_ENABLE) += # ############################################################################# # Define ECM_CLASSIFIER_MARK_ENABLE=y in order to enable mark classifier. # ############################################################################# @@ -87,7 +87,7 @@ Signed-off-by: Ansuel Smith ecm-$(ECM_CLASSIFIER_MARK_ENABLE) += ecm_classifier_mark.o ccflags-$(ECM_CLASSIFIER_MARK_ENABLE) += -DECM_CLASSIFIER_MARK_ENABLE -@@ -299,7 +319,9 @@ ccflags-$(ECM_CLASSIFIER_NL_ENABLE) += - +@@ -303,7 +323,9 @@ ccflags-$(ECM_CLASSIFIER_NL_ENABLE) += - # ############################################################################# # Define ECM_CLASSIFIER_DSCP_ENABLE=y in order to enable DSCP classifier. # ############################################################################# @@ -98,7 +98,7 @@ Signed-off-by: Ansuel Smith ecm-$(ECM_CLASSIFIER_DSCP_ENABLE) += ecm_classifier_dscp.o ccflags-$(ECM_CLASSIFIER_DSCP_ENABLE) += -DECM_CLASSIFIER_DSCP_ENABLE ccflags-$(ECM_CLASSIFIER_DSCP_IGS) += -DECM_CLASSIFIER_DSCP_IGS -@@ -318,7 +340,9 @@ ccflags-$(ECM_CLASSIFIER_HYFI_ENABLE) += +@@ -322,7 +344,9 @@ ccflags-$(ECM_CLASSIFIER_HYFI_ENABLE) += # the Parental Controls subsystem classifier in ECM. Currently disabled until # customers require it / if they need to integrate their Parental Controls with it. # ############################################################################# @@ -109,7 +109,7 @@ Signed-off-by: Ansuel Smith ecm-$(ECM_CLASSIFIER_PCC_ENABLE) += ecm_classifier_pcc.o ccflags-$(ECM_CLASSIFIER_PCC_ENABLE) += -DECM_CLASSIFIER_PCC_ENABLE -@@ -367,27 +391,36 @@ ccflags-$(ECM_NON_PORTED_SUPPORT_ENABLE) +@@ -371,27 +395,36 @@ ccflags-$(ECM_NON_PORTED_SUPPORT_ENABLE) # ############################################################################# # Define ECM_STATE_OUTPUT_ENABLE=y to support XML state output # ############################################################################# @@ -149,7 +149,7 @@ Signed-off-by: Ansuel Smith ccflags-$(ECM_TRACKER_DPI_SUPPORT_ENABLE) += -DECM_TRACKER_DPI_SUPPORT_ENABLE # ############################################################################# -@@ -395,14 +428,18 @@ ccflags-$(ECM_TRACKER_DPI_SUPPORT_ENABLE +@@ -399,14 +432,18 @@ ccflags-$(ECM_TRACKER_DPI_SUPPORT_ENABLE # support for the database keeping lists of connections that are assigned # on a per TYPE of classifier basis. # ############################################################################# @@ -252,7 +252,7 @@ Signed-off-by: Ansuel Smith --- a/ecm_interface.c +++ b/ecm_interface.c -@@ -1525,6 +1525,7 @@ struct neighbour *ecm_interface_ipv6_nei +@@ -1531,6 +1531,7 @@ struct neighbour *ecm_interface_ipv6_nei */ bool ecm_interface_is_pptp(struct sk_buff *skb, const struct net_device *out) { @@ -260,7 +260,7 @@ Signed-off-by: Ansuel Smith struct net_device *in; /* -@@ -1549,6 +1550,7 @@ bool ecm_interface_is_pptp(struct sk_buf +@@ -1555,6 +1556,7 @@ bool ecm_interface_is_pptp(struct sk_buf } dev_put(in); @@ -268,7 +268,7 @@ Signed-off-by: Ansuel Smith return false; } -@@ -1561,6 +1563,7 @@ bool ecm_interface_is_pptp(struct sk_buf +@@ -1567,6 +1569,7 @@ bool ecm_interface_is_pptp(struct sk_buf */ bool ecm_interface_is_l2tp_packet_by_version(struct sk_buff *skb, const struct net_device *out, int ver) { @@ -276,7 +276,7 @@ Signed-off-by: Ansuel Smith uint32_t flag = 0; struct net_device *in; -@@ -1593,6 +1596,7 @@ bool ecm_interface_is_l2tp_packet_by_ver +@@ -1599,6 +1602,7 @@ bool ecm_interface_is_l2tp_packet_by_ver } dev_put(in); @@ -284,7 +284,7 @@ Signed-off-by: Ansuel Smith return false; } -@@ -1605,6 +1609,7 @@ bool ecm_interface_is_l2tp_packet_by_ver +@@ -1611,6 +1615,7 @@ bool ecm_interface_is_l2tp_packet_by_ver */ bool ecm_interface_is_l2tp_pptp(struct sk_buff *skb, const struct net_device *out) { @@ -292,7 +292,7 @@ Signed-off-by: Ansuel Smith struct net_device *in; /* -@@ -1627,6 +1632,7 @@ bool ecm_interface_is_l2tp_pptp(struct s +@@ -1633,6 +1638,7 @@ bool ecm_interface_is_l2tp_pptp(struct s } dev_put(in); @@ -300,7 +300,7 @@ Signed-off-by: Ansuel Smith return false; } -@@ -7182,6 +7188,7 @@ static void ecm_interface_regenerate_con +@@ -7292,6 +7298,7 @@ static void ecm_interface_regenerate_con return; } @@ -308,7 +308,7 @@ Signed-off-by: Ansuel Smith for (dir = 0; dir < ECM_DB_OBJ_DIR_MAX; dir++) { /* * Re-generate all connections associated with this interface -@@ -7197,6 +7204,7 @@ static void ecm_interface_regenerate_con +@@ -7307,6 +7314,7 @@ static void ecm_interface_regenerate_con ci[dir] = cin; } } @@ -318,7 +318,7 @@ Signed-off-by: Ansuel Smith /* --- a/frontends/ecm_front_end_common.c +++ b/frontends/ecm_front_end_common.c -@@ -538,6 +538,7 @@ bool ecm_front_end_gre_proto_is_accel_al +@@ -594,6 +594,7 @@ bool ecm_front_end_gre_proto_is_accel_al struct nf_conntrack_tuple *reply_tuple, int ip_version, uint16_t offset) { @@ -326,7 +326,7 @@ Signed-off-by: Ansuel Smith struct net_device *dev; struct gre_base_hdr *greh; -@@ -549,10 +550,12 @@ bool ecm_front_end_gre_proto_is_accel_al +@@ -605,10 +606,12 @@ bool ecm_front_end_gre_proto_is_accel_al /* * Case 1: PPTP locally terminated */ @@ -339,7 +339,7 @@ Signed-off-by: Ansuel Smith /* * Case 2: PPTP pass through -@@ -680,6 +683,10 @@ bool ecm_front_end_gre_proto_is_accel_al +@@ -736,6 +739,10 @@ bool ecm_front_end_gre_proto_is_accel_al */ DEBUG_TRACE("%px: GRE IPv%d pass through non NAT - allow acceleration\n", skb, ip_version); return true; diff --git a/qca-nss-ecm/patches/0009-frontends-drop-udp_get_timeouts-and-use-standard-ups.patch b/qca-nss-ecm/patches/0009-frontends-drop-udp_get_timeouts-and-use-standard-ups.patch index a676419..217792d 100644 --- a/qca-nss-ecm/patches/0009-frontends-drop-udp_get_timeouts-and-use-standard-ups.patch +++ b/qca-nss-ecm/patches/0009-frontends-drop-udp_get_timeouts-and-use-standard-ups.patch @@ -39,7 +39,7 @@ instead or relying on a downstream api not present upstream. spin_lock_bh(&ct->lock); --- a/frontends/sfe/ecm_sfe_ipv4.c +++ b/frontends/sfe/ecm_sfe_ipv4.c -@@ -563,7 +563,8 @@ sync_conntrack: +@@ -576,7 +576,8 @@ sync_conntrack: #else timeouts = nf_ct_timeout_lookup(ct); if (!timeouts) { @@ -51,7 +51,7 @@ instead or relying on a downstream api not present upstream. spin_lock_bh(&ct->lock); --- a/frontends/sfe/ecm_sfe_ipv6.c +++ b/frontends/sfe/ecm_sfe_ipv6.c -@@ -556,7 +556,8 @@ sync_conntrack: +@@ -569,7 +569,8 @@ sync_conntrack: #else timeouts = nf_ct_timeout_lookup(ct); if (!timeouts) { diff --git a/qca-nss-ecm/patches/0010-ecm_interface-fix-ppp-generic-function-calls-for-5.15.patch b/qca-nss-ecm/patches/0010-ecm_interface-fix-ppp-generic-function-calls-for-5.15.patch index 27238cc..8603b23 100644 --- a/qca-nss-ecm/patches/0010-ecm_interface-fix-ppp-generic-function-calls-for-5.15.patch +++ b/qca-nss-ecm/patches/0010-ecm_interface-fix-ppp-generic-function-calls-for-5.15.patch @@ -1,6 +1,6 @@ --- a/ecm_interface.c +++ b/ecm_interface.c -@@ -3640,7 +3640,7 @@ identifier_update: +@@ -3718,7 +3718,7 @@ identifier_update: if (skb && (skb->skb_iif == dev->ifindex)) { struct pppol2tp_common_addr info; @@ -9,7 +9,7 @@ DEBUG_TRACE("%px: Net device: %px is MULTILINK PPP - Unknown to the ECM\n", feci, dev); type_info.unknown.os_specific_ident = dev_interface_num; -@@ -3650,7 +3650,7 @@ identifier_update: +@@ -3728,7 +3728,7 @@ identifier_update: ii = ecm_interface_unknown_interface_establish(&type_info.unknown, dev_name, dev_interface_num, ae_interface_num, dev_mtu); return ii; } diff --git a/qca-nss-ecm/patches/0013-treewide-export-ipv4-and-ipv6-symbols.patch b/qca-nss-ecm/patches/0013-treewide-export-ipv4-and-ipv6-symbols.patch index 30ec513..4802cac 100644 --- a/qca-nss-ecm/patches/0013-treewide-export-ipv4-and-ipv6-symbols.patch +++ b/qca-nss-ecm/patches/0013-treewide-export-ipv4-and-ipv6-symbols.patch @@ -15,7 +15,7 @@ +EXPORT_SYMBOL(ecm_nss_ipv4_is_conn_limit_reached); --- a/frontends/nss/ecm_nss_non_ported_ipv4.c +++ b/frontends/nss/ecm_nss_non_ported_ipv4.c -@@ -1847,6 +1847,7 @@ struct ecm_front_end_connection_instance +@@ -1897,6 +1897,7 @@ struct ecm_front_end_connection_instance return feci; } @@ -36,7 +36,7 @@ struct ecm_db_connection_instance **nci); --- a/frontends/nss/ecm_nss_non_ported_ipv6.c +++ b/frontends/nss/ecm_nss_non_ported_ipv6.c -@@ -1657,6 +1657,7 @@ struct ecm_front_end_connection_instance +@@ -1707,6 +1707,7 @@ struct ecm_front_end_connection_instance return feci; } @@ -57,7 +57,7 @@ struct ecm_db_connection_instance **nci); --- a/frontends/nss/ecm_nss_ported_ipv4.c +++ b/frontends/nss/ecm_nss_ported_ipv4.c -@@ -1906,6 +1906,7 @@ struct ecm_front_end_connection_instance +@@ -1956,6 +1956,7 @@ struct ecm_front_end_connection_instance return feci; } @@ -78,7 +78,7 @@ struct ecm_db_connection_instance **nci); --- a/frontends/nss/ecm_nss_ported_ipv6.c +++ b/frontends/nss/ecm_nss_ported_ipv6.c -@@ -1812,6 +1812,7 @@ struct ecm_front_end_connection_instance +@@ -1862,6 +1862,7 @@ struct ecm_front_end_connection_instance return feci; } diff --git a/qca-nss-ecm/patches/0016-ecm-conditionally-check-mlo-device.patch b/qca-nss-ecm/patches/0016-ecm-conditionally-check-mlo-device.patch index d352982..5c0b62a 100644 --- a/qca-nss-ecm/patches/0016-ecm-conditionally-check-mlo-device.patch +++ b/qca-nss-ecm/patches/0016-ecm-conditionally-check-mlo-device.patch @@ -1,6 +1,6 @@ --- a/ecm_interface.c +++ b/ecm_interface.c -@@ -4057,7 +4057,11 @@ static uint32_t ecm_interface_multicast_ +@@ -4141,7 +4141,11 @@ static uint32_t ecm_interface_multicast_ * For MLO bond netdevice, destination for multicast is bond netdevice itself * Therefore, slave lookup is not needed. */ diff --git a/qca-nss-ecm/patches/0017-ecm-interface-fix-fortify_memcpy_chk.patch b/qca-nss-ecm/patches/0017-ecm-interface-fix-fortify_memcpy_chk.patch index 8aa3f3a..12596ae 100644 --- a/qca-nss-ecm/patches/0017-ecm-interface-fix-fortify_memcpy_chk.patch +++ b/qca-nss-ecm/patches/0017-ecm-interface-fix-fortify_memcpy_chk.patch @@ -1,6 +1,6 @@ --- a/ecm_interface.c +++ b/ecm_interface.c -@@ -8009,7 +8009,7 @@ static int ecm_interface_wifi_event_iwev +@@ -8537,7 +8537,7 @@ static int ecm_interface_wifi_event_iwev /* * Copy the base data structure to get iwe->len */ @@ -9,7 +9,7 @@ /* * Check that len is valid and that we have that much in the buffer. -@@ -8026,10 +8026,10 @@ static int ecm_interface_wifi_event_iwev +@@ -8554,10 +8554,10 @@ static int ecm_interface_wifi_event_iwev dpos = (char *)&iwe_buf.u.data.length; dlen = dpos - (char *)&iwe_buf; @@ -22,7 +22,7 @@ return -1; } -@@ -8037,7 +8037,7 @@ static int ecm_interface_wifi_event_iwev +@@ -8565,7 +8565,7 @@ static int ecm_interface_wifi_event_iwev * Check the flags of iw event if it indicates the IW authorized signal. */ if (iwe->u.data.flags == ECM_INTERFACE_WIFI_EVENT_NODE_AUTH) { @@ -31,7 +31,7 @@ if (!dbuf) { DEBUG_WARN("Failed to allocated a buffer to process the custom event"); return -1; -@@ -8060,16 +8060,16 @@ static int ecm_interface_wifi_event_iwev +@@ -8588,16 +8588,16 @@ static int ecm_interface_wifi_event_iwev return 0; } diff --git a/qca-nss-ecm/patches/0018-ecm-compat-nss-12_2.patch b/qca-nss-ecm/patches/0018-ecm-compat-nss-12_2.patch index 44c7d7e..7f72eea 100644 --- a/qca-nss-ecm/patches/0018-ecm-compat-nss-12_2.patch +++ b/qca-nss-ecm/patches/0018-ecm-compat-nss-12_2.patch @@ -1,6 +1,6 @@ --- a/frontends/nss/ecm_nss_non_ported_ipv4.c +++ b/frontends/nss/ecm_nss_non_ported_ipv4.c -@@ -855,7 +855,7 @@ static void ecm_nss_non_ported_ipv4_conn +@@ -880,7 +880,7 @@ static void ecm_nss_non_ported_ipv4_conn #endif break; case ECM_DB_IFACE_TYPE_RAWIP: @@ -9,7 +9,7 @@ nircm->valid_flags |= NSS_IPV4_RULE_CREATE_RAWIP_VALID; #else rule_invalid = true; -@@ -1072,7 +1072,7 @@ static void ecm_nss_non_ported_ipv4_conn +@@ -1122,7 +1122,7 @@ static void ecm_nss_non_ported_ipv4_conn #endif break; case ECM_DB_IFACE_TYPE_RAWIP: diff --git a/qca-nss-ecm/patches/0019-ecm-fix-missing-nl80211.patch b/qca-nss-ecm/patches/0019-ecm-fix-missing-nl80211.patch new file mode 100644 index 0000000..23c3abc --- /dev/null +++ b/qca-nss-ecm/patches/0019-ecm-fix-missing-nl80211.patch @@ -0,0 +1,10 @@ +--- a/ecm_interface.c ++++ b/ecm_interface.c +@@ -47,6 +47,7 @@ + #include + #include + #include ++#include + #include + #include + #ifdef ECM_INTERFACE_BOND_ENABLE diff --git a/wwan/app/luci-proto-quectel/htdocs/luci-static/resources/protocol/quectel.js b/wwan/app/luci-proto-quectel/htdocs/luci-static/resources/protocol/quectel.js index cce491a..f70ab3a 100644 --- a/wwan/app/luci-proto-quectel/htdocs/luci-static/resources/protocol/quectel.js +++ b/wwan/app/luci-proto-quectel/htdocs/luci-static/resources/protocol/quectel.js @@ -52,7 +52,7 @@ return network.registerProtocol('quectel', { }, renderFormOptions: function(s) { - var dev = this.getL3Device() || this.getDevice(), o; + var dev = this.getL3Device() || this.getDevice(), o, apn, apnv6; o = s.taboption('general', form.Value, '_modem_device', _('Modem device')); o.ucioption = 'device'; @@ -65,8 +65,13 @@ return network.registerProtocol('quectel', { }, this)); }; - o = s.taboption('general', form.Value, 'apn', _('APN')); - o.validate = function(section_id, value) { + o = s.taboption('general', form.Flag, 'multiplexing', _('Use IP Multiplexing')); + o.default = o.disabled; + + apn = s.taboption('general', form.Value, 'apn', _('APN')); + apn.depends('pdptype', 'ipv4v6'); + apn.depends('pdptype', 'ipv4'); + apn.validate = function(section_id, value) { if (value == null || value == '') return true; @@ -76,6 +81,24 @@ return network.registerProtocol('quectel', { return true; }; + apnv6 = s.taboption('general', form.Value, 'apnv6', _('IPv6 APN')); + apnv6.depends({ pdptype: 'ipv4v6', multiplexing: '1' }); + apnv6.depends({ pdptype: 'ipv6', multiplexing: '1' }); + apnv6.validate = function(section_id, value) { + if (value == null || value == '') + return true; + + if (!/^[a-zA-Z0-9\-.]*[a-zA-Z0-9]$/.test(value)) + return _('Invalid APN provided'); + + var apn_value = apn.formvalue(section_id); + + if (value.toLowerCase() === apn_value.toLowerCase()) + return _('APN IPv6 must be different from APN'); + + return true; + }; + o = s.taboption('general', form.Value, 'pincode', _('PIN')); o.datatype = 'and(uinteger,minlength(4),maxlength(8))'; @@ -99,13 +122,25 @@ return network.registerProtocol('quectel', { o = s.taboption('advanced', form.Value, 'delay', _('Modem init timeout'), _('Maximum amount of seconds to wait for the modem to become ready')); - o.placeholder = '10'; + o.placeholder = '5'; o.datatype = 'min(1)'; o = s.taboption('advanced', form.Value, 'mtu', _('Override MTU')); o.placeholder = dev ? (dev.getMTU() || '1500') : '1500'; o.datatype = 'max(9200)'; + o = s.taboption('advanced', form.Value, 'pdnindex', _('PDN index')); + o.depends({ pdptype: 'ipv4v6', multiplexing: '1' }); + o.depends({ pdptype: 'ipv4', multiplexing: '1' }); + o.placeholder = '1'; + o.datatype = 'and(uinteger,min(1),max(7))'; + + o = s.taboption('advanced', form.Value, 'pdnindexv6', _('IPv6 PDN index')); + o.depends({ pdptype: 'ipv4v6', multiplexing: '1' }); + o.depends({ pdptype: 'ipv6', multiplexing: '1' }); + o.placeholder = '2'; + o.datatype = 'and(uinteger,min(1),max(7))'; + o = s.taboption('general', form.ListValue, 'pdptype', _('PDP Type')); o.value('ipv4v6', 'IPv4/IPv6'); o.value('ipv4', 'IPv4'); @@ -120,5 +155,30 @@ return network.registerProtocol('quectel', { o.placeholder = '0'; o.datatype = 'uinteger'; o.depends('defaultroute', '1'); + + o = s.taboption('advanced', form.DynamicList, 'cell_lock_4g', _('4G Cell ID Lock')); + o.datatype = 'string'; + o.placeholder = _(','); + + o.validate = function(section_id, value) { + if (value === null || value === '') + return true; + + var parts = value.split(','); + if (parts.length !== 2) + return _('Must be two values separated by a comma(,)'); + + var isUnsignedInteger = function(str) { + return /^\d+$/.test(str); + }; + + if (!isUnsignedInteger(parts[0])) + return _('Invalid PCI!'); + + if (!isUnsignedInteger(parts[1])) + return _('Invalid EARFCN!'); + + return true; + }; } }); diff --git a/wwan/app/quectel-cm/files/quectel.sh b/wwan/app/quectel-cm/files/quectel.sh index 056a150..82f3948 100644 --- a/wwan/app/quectel-cm/files/quectel.sh +++ b/wwan/app/quectel-cm/files/quectel.sh @@ -10,7 +10,11 @@ proto_quectel_init_config() { available=1 no_device=1 proto_config_add_string "device:device" + proto_config_add_boolean "multiplexing" proto_config_add_string "apn" + proto_config_add_string "apnv6" + proto_config_add_string "pdnindex" + proto_config_add_string "pdnindexv6" proto_config_add_string "auth" proto_config_add_string "username" proto_config_add_string "password" @@ -22,21 +26,49 @@ proto_quectel_init_config() { proto_config_add_boolean "sourcefilter" proto_config_add_boolean "delegate" proto_config_add_int "mtu" + proto_config_add_array 'cell_lock_4g:list(string)' proto_config_add_defaults } proto_quectel_setup() { local interface="$1" - local device apn auth username password pincode delay pdptype + local device apn apnv6 auth username password pincode delay pdptype pdnindex pdnindexv6 multiplexing cell_lock_4g local dhcp dhcpv6 sourcefilter delegate mtu $PROTO_DEFAULT_OPTIONS local ip4table ip6table local pid zone - json_get_vars device apn auth username password pincode delay + json_get_vars device apn apnv6 auth username password pincode delay pdnindex pdnindexv6 multiplexing json_get_vars pdptype dhcp dhcpv6 sourcefilter delegate ip4table json_get_vars ip6table mtu $PROTO_DEFAULT_OPTIONS - [ -n "$delay" ] && sleep "$delay" + echo -ne "AT+CFUN=1\r\n" > /dev/ttyUSB2 + + [ -n "$delay" ] || delay="5" + sleep "$delay" + + if json_is_a cell_lock_4g array; then + echo "4G Cell ID Locking" + json_select cell_lock_4g + idx=1 + cell_ids="" + + while json_is_a ${idx} string + do + json_get_var cell_lock $idx + pci=$(echo $cell_lock | cut -d',' -f1) + earfcn=$(echo $cell_lock | cut -d',' -f2) + cell_ids="$cell_ids,$earfcn,$pci" + idx=$(( idx + 1 )) + done + idx=$(( idx - 1 )) + + if [ "$idx" -gt 0 ]; then + cell_ids="${idx}${cell_ids}" + echo -e "AT+QNWLOCK=\"COMMON/4G\",${cell_ids}" | atinout - /dev/ttyUSB2 - + fi + else + echo -e "AT+QNWLOCK=\"COMMON/4G\",0" | atinout - /dev/ttyUSB2 - + fi [ -n "$metric" ] || metric="0" [ -z "$ctl_device" ] || device="$ctl_device" @@ -66,19 +98,42 @@ proto_quectel_setup() { return 1 } - [ "$pdptype" = "ip" -o "$pdptype" = "ipv4v6" ] && ipv4opt="-4" + [ "$pdptype" = "ipv4" -o "$pdptype" = "ipv4v6" ] && ipv4opt="-4" [ "$pdptype" = "ipv6" -o "$pdptype" = "ipv4v6" ] && ipv6opt="-6" [ -n "$auth" ] || auth="none" - eval "proto_run_command '$interface' /usr/bin/quectel-cm -i '$ifname' $ipv4opt $ipv6opt ${pincode:+-p $pincode} -s '$apn' '$username' '$password' '$auth'" + quectel-qmi-proxy & + sleep 3 + + if [ "$multiplexing" = 1 ]; then + [ -n "$pdnindex" ] || pdnindex="1" + [ -n "$pdnindexv6" ] || pdnindexv6="2" + + if [ -n "$ipv4opt" ]; then + quectel-cm -i "$ifname" $ipv4opt -n $pdnindex -m 1 ${pincode:+-p $pincode} -s "$apn" "$username" "$password" "$auth" & + fi + if [ -n "$ipv6opt" ]; then + quectel-cm -i "$ifname" $ipv6opt -n $pdnindexv6 -m 2 ${pincode:+-p $pincode} -s "$apnv6" "$username" "$password" "$auth" & + fi + else + quectel-cm -i "$ifname" $ipv4opt $ipv6opt ${pincode:+-p $pincode} -s "$apn" "$username" "$password" "$auth" & + fi + sleep 5 ifconfig "$ifname" up - ifconfig "${ifname}_1" &>"/dev/null" && ifname="${ifname}_1" + ifconfig "${ifname}_1" &>"/dev/null" && ifname4="${ifname}_1" + + if [ "$multiplexing" = 1 ]; then + ifconfig "${ifname}_2" &>"/dev/null" && ifname6="${ifname}_2" + else + ifname6="$ifname4" + fi if [ -n "$mtu" ]; then echo "Setting MTU to $mtu" - /sbin/ip link set dev "$ifname" mtu "$mtu" + /sbin/ip link set dev "$ifname4" mtu "$mtu" + [ "$multiplexing" = 1 ] && /sbin/ip link set dev "$ifname6" mtu "$mtu" fi echo "Setting up $ifname" @@ -89,9 +144,11 @@ proto_quectel_setup() { zone="$(fw3 -q network "$interface" 2>/dev/null)" if [ "$pdptype" = "ipv6" ] || [ "$pdptype" = "ipv4v6" ]; then + ip -6 addr flush dev $ifname6 + json_init json_add_string name "${interface}_6" - json_add_string ifname "@$interface" + json_add_string device "$ifname6" [ "$pdptype" = "ipv4v6" ] && json_add_string iface_464xlat "0" json_add_string proto "dhcpv6" proto_add_dynamic_defaults @@ -105,10 +162,10 @@ proto_quectel_setup() { ubus call network add_dynamic "$(json_dump)" fi - if [ "$pdptype" = "ip" ] || [ "$pdptype" = "ipv4v6" ]; then + if [ "$pdptype" = "ipv4" ] || [ "$pdptype" = "ipv4v6" ]; then json_init json_add_string name "${interface}_4" - json_add_string ifname "@$interface" + json_add_string device "$ifname4" json_add_string proto "dhcp" [ -z "$ip4table" ] || json_add_string ip4table "$ip4table" proto_add_dynamic_defaults @@ -127,10 +184,10 @@ proto_quectel_teardown() { echo "Stopping network $interface" - proto_kill_command "$interface" - proto_init_update "*" 0 proto_send_update "$interface" + killall quectel-cm + killall quectel-qmi-proxy } [ -n "$INCLUDE_ONLY" ] || {