mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2025-12-10 07:44:50 +01:00
qosmngr: updated QoS clasification
l3 iptables rule with ethx was not matching this was causing incorrect classification to wrong queue. ebtables rule correction done with ethertype,protocol and port to classify packet for destination queue.
This commit is contained in:
parent
755442556d
commit
26a3790bbd
1 changed files with 257 additions and 8 deletions
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
IP_RULE=""
|
||||
BR_RULE=""
|
||||
BR6_RULE=""
|
||||
|
||||
POLICER_COUNT=0
|
||||
INTF_NAME=""
|
||||
|
|
@ -291,6 +292,7 @@ flush_chains() {
|
|||
|
||||
init_broute_rule() {
|
||||
BR_RULE=""
|
||||
BR6_RULE=""
|
||||
}
|
||||
|
||||
broute_filter_on_src_if() {
|
||||
|
|
@ -326,6 +328,82 @@ broute_filter_on_ether_type() {
|
|||
BR_RULE="$BR_RULE --proto $1"
|
||||
}
|
||||
|
||||
broute_filter_on_ether_type6() {
|
||||
BR6_RULE="$BR6_RULE --proto IPv6"
|
||||
}
|
||||
|
||||
ebt_match_src_ip() {
|
||||
BR_RULE="$BR_RULE --ip-src $1"
|
||||
}
|
||||
|
||||
ebt_match_dst_ip() {
|
||||
BR_RULE="$BR_RULE --ip-dst $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_src_ip() {
|
||||
BR_RULE="$BR_RULE --ip6-src $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dst_ip() {
|
||||
BR_RULE="$BR_RULE --ip6-dst $1"
|
||||
}
|
||||
|
||||
ebt_match_ip_src_port() {
|
||||
BR_RULE="$BR_RULE --ip-source-port $1"
|
||||
}
|
||||
|
||||
ebt_match_ip_dst_port() {
|
||||
BR_RULE="$BR_RULE --ip-destination-port $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_src_port() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-source-port $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-source-port $1"
|
||||
fi
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dst_port() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-destination-port $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-destination-port $1"
|
||||
fi
|
||||
}
|
||||
|
||||
ebt_match_ip_protocol() {
|
||||
BR_RULE="$BR_RULE --ip-proto $1"
|
||||
}
|
||||
|
||||
ebt_match_ipv6_protocol() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-proto $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-proto $1"
|
||||
fi
|
||||
}
|
||||
|
||||
ebt_match_ipv6_dscp() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE --ip6-tclass $1"
|
||||
else
|
||||
BR_RULE="$BR_RULE --ip6-tclass $1"
|
||||
fi
|
||||
}
|
||||
|
||||
broute_filter_on_dscp() {
|
||||
# The broadcom option --ip-dscp-extend actually accepts tos
|
||||
# and not dscp and that too in hex, hence, perform the conversion
|
||||
|
|
@ -352,11 +430,145 @@ broute_filter_on_vid() {
|
|||
}
|
||||
|
||||
broute_rule_set_traffic_class() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed so update BR6_RULE string as well otherwise
|
||||
#update BR_RULE only for installation of ipv6 proto rule only.
|
||||
BR_RULE="$BR_RULE -j mark --mark-or 0x$1 --mark-target ACCEPT"
|
||||
if [ ! -z "$BR6_RULE" ]; then
|
||||
BR6_RULE="$BR6_RULE -j mark --mark-or 0x$1 --mark-target ACCEPT"
|
||||
fi
|
||||
}
|
||||
|
||||
broute_append_rule() {
|
||||
#when ethertype is not configured by user then both proto rules of ipv4
|
||||
#and ipv6 to be installed otherwise install ipv6 proto rule only.
|
||||
echo "ebtables -t broute -A qos $BR_RULE" >> /tmp/qos/classify.ebtables
|
||||
if [ -n "$BR6_RULE" ]; then
|
||||
echo "ebtables -t broute -A qos $BR6_RULE" >> /tmp/qos/classify.ebtables
|
||||
fi
|
||||
}
|
||||
|
||||
set_ip_addr()
|
||||
{
|
||||
local cid=$1
|
||||
local match_src_ip_func=$2
|
||||
local match_dst_ip_func=$3
|
||||
|
||||
config_get src_ip "$cid" "src_ip"
|
||||
config_get dst_ip "$cid" "dest_ip"
|
||||
|
||||
if [ ! -z "$src_ip" ]; then
|
||||
$match_src_ip_func "$src_ip"
|
||||
fi
|
||||
|
||||
if [ ! -z "$dst_ip" ]; then
|
||||
$match_dst_ip_func "$dst_ip"
|
||||
fi
|
||||
}
|
||||
|
||||
set_ports()
|
||||
{
|
||||
local cid=$1
|
||||
local match_src_port_func=$2
|
||||
local match_dst_port_func=$3
|
||||
local src_port=""
|
||||
local dst_port=""
|
||||
local src_port_range=""
|
||||
local dst_port_range=""
|
||||
|
||||
config_get src_port "$cid" "src_port"
|
||||
config_get dst_port "$cid" "dest_port"
|
||||
config_get src_port_range "$cid" "src_port_range"
|
||||
config_get dst_port_range "$cid" "dest_port_range"
|
||||
|
||||
if ! [ -z $src_port ] && ! [ -z $src_port_range ]; then
|
||||
$match_src_port_func "$src_port:$src_port_range"
|
||||
elif [ ! -z $src_port ]; then
|
||||
$match_src_port_func $src_port
|
||||
fi
|
||||
|
||||
if ! [ -z $dst_port ] && ! [ -z $dst_port_range ]; then
|
||||
$match_dst_port_func "$dst_port:$dst_port_range"
|
||||
elif [ ! -z $dst_port ]; then
|
||||
$match_dst_port_func $dst_port
|
||||
fi
|
||||
}
|
||||
|
||||
protocol_string_to_num()
|
||||
{
|
||||
local value=-1
|
||||
|
||||
case "$1" in
|
||||
*[0-9]*) value="$1"
|
||||
;;
|
||||
TCP|tcp) value=6
|
||||
;;
|
||||
UDP|udp) value=17
|
||||
;;
|
||||
ICMP|icmp) value=1
|
||||
;;
|
||||
ICMPv6|icmpv6) value=58
|
||||
;;
|
||||
IGMP|igmp) value=2
|
||||
;;
|
||||
SCTP|sctp) value=132
|
||||
;;
|
||||
*) value=-1
|
||||
;;
|
||||
esac
|
||||
echo $value
|
||||
}
|
||||
|
||||
broute_ipv4_rule_options()
|
||||
{
|
||||
local cid=$1
|
||||
config_get protocol "$cid" "proto"
|
||||
config_get dscp_filter "$cid" "dscp_filter"
|
||||
|
||||
set_ip_addr $cid ebt_match_src_ip ebt_match_dst_ip
|
||||
|
||||
if [ ! -z $dscp_filter ]; then
|
||||
broute_filter_on_dscp "$dscp_filter"
|
||||
fi
|
||||
|
||||
if [ ! -z $protocol ]; then
|
||||
local proto_num=$(protocol_string_to_num "$protocol")
|
||||
ebt_match_ip_protocol "$proto_num"
|
||||
|
||||
#port installation for protol tcp/udp/sctp
|
||||
if [ $proto_num = "6" ] || [ $proto_num = "17" ] || [ $proto_num = "132" ] ; then
|
||||
set_ports "$cid" ebt_match_ip_src_port ebt_match_ip_dst_port
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
broute_ipv6_rule_options()
|
||||
{
|
||||
local cid=$1
|
||||
|
||||
config_get protocol "$cid" "proto"
|
||||
config_get dscp_filter "$cid" "dscp_filter"
|
||||
|
||||
set_ip_addr $cid ebt_match_ipv6_src_ip ebt_match_ipv6_dst_ip
|
||||
|
||||
if [ ! -z $dscp_filter ]; then
|
||||
local tos_val
|
||||
local tos_hex
|
||||
|
||||
tos_val=$(($dscp_filter<<2))
|
||||
tos_hex=$(printf "%x" $tos_val)
|
||||
ebt_match_ipv6_dscp "$tos_hex"
|
||||
fi
|
||||
|
||||
if [ ! -z $protocol ]; then
|
||||
local proto_num=$(protocol_string_to_num "$protocol")
|
||||
ebt_match_ipv6_protocol "$proto_num"
|
||||
|
||||
#port installation for protol tcp/udp/sctp
|
||||
if [ $proto_num = "6" ] || [ $proto_num = "17" ] || [ $proto_num = "132" ]; then
|
||||
set_ports "$cid" ebt_match_ipv6_src_port ebt_match_ipv6_dst_port
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
handle_ebtables_rules() {
|
||||
|
|
@ -364,6 +576,8 @@ handle_ebtables_rules() {
|
|||
local is_l2_rule=0
|
||||
local src_dhcp_options=""
|
||||
local dst_dhcp_options=""
|
||||
local protocol=""
|
||||
local ip_version=""
|
||||
|
||||
init_broute_rule
|
||||
|
||||
|
|
@ -381,8 +595,9 @@ handle_ebtables_rules() {
|
|||
config_get dst_clid "$sid" "dst_client_id" # dhcp option 61
|
||||
config_get src_ucid "$sid" "src_user_class_id" # dhcp option 77
|
||||
config_get dst_ucid "$sid" "dst_user_class_id" # dhcp option 77
|
||||
|
||||
config_get traffic_class "$sid" "traffic_class"
|
||||
config_get protocol "$sid" "proto"
|
||||
|
||||
|
||||
if [ -n "$src_if" ]; then
|
||||
for interf in $(db -q get hw.board.ethernetPortOrder); do
|
||||
|
|
@ -409,13 +624,6 @@ handle_ebtables_rules() {
|
|||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$dscp_filter" ]; then
|
||||
# filter on ethertype and proto is same thing
|
||||
broute_filter_on_ether_type IPv4
|
||||
broute_filter_on_dscp $dscp_filter
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ -n "$eth_type" ]; then
|
||||
broute_filter_on_ether_type $eth_type
|
||||
is_l2_rule=1
|
||||
|
|
@ -426,6 +634,47 @@ handle_ebtables_rules() {
|
|||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
case $eth_type in
|
||||
IPv4|IPV4|0800)
|
||||
ip_version=4
|
||||
;;
|
||||
IPv6|IPV6|86DD)
|
||||
ip_version=6
|
||||
;;
|
||||
*)
|
||||
if [ -z "$eth_type" ]; then
|
||||
case $src_ip$dest_ip in
|
||||
*.*)
|
||||
ip_version=4
|
||||
broute_filter_on_ether_type "IPv4"
|
||||
;;
|
||||
*:*)
|
||||
ip_version=6
|
||||
broute_filter_on_ether_type "IPv6"
|
||||
;;
|
||||
*)
|
||||
if [ -n "$protocol" ] || [ -n "$dscp_filter" ]; then
|
||||
ip_version=1 #neither ether_type nor ip address used
|
||||
#ethertype is not configured by user so install
|
||||
#both proto ipv4 and ipv6 rule
|
||||
BR6_RULE="$BR_RULE"
|
||||
broute_filter_on_ether_type "IPv4"
|
||||
broute_filter_on_ether_type6 "IPv6"
|
||||
fi
|
||||
esac
|
||||
fi
|
||||
esac
|
||||
|
||||
if [ $ip_version = "4" ] || [ $ip_version = "1" ]; then
|
||||
broute_ipv4_rule_options "$sid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
if [ $ip_version = "6" ] || [ $ip_version = "1" ]; then
|
||||
broute_ipv6_rule_options "$sid"
|
||||
is_l2_rule=1
|
||||
fi
|
||||
|
||||
# first process options that will help figure our source mac address
|
||||
# dhcp option for "vendor class id"
|
||||
if [ -n "$src_vcid" ]; then
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue