Qualcomm NSS硬件加速简介

前言

随着移动互联网的普及,基础带宽的提升,各种视频等富媒体应用越来越多的情况下,对于路由器的挑战也越来越大,普通的路由器已经无法满足用户对带宽的需求,而传统普通家用路由器一般采用Linux操作系统,其数据报文的处理都是通过中断来实现的,这就导致了CPU占用率非常高,网络的吞吐量上不去,用户的体验不佳,因此产生了很多的新技术,如DPDK等方案的产生,都是通过将数据报文的处理导到应用层通过轮询的方式来解决。而针对路由器,方案厂商采用多核技术将其中一个CPU专门用来处理网络数据包俗称NPU,这里介绍的高通的方案就是NSS(Network Sub-System).

架构图示

在这里插入图片描述

如何将一条连接加入NSS

在这里插入图片描述

默认情况下,数据报文走的还是Linux 的网络协议栈,只有启用了NSS,并且其数据报文请求符合一定的规则后,其才会被加入到NSS中,下次符合这个条件的数据报文就直接通过NSS转发到目的接口了,省去了多余的中断等操作。进而提升了整个数据传输的性能,降低了CPU的负载,网络设备的性能显著提升。

/* Copyright © 2024 TP-Link Systems Inc. * * file oal_iqos_sw.c * brief BBA platform iqos functions. * * author Hong Mingyu * version 1.0.0 * date 14Jun22 * * history \arg 1.0.0, 14Jun22, Hong Mingyu, Create the file. */ #include <stdlib.h> #include <dm_objType.h> #include <dm_objId.h> #include <rsl.h> #include <oal_iqos.h> #include "oal_util.h" #include <sys/stat.h> #include <unistd.h> /**************************************************************************************************/ /* DEFINES */ /**************************************************************************************************/ /* * brief Macro to determine if the string is null. */ #define STR_IS_EMPTY(x) ('\0' == x[0]) #define IQOS_DEF_DB_FILE "/etc/iqos/database.bin" #define IQOS_DB_FILE "/var/iqos_database.bin" #define IQOS_DB_RULE_FILE "/var/iqos_db_rules" #define IPTV_SERVICE "IPTV" #define IPTV_MASK "0x100" #if (defined INCLUDE_SPEC_HC220) || (defined INCLUDE_SPEC_MX50V) || (defined INCLUDE_SPEC_HX220) \ || (defined INCLUDE_SPEC_VX230v) || (defined INCLUDE_SPEC_EC223) || (defined INCLUDE_SPEC_NX510V) \ || defined(INCLUDE_SPEC_VX231) || (defined INCLUDE_SPEC_EX230v) || (defined INCLUDE_SPEC_XX230v) \ || defined(INCLUDE_SPEC_VX1800v) || defined(INCLUDE_SPEC_EX230vV2) || defined(INCLUDE_SPEC_VX232v) \ || defined(INCLUDE_SPEC_MR500V2) #define EXCLUDE_LAN "eth0" #define EXCLUDE_WAN "eth1.+" #elif defined (INCLUDE_QCA_12_1) || defined (INCLUDE_QUECTEL_RG650V) #define EXCLUDE_LAN "" #define EXCLUDE_WAN MACRO_TO_STR(INCLUDE_REAL_NAME_EWAN) #elif defined (INCLUDE_SPEC_M8550) #define EXCLUDE_LAN "" #define EXCLUDE_WAN MACRO_TO_STR(INCLUDE_REAL_NAME_EWAN) #else /* 需各机型定义宏 */ #error no implement #endif /**************************************************************************************************/ /* LOCAL_PROTOTYPES */ /**************************************************************************************************/ static CMM_RET oal_iqos_sw_enableParentClass(IQOS_CFG *pIqosCfg); static CMM_RET oal_iqos_sw_enableMainUpClass(IQOS_CFG *pIqosCfg); static CMM_RET oal_iqos_sw_enableMainDownClass(IQOS_CFG *pIqosCfg); static CMM_RET oal_iqos_sw_setWANmark(QOS_OP_CODE op); static CMM_RET oal_iqos_sw_enableRootQdisc(); static CMM_RET oal_iqos_sw_disableRootQdisc(); static CMM_RET oal_iqos_sw_insmode(); static CMM_RET oal_iqos_sw_addMacRule(const char *pMac, UINT8 ruleClass); static CMM_RET oal_iqos_sw_delMacRule(const char *pMac, UINT8 ruleClass); static CMM_RET oal_iqos_sw_enableRouteClass(IQOS_CFG *pIqosCfg); static CMM_RET oal_iqos_sw_enableIptvBothClass(IQOS_CFG *pIqosCfg); static CMM_RET oal_iqos_sw_addIPTVRule(); static void oal_iqos_sw_disablePPA(); static void oal_iqos_sw_enablePPA(); /**************************************************************************************************/ /* LOCAL_FUNCTIONS */ /**************************************************************************************************/ /* * fn CMM_RET oal_iqos_sw_insmode() * * brief 插入iqos模块必须的ko文件。 * details * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_insmode() { UTIL_EXEC_SYSTEM("echo 1 > /proc/sys/net/netfilter/nf_conntrack_acct"); return CMM_OK; } /* * fn CMM_RET oal_iqos_sw_enableRootQdisc() * * brief 启用上下行两个方向上的根队列规则。 * details * * param[in] pDB - 指向iqos数据库的起始位置。 * param[in] dbLen - iqos数据库的长度,当为0时,代表使用默认数据库。 * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_enableRootQdisc() { UTIL_EXEC_SYSTEM("ifconfig ifb0 up"); UTIL_EXEC_SYSTEM("tc qdisc add dev ifb0 root handle 1: htb default 3"); UTIL_EXEC_SYSTEM("ifconfig ifb1 up"); UTIL_EXEC_SYSTEM("tc qdisc add dev ifb1 root handle 2: htb default 3"); UTIL_EXEC_SYSTEM("ebtables -N IQOS_MARK_INPUT"); UTIL_EXEC_SYSTEM("ebtables -N IQOS_MARK_FWD"); UTIL_EXEC_SYSTEM("ebtables -N IQOS_MARK_OUTPUT"); UTIL_EXEC_SYSTEM("ebtables -t broute -N IQOS_MARK_IPTV"); UTIL_EXEC_SYSTEM("ebtables -A INPUT -j IQOS_MARK_INPUT"); UTIL_EXEC_SYSTEM("ebtables -A FORWARD -j IQOS_MARK_FWD"); UTIL_EXEC_SYSTEM("ebtables -A OUTPUT -j IQOS_MARK_OUTPUT"); UTIL_EXEC_SYSTEM("ebtables -t broute -A BROUTING -j IQOS_MARK_IPTV"); return CMM_OK; } /* * fn CMM_RET oal_iqos_sw_disableRootQdisc() * * brief 停用上下行两个方向上的根队列规则。 * details * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_disableRootQdisc() { UTIL_EXEC_SYSTEM("tc qdisc del dev ifb0 root"); UTIL_EXEC_SYSTEM("ifconfig ifb0 down"); UTIL_EXEC_SYSTEM("iptables -F FWD_MARK_LAN"); UTIL_EXEC_SYSTEM("tc qdisc del dev ifb1 root"); UTIL_EXEC_SYSTEM("ifconfig ifb1 down"); UTIL_EXEC_SYSTEM("iptables -F FWD_MARK_WAN"); /*清空ebtables表*/ UTIL_EXEC_SYSTEM("ebtables -F IQOS_MARK_INPUT"); UTIL_EXEC_SYSTEM("ebtables -F IQOS_MARK_FWD"); UTIL_EXEC_SYSTEM("ebtables -F IQOS_MARK_OUTPUT"); UTIL_EXEC_SYSTEM("ebtables -t broute -F IQOS_MARK_IPTV"); /*删除ebtables表跳转自定义表链规则*/ UTIL_EXEC_SYSTEM("ebtables -D INPUT -j IQOS_MARK_INPUT"); UTIL_EXEC_SYSTEM("ebtables -D FORWARD -j IQOS_MARK_FWD"); UTIL_EXEC_SYSTEM("ebtables -D OUTPUT -j IQOS_MARK_OUTPUT"); UTIL_EXEC_SYSTEM("ebtables -t broute -D BROUTING -j IQOS_MARK_IPTV"); /*删除ebtables自定义表链*/ UTIL_EXEC_SYSTEM("ebtables -X IQOS_MARK_INPUT"); UTIL_EXEC_SYSTEM("ebtables -X IQOS_MARK_FWD"); UTIL_EXEC_SYSTEM("ebtables -X IQOS_MARK_OUTPUT"); UTIL_EXEC_SYSTEM("ebtables -t broute -X IQOS_MARK_IPTV"); return CMM_OK; } /* * fn CMM_RET oal_iqos_sw_enableParentClass(IQOS_CFG *pIqosCfg) * * brief 启用iqos上下行htb队列规则的父类。 * details * * param[in] upBW - 上行总带宽。 * param[in] downBW - 下行总带宽。 * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_enableParentClass(IQOS_CFG *pIqosCfg) { UTIL_EXEC_SYSTEM("tc class add dev ifb0 parent 1:0 classid 1:1 " "htb rate %dkbit ceil %dkbit", pIqosCfg->upBW, pIqosCfg->upBW); UTIL_EXEC_SYSTEM("tc class add dev ifb1 parent 2:0 classid 2:1 " "htb rate %dkbit ceil %dkbit", pIqosCfg->downBW, pIqosCfg->downBW); return CMM_OK; } /* * fn CMM_RET oal_iqos_sw_enableVoipClass(UINT32 voipBW) * * brief 启用iqos上行voip类。 * details * * param[in] voipBW - voip上行带宽。 * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_enableVoipClass(UINT8 voipClass) { return CMM_OK; } /* * fn CMM_RET oal_iqos_sw_enableRouteClass(IQOS_CFG *pIqosCfg) * * brief 启用iqos上行路由类。 * details * * param[in] routeBW - 路由器上行流量带宽。 * param[in] upBW - 上行总带宽。 * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_enableRouteClass(IQOS_CFG *pIqosCfg) { UTIL_EXEC_SYSTEM("iptables -A OUTPUT_MARK_LOCAL -j MARK --or-mark 0x100"); UTIL_EXEC_SYSTEM("tc class add dev ifb0 parent 1:1 classid 1:100 " "htb rate %dkbit ceil %dkbit", pIqosCfg->routeUpBW, pIqosCfg->upBW); UTIL_EXEC_SYSTEM("tc filter add dev ifb0 parent 1:0 protocol " "all handle 0x100 fw classid 1:100"); UTIL_EXEC_SYSTEM("tc qdisc add dev ifb0 parent 1:100 handle 100: pfifo limit 32"); return CMM_OK; } /* * fn CMM_RET oal_iqos_sw_enableMainUpClass(IQOS_CFG *pIqosCfg) * * brief 启用上行iqos high,middle及low类规则。 * details * * param[in] lowBW - 低等级的上行带宽。 * param[in] midBW - 中等级即默认等级的上行带宽。 * param[in] highBW - 高等级类别的上行带宽。 * param[in] upBW - 上行总带宽。 * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_enableMainUpClass(IQOS_CFG *pIqosCfg) { UTIL_EXEC_SYSTEM("tc class add dev ifb0 parent 1:1 classid 1:2 " "htb rate %dkbit ceil %dkbit", pIqosCfg->lowUpBW, pIqosCfg->upBW); UTIL_EXEC_SYSTEM("tc filter add dev ifb0 parent 1:0 protocol " "all handle 0x2 fw classid 1:2"); UTIL_EXEC_SYSTEM("tc qdisc add dev ifb0 parent 1:2 handle 12: sfq perturb 10"); UTIL_EXEC_SYSTEM("tc class add dev ifb0 parent 1:1 classid 1:3 " "htb rate %dkbit ceil %dkbit", pIqosCfg->midUpBW, pIqosCfg->upBW); UTIL_EXEC_SYSTEM("tc filter add dev ifb0 parent 1:0 protocol " "all handle 0x3 fw classid 1:3"); UTIL_EXEC_SYSTEM("tc qdisc add dev ifb0 parent 1:3 handle 13: sfq perturb 10"); UTIL_EXEC_SYSTEM("tc class add dev ifb0 parent 1:1 classid 1:4 " "htb rate %dkbit ceil %dkbit", pIqosCfg->highUpBW, pIqosCfg->upBW); UTIL_EXEC_SYSTEM("tc filter add dev ifb0 parent 1:0 protocol " "all handle 0x4 fw classid 1:4"); UTIL_EXEC_SYSTEM("tc qdisc add dev ifb0 parent 1:4 handle 14: sfq perturb 10"); return CMM_OK; } /* * fn CMM_RET oal_iqos_sw_enableMainDownClass(IQOS_CFG *pIqosCfg) * * brief 启用下行iqos high,middle及low类规则。 * details * * param[in] lowBW - 低等级的下行带宽。 * param[in] midBW - 中等级即默认等级的下行带宽。 * param[in] highBW - 高等级类别的下行带宽。 * param[in] downBW - 下行总带宽。 * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_enableMainDownClass(IQOS_CFG *pIqosCfg) { UTIL_EXEC_SYSTEM("tc class add dev ifb1 parent 2:1 classid 2:2 " "htb rate %dkbit ceil %dkbit", pIqosCfg->lowDownBW, pIqosCfg->downBW); UTIL_EXEC_SYSTEM("tc filter add dev ifb1 parent 2:0 protocol " "all handle 0x8002 fw classid 2:2"); UTIL_EXEC_SYSTEM("tc qdisc add dev ifb1 parent 2:2 handle 22: sfq perturb 10"); UTIL_EXEC_SYSTEM("tc class add dev ifb1 parent 2:1 classid 2:3 " "htb rate %dkbit ceil %dkbit", pIqosCfg->midDownBW, pIqosCfg->downBW); UTIL_EXEC_SYSTEM("tc filter add dev ifb1 parent 2:0 protocol " "all handle 0x8003 fw classid 2:3"); UTIL_EXEC_SYSTEM("tc qdisc add dev ifb1 parent 2:3 handle 23: sfq perturb 10"); UTIL_EXEC_SYSTEM("tc class add dev ifb1 parent 2:1 classid 2:4 " "htb rate %dkbit ceil %dkbit", pIqosCfg->highDownBW, pIqosCfg->downBW); UTIL_EXEC_SYSTEM("tc filter add dev ifb1 parent 2:0 protocol " "all handle 0x8004 fw classid 2:4"); UTIL_EXEC_SYSTEM("tc qdisc add dev ifb1 parent 2:4 handle 24: sfq perturb 10"); return CMM_OK; } /* * fn CMM_RET oal_iqos_sw_addMacRule(const char *pMac, UINT8 ruleClass) * * brief 根据mac对相应数据包打上相应mark。 * details * * param[in] pMac - 指向mac字符串。 * param[in] ruleClass - iqos条目等级。 * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_addMacRule(const char *pMac, UINT8 ruleClass) { UTIL_EXEC_SYSTEM("ebtables -A IQOS_MARK_INPUT -s %s " "-j mark --set-mark 0x%d", pMac, ruleClass); UTIL_EXEC_SYSTEM("ebtables -A IQOS_MARK_INPUT -s %s -j RETURN", pMac); UTIL_EXEC_SYSTEM("ebtables -A IQOS_MARK_OUTPUT -d %s " "-j mark --set-mark 0x800%d", pMac, ruleClass); UTIL_EXEC_SYSTEM("ebtables -A IQOS_MARK_OUTPUT -d %s -j RETURN", pMac); return CMM_OK; } /* * fn CMM_RET oal_iqos_sw_delMacRule(const char *pMac, UINT8 ruleClass) * * brief 删除mac rule条目的相应mark。 * details * * param[in] pMac - 指向mac字符串。 * param[in] ruleClass - iqos条目等级。 * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_delMacRule(const char *pMac, UINT8 ruleClass) { UTIL_EXEC_SYSTEM("ebtables -D IQOS_MARK_INPUT -s %s " "-j mark --set-mark 0x%d", pMac, ruleClass); UTIL_EXEC_SYSTEM("ebtables -D IQOS_MARK_INPUT -s %s -j RETURN", pMac); UTIL_EXEC_SYSTEM("ebtables -D IQOS_MARK_OUTPUT -d %s " "-j mark --set-mark 0x800%d", pMac, ruleClass); UTIL_EXEC_SYSTEM("ebtables -D IQOS_MARK_OUTPUT -d %s -j RETURN", pMac); return CMM_OK; } /* * fn CMM_RET oal_iqos_sw_enableIptvBothClass(IQOS_CFG *pIqosCfg) * * brief 建立iptv流量管控的类 * details * * param[in] iptvBW - iptv预留的带宽。 * param[in] upBW - qos上行总带宽。 * param[in] downBW - qos下行总带宽。 * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_enableIptvBothClass(IQOS_CFG *pIqosCfg) { #ifdef INCLUDE_WPB_ETH_BINDING UTIL_EXEC_SYSTEM("tc class add dev ifb1 parent 2:1 classid 2:5 " "htb rate %dkbit ceil %dkbit", pIqosCfg->iptvBW, pIqosCfg->downBW); #endif /* INCLUDE_WPB_ETH_BINDING */ UTIL_EXEC_SYSTEM("tc filter add dev ifb1 parent 2:0 protocol " "all handle 0x8005 fw classid 2:5"); UTIL_EXEC_SYSTEM("tc qdisc add dev ifb1 parent 2:5 handle 25: sfq perturb 10"); return CMM_OK; } /* * fn CMM_RET oal_iqos_sw_addIPTVRule() * * brief 建立iptv下行的QOS规则 * details * * param[in] iptvBW - iptv预留的带宽。 * param[in] iptvClass - iptv qos条目等级。 * * return CMM_RET * * note */ CMM_RET oal_iqos_sw_addIPTVRule() { CMM_RET ret = CMM_OK; DM_NUM_STACK interfaceStack = EMPTY_STACK_NUM; DEV2_IP_INTF_OBJ ipIntfObj; while (CMM_OK == rsl_getNextObj(CMM_UI_INTERNAL, OID_DEV2_IP_INTF, &interfaceStack, sizeof(DEV2_IP_INTF_OBJ), &ipIntfObj)) { if (strcmp(IPTV_SERVICE,ipIntfObj.X_TP_ServiceType)==0) { UTIL_EXEC_SYSTEM("ebtables -t broute -A IQOS_MARK_IPTV -i %s " "-j mark --set-mark 0x8005", ipIntfObj.name); UTIL_EXEC_SYSTEM("ebtables -t broute -A IQOS_MARK_IPTV -i %s " "-j RETURN", ipIntfObj.name); } } return ret; } CMM_RET oal_iqos_sw_setSpecialWanIfRule(const char *ifname, QOS_OP_CODE op) { if (QOS_DEL == op) { UTIL_EXEC_SYSTEM("iptables -t mangle -D FORWARD -j zone_wan_qos -i %s", ifname); } if (QOS_ADD == op) { UTIL_EXEC_SYSTEM("iptables -t mangle -D FORWARD -j zone_wan_qos -i %s", ifname); UTIL_EXEC_SYSTEM("iptables -t mangle -A FORWARD -j zone_wan_qos -i %s", ifname); } return CMM_OK; } /* * fn void oal_iqos_sw_disablePPA() * brief In order to enable the iqos module. * details * * param[in] N/A * param[out] N/A * * return N/A */ void oal_iqos_sw_disablePPA() { /* oal_ppa.c文件暂无,先注释掉,这里直接调用nss命令。*/ /*以下是卸载QCA平台的NSS和SFE,目前IQOS暂不适配软加速,其他平台移植时需关闭软加速和硬加速*/ #ifdef INCLUDE_QUALCOMM UTIL_EXEC_SYSTEM("/etc/init.d/qca-nss-ecm stop"); UTIL_EXEC_SYSTEM("rmmod shortcut-fe-cm"); UTIL_EXEC_SYSTEM("rmmod shortcut-fe-ipv6"); UTIL_EXEC_SYSTEM("rmmod shortcut-fe"); #endif #ifdef INCLUDE_MTK UTIL_EXEC_SYSTEM("echo 5 > /proc/tplink/ppe_debug"); #endif #ifdef INCLUDE_ECONET UTIL_EXEC_SYSTEM("echo 7 > /proc/tc3162/hwnat_off"); #endif #ifdef INCLUDE_QUECTEL_RG650V UTIL_EXEC_SYSTEM("pgrep -x /usr/bin/ipacm | xargs kill -SIGUSR1"); #endif /*INCLUDE_QUECTEL_RG650V*/ return ; } /* * fn void oal_iqos_sw_enablePPA() * brief In order to disable the iqos module. * details * * param[in] N/A * param[out] N/A * * return N/A */ void oal_iqos_sw_enablePPA() { /* oal_ppa.c文件暂无,先注释掉,这里直接调用nss命令。*/ /*以下是卸载QCA平台的NSS和SFE,其他平台移植时需关闭软加速和硬加速*/ #ifdef INCLUDE_QUALCOMM UTIL_EXEC_SYSTEM("/etc/init.d/qca-nss-ecm stop"); UTIL_EXEC_SYSTEM("/etc/init.d/qca-nss-ecm start"); UTIL_EXEC_SYSTEM("insmod /lib/modules/shortcut-fe.ko"); UTIL_EXEC_SYSTEM("insmod /lib/modules/shortcut-fe-ipv6.ko"); UTIL_EXEC_SYSTEM("insmod /lib/modules/shortcut-fe-cm.ko"); #endif #ifdef INCLUDE_MTK UTIL_EXEC_SYSTEM("echo 6 > /proc/tplink/ppe_debug"); #endif #ifdef INCLUDE_ECONET UTIL_EXEC_SYSTEM("echo 0 > /proc/tc3162/hwnat_off"); #endif #ifdef INCLUDE_QUECTEL_RG650V UTIL_EXEC_SYSTEM("pgrep -x /usr/bin/ipacm | xargs kill -SIGUSR2"); #endif /*INCLUDE_QUECTEL_RG650V*/ return ; } CMM_RET oal_qos_setSpecialWanItfQdisc(const char *wanItfName, QOS_OP_CODE op) { struct stat filestat; UTIL_EXEC_SYSTEM("tc filter show dev %s > /var/qos_filters", wanItfName); if (QOS_DEL == op) { if (0 == stat("/var/qos_filters", &filestat)) { if (0 == filestat.st_size) {/* filter for the interface already non-exits, no need to del again. */ return CMM_OK; } } /* del dev's root qdisc */ UTIL_EXEC_SYSTEM("tc qdisc del dev %s root handle 10: prio", wanItfName); } else if (QOS_ADD == op) { if (0 == stat("/var/qos_filters", &filestat)) { if (filestat.st_size > 0) {/* filter for the interface already exits, no need to add again. */ return CMM_OK; } } /* add prio qdisc for dev as it's root qdisc */ UTIL_EXEC_SYSTEM("tc qdisc add dev %s root handle 10: prio", wanItfName); /* add u32 filter and mirred action */ UTIL_EXEC_SYSTEM("tc filter add dev %s parent 10: protocol all prio 1 " "u32 match u32 0 0 flowid 10:1 action mirred egress redirect dev %s", wanItfName, VM_WAN_INTERFACE); } else { CMM_ERR("operation(%d) is not supported!\n", op); return CMM_ERROR; } return CMM_OK; } /* * fn CMM_RET oal_intf_setSpecialLanItfQdisc(const char *itfName, QOS_OP_CODE op) * brief 对于LAN侧的二层接口(比如eth0),将来自WAN的流量导向到虚拟接口ifb1 * (来自LAN的流量不进入带控模块处理),或取消流量的导向。 * details * * param[in] itfName - 指向接口名称的指针。 * param[in] op - 操作码,可以为QOS_ADD、QOS_DEL,其他操作不支持。 * * return CMM_OK/CMM_ERROR * * note tc filter add dev eth0 parent 10: protocol all prio 1 handle 0x00008000 fw mask * 0x00008000 classid 10:1 action mirred egress redirect dev ifb1----将来自wan的流量导向到 * 虚拟接口ifb1 */ CMM_RET oal_qos_setSpecialLanItfQdisc(const char *itfName, QOS_OP_CODE op) { struct stat filestat; CASSERT(NULL != itfName); /*不针对eth0做流量重定向,避免数据包再次进入ifb1设备*/ if (!strcmp(itfName,EXCLUDE_LAN)) { return CMM_OK; } if (QOS_DEL == op) { UTIL_EXEC_SYSTEM("tc filter show dev %s > /var/qos_filters", itfName); if (0 == stat("/var/qos_filters", &filestat)) { if (0 == filestat.st_size) {/* filter for the interface already non-exits, no need to del again. */ return CMM_OK; } } /* del dev's root qdisc */ UTIL_EXEC_SYSTEM("tc qdisc del dev %s root handle 10: prio", itfName); } else if (QOS_ADD == op) { UTIL_EXEC_SYSTEM("tc filter show dev %s > /var/qos_filters", itfName); if (0 == stat("/var/qos_filters", &filestat)) { if (filestat.st_size > 0) {/* filter for the interface already exits, no need to add again. */ return CMM_OK; } } /* add prio qdisc for dev as it's root qdisc */ UTIL_EXEC_SYSTEM("tc qdisc add dev %s root handle 10: prio", itfName); /* add fw filter and mirred action * 将所有来自wan的流量导向到LAN侧虚拟接口,而来自lan内的流量则不导向到虚拟接口。 * 利用fw filter的mask字段,只要给所有来自wan的流量设置过MASK_FOR_WAN2LAN,就能 * 帮助fw filter区分出来自wan的流量。*/ /* 修改fw mask,2016-02-03,wanglian */ UTIL_EXEC_SYSTEM("tc filter add dev %s parent 10: protocol all prio 1 handle 0x%x/0x%x " "fw classid 10:1 action mirred egress redirect dev %s", itfName, MASK_FOR_WAN2LAN, MASK_FOR_WAN2LAN, VM_LAN_INTERFACE); } else { CMM_ERR("operation(%d) is not supported!\n", op); return CMM_ERROR; } return CMM_OK; } CMM_RET oal_iqos_sw_setWANmark(QOS_OP_CODE op) { CASSERT(QOS_ADD == op || QOS_DEL == op); if (QOS_ADD == op) { UTIL_EXEC_SYSTEM("iptables -I FORWARD -i %s -j MARK --set-mark 0x%x", EXCLUDE_WAN, MASK_FOR_WAN2LAN); } else if (QOS_DEL == op) { UTIL_EXEC_SYSTEM("iptables -D FORWARD -i %s -j MARK --set-mark 0x%x", EXCLUDE_WAN, MASK_FOR_WAN2LAN); } return CMM_OK; } /**************************************************************************************************/ /* Function Hooking */ /**************************************************************************************************/ OAL_IQOS_FUNCS_TABLE oal_iqos_funcs = { .oal_iqos_enableRouteClass = oal_iqos_sw_enableRouteClass, .oal_iqos_enableIptvBothClass = oal_iqos_sw_enableIptvBothClass, .oal_iqos_addIPTVRule = oal_iqos_sw_addIPTVRule, .oal_iqos_setWANmark = oal_iqos_sw_setWANmark, .oal_iqos_enableRootQdisc = oal_iqos_sw_enableRootQdisc, .oal_iqos_enableParentClass = oal_iqos_sw_enableParentClass, .oal_iqos_insmode = oal_iqos_sw_insmode, .oal_iqos_enableMainUpClass = oal_iqos_sw_enableMainUpClass, .oal_iqos_enableMainDownClass = oal_iqos_sw_enableMainDownClass, .oal_iqos_disableRootQdisc = oal_iqos_sw_disableRootQdisc, .oal_iqos_addMacRule = oal_iqos_sw_addMacRule, .oal_iqos_delMacRule = oal_iqos_sw_delMacRule, .oal_iqos_disablePPA = oal_iqos_sw_disablePPA, .oal_iqos_enablePPA = oal_iqos_sw_enablePPA, }; /**************************************************************************************************/ /* PUBLIC_FUNCTIONS */ /**************************************************************************************************/ const OAL_IQOS_FUNCS_TABLE* oal_iqos_supp_getOalFuncsTable() { const OAL_IQOS_FUNCS_TABLE *pOalFuncsTable = NULL; pOalFuncsTable = &oal_iqos_funcs; return pOalFuncsTable; } 解释一下这些函数
最新发布
09-19
### NSS 加速与优化技术 NSS(Network Security Services)是由 Mozilla 提供的一套开源安全库,广泛用于实现 SSL/TLS、PKI 等安全通信协议。在实际应用中,尤其是在高并发网络服务中,NSS 的性能优化至关重要。 #### 1. 使用共享库(Shared Libraries) NSS 支持以动态链接库的形式部署,这不仅有助于减少内存占用,还能提高加载速度和维护效率。通过使用共享库,可以避免每次编译应用程序时都重新链接 NSS 源代码,从而加快构建过程并简化升级流程[^1]。 #### 2. 利用硬件加速 现代 CPU 和 GPU 都提供了对加密操作的硬件加速支持。例如,Intel 的 AES-NI 指令集可以显著提升 AES 加密/解密的速度。在 NSS 中启用这些特性可以通过配置选项来完成,确保 NSS 能够充分利用底层硬件资源,进而提高整体性能。 #### 3. 缓存机制 为了减少重复计算带来的开销,可以在适当的位置引入缓存机制。比如,在 TLS 握手过程中频繁使用的会话票据(Session Tickets)信息就可以被缓存起来,以便后续连接快速恢复而无需再次执行完整的握手过程。 #### 4. 并行处理与异步 I/O 通过多线程或者事件驱动的方式处理多个请求,可以使 NSS 更好地应对高并发场景下的挑战。此外,采用异步 I/O 操作能够有效降低等待时间,提高数据传输效率。 #### 5. 定期更新与维护 保持 NSS 库及其依赖项为最新版本对于获得最新的功能改进及安全补丁非常重要。定期检查官方发布的更新日志,并及时进行相应的升级工作,是维持系统稳定性和安全性不可或缺的一部分。 ```c // 示例:启用硬件加速功能 #include <nss.h> #include <pk11func.h> int main() { // 初始化 NSS if (NSS_Init("/path/to/certdb") != SECSuccess) { // 处理错误 } // 启用特定的硬件加速模块 PK11_SetAttributeFuncs(PK11_ATTRFUNC_HARDWARE); // ... 其他初始化代码 ... return 0; } ``` 上述代码片段展示了如何在程序中启用 NSS硬件加速特性。需要注意的是,具体实现可能根据实际环境有所差异,建议查阅官方文档获取最准确的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钱国正

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值