/* 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;
}
解释一下这些函数
最新发布