📄 pm5337_eos_eapo.tcl
字号:
set i4 [string index $input 4]
set i5 [string index $input 5 ]
set i6 [string index $input 6 ]
set i7 [string index $input 7 ]
set i8 [string index $input 8 ]
set i9 [string index $input 9 ]
set i10 [string index $input 10]
set i11 [string index $input 11]
set i12 [string index $input 12]
set i13 [string index $input 13]
set i14 [string index $input 14]
set i15 [string index $input 15]
set i16 [string index $input 16]
set i17 [string index $input 17]
set lsb "0x$i10$i11$i12$i13$i14$i15$i16$i17"
set msb "0x$i2$i3$i4$i5$i6$i7$i8$i9"
}
# When the mask in only on the lower 32 bit
if {$msbpos <= 31} {
set masksize [expr $msbpos - $lsbpos]
if {$masksize == 31} {
return $lsb
}
if {$masksize == 30 && $lsbpos == 0} {
set mask 0x7FFFFFFF
set output [dec2hex [expr $mask & $lsb]]
return $output
}
if {$masksize == 30 && $lsbpos == 1} {
set mask 0x7FFFFFFF
set lsb [dec2hex [expr $lsb >> 1]]
set output [dec2hex [expr $mask & $lsb]]
return $output
}
if {$masksize <= 29} {
set mask [dec2hex [expr int(pow(2,$masksize+1)) -1]]
set lsb [dec2hex [expr $lsb >> $lsbpos]]
set output [dec2hex [expr $mask & $lsb]]
return $output
}
}
# When the mask in only on the upper 32 bit
if {$msbpos > 31 && $lsbpos > 31} {
set masksize [expr $msbpos - $lsbpos]
if {$masksize == 31} {
return $msb
}
if {$masksize == 30 & $lsbpos == 32} {
set mask 0x7FFFFFFF
set output [dec2hex [expr $mask & $msb]]
return $output
}
if {$masksize == 30 & $lsbpos == 33} {
set mask 0xFFFFFFFE
set msb [dec2hex [expr $msb >> 1 ]]
set output [dec2hex [expr ($mask & $msb) >> 1]]
return $output
}
if {$masksize <= 29} {
set mask [dec2hex [expr int(pow(2,$masksize+1)) -1]]
set msb [dec2hex [expr $msb >> ($lsbpos - 32)]]
set output [dec2hex [expr $mask & $msb]]
return $output
}
}
# When the mask is across both 32 bits windows
if {$msbpos > 31 && $lsbpos <= 31} {
set uppermasksize [expr $msbpos - 32]
set lowermasksize [expr 31 - $lsbpos ]
if {$uppermasksize <= 29} {
set uppermask [dec2hex [expr int(pow(2,$uppermasksize+1)) -1]]
}
if {$uppermasksize == 30} {
set uppermask 0x7FFFFFFF
}
if {$lowermasksize <= 29} {
set lowermask [dec2hex [expr int(pow(2,$lowermasksize+1)) -1]]
}
if {$lowermasksize == 30} {
set lowermask 0x7FFFFFFF
}
set lsb [dec2hex [expr $lsb >> $lsbpos]]
set output_msb [dec2hex [expr $uppermask & $msb]]
set output_lsb [dec2hex [expr $lowermask & $lsb]]
set output [dec2hex [expr ($output_msb << ($lowermasksize +1)) | $output_lsb]]
return $output
}
}
#------------------------------------------------------------------------------
# SCRIPT NAME: EOS_Traffic_Police
#
# DESCRIPTION: The procedure provides an example on how to configure the
# EtherType header filter. In this example, Header Filter
# Table 1, 2 and 3 are unused. They are setup to pass packets
# through.
#
# PARAMETERS: devID - This parameter is used to specify the device
# under configuration. Set to 0 for normal operation.
#
# port - 0 to 7
#
# res - minimum resolution 0 = 1 Mbps, 1 = 64kbps
#
# multi - 0x0 = Traffic Policing is disabled
# 0x1 = Traffic Policing rate is 1x res
# 0x2 = Traffic Policing rate is 2x res
# 0x3 = Traffic Policing rate is 3x res
# ....
# 0x3FF = Traffic Policing rate is 1023x res
#
# NOTES:
#
#------------------------------------------------------------------------------
proc EOS_Traffic_Police {devID port res multi} {
if {$res == 0} {
# Set minimum resolution to 1 Mbps
admwr $devID 0xEA4F 0x1B052A06
}
if {$res == 1} {
# Set minimum resolution to 64 kbps
admwr $devID 0xEA4F 0x88013E00
}
# Setup Bucket Size
admwr $devID 0xEA45 0x8000
# Map multiplier to POL_THRES_CHn
set multi9 [expr ($multi >> 0) & 0x1]
set multi8 [expr ($multi >> 1) & 0x1]
set multi7 [expr ($multi >> 2) & 0x1]
set multi6 [expr ($multi >> 3) & 0x1]
set multi5 [expr ($multi >> 4) & 0x1]
set multi4 [expr ($multi >> 5) & 0x1]
set multi3 [expr ($multi >> 6) & 0x1]
set multi2 [expr ($multi >> 7) & 0x1]
set multi1 [expr ($multi >> 8) & 0x1]
set multi0 [expr ($multi >> 9) & 0x1]
set thres [expr ($multi9 << 9)|($multi8 << 8)|($multi7 << 7)|($multi6 << 6)|($multi5 << 5)|($multi4 << 4)|($multi3 << 3)|($multi2 << 2)|($multi1 << 1)|$multi0]
if {$port == 0} {
set pol_thres_ch1 $thres
set initvalue [admrd $devID 0xEA50]
set dvalue [expr ($initvalue & 0xFFFFFC00)|$pol_thres_ch1]
set dvalue [dec2hex $dvalue]
admwr $devID 0xEA50 $dvalue
}
if {$port == 1} {
set pol_thres_ch2 $thres
set initvalue [admrd $devID 0xEA50]
set dvalue [expr ($initvalue & 0xFFF003FF)|($pol_thres_ch2 << 10)]
set dvalue [dec2hex $dvalue]
admwr $devID 0xEA50 $dvalue
}
if {$port == 2} {
set pol_thres_ch3 $thres
set initvalue [admrd $devID 0xEA50]
set dvalue [expr ($initvalue & 0xC00FFFFF)|($pol_thres_ch3 << 20)]
set dvalue [dec2hex $dvalue]
admwr $devID 0xEA50 $dvalue
}
if {$port == 3} {
set pol_thres_ch4 $thres
set initvalue [admrd $devID 0xEA51]
set dvalue [expr ($initvalue & 0xFFFFFC00)|$pol_thres_ch4]
set dvalue [dec2hex $dvalue]
admwr $devID 0xEA51 $dvalue
}
if {$port == 4} {
set pol_thres_ch5 $thres
set initvalue [admrd $devID 0xEA51]
set dvalue [expr ($initvalue & 0xFFF003FF)|($pol_thres_ch5 << 10)]
set dvalue [dec2hex $dvalue]
admwr $devID 0xEA51 $dvalue
}
if {$port == 5} {
set pol_thres_ch6 $thres
set initvalue [admrd $devID 0xEA51]
set dvalue [expr ($initvalue & 0xC00FFFFF)|($pol_thres_ch6 << 20)]
set dvalue [dec2hex $dvalue]
admwr $devID 0xEA51 $dvalue
}
if {$port == 6} {
set pol_thres_ch7 $thres
set initvalue [admrd $devID 0xEA52]
set dvalue [expr ($initvalue & 0xFFFFFC00)|$pol_thres_ch7]
set dvalue [dec2hex $dvalue]
admwr $devID 0xEA52 $dvalue
}
if {$port == 7} {
set pol_thres_ch8 $thres
set initvalue [admrd $devID 0xEA52]
set dvalue [expr ($initvalue & 0xFFF003FF)|($pol_thres_ch8 << 10)]
set dvalue [dec2hex $dvalue]
admwr $devID 0xEA52 $dvalue
}
}
#------------------------------------------------------------------------------
# SCRIPT NAME: EOS_EAPO_Extract_RAM_Example
#
# DESCRIPTION: In this example, the Add EAPO-I block of port 1 is setup to send any
# packets that have a MAC destination address = 0xFFFFFFFFFFFF or
# 0x111111111111 or 0x222222222222 or 0x333333333333. Packet with other
# MAC destination address is transported
#
# PARAMETERS: devID - This parameter is used to specify the device
# under configuration
#
# NOTES:
#
# 1) Call EAPO_RAM_Rd to read the extracted packet
#------------------------------------------------------------------------------
proc EOS_EAPO_Extract_RAM_Example {devID} {
source /usr/lib/cgi-bin/apps/tclscripts/PM5337_util.tcl
set dir 0x1
### Defining address for ingress or egress direction ###
set addr_0xE803 [dec2hex [expr 0xE803 + ($dir * 0x200)]]
set addr_0xE804 [dec2hex [expr 0xE804 + ($dir * 0x200)]]
set addr_0xE805 [dec2hex [expr 0xE805 + ($dir * 0x200)]]
set addr_0xE806 [dec2hex [expr 0xE806 + ($dir * 0x200)]]
set addr_0xE807 [dec2hex [expr 0xE807 + ($dir * 0x200)]]
set addr_0xE808 [dec2hex [expr 0xE808 + ($dir * 0x200)]]
set addr_0xE809 [dec2hex [expr 0xE809 + ($dir * 0x200)]]
set addr_0xE80A [dec2hex [expr 0xE80A + ($dir * 0x200)]]
set addr_0xE80B [dec2hex [expr 0xE80B + ($dir * 0x200)]]
set addr_0xE869 [dec2hex [expr 0xE869 + ($dir * 0x200)]]
set addr_0xE86A [dec2hex [expr 0xE86A + ($dir * 0x200)]]
set addr_0xE86B [dec2hex [expr 0xE86B + ($dir * 0x200)]]
set addr_0xE86C [dec2hex [expr 0xE86C + ($dir * 0x200)]]
set addr_0xE86D [dec2hex [expr 0xE86D + ($dir * 0x200)]]
# Setup Header Filter 1 to monitor Destination Addr in the Add Port #1
# Setup Header Filter 2 to monitor Source Addr in the Add Port #1
# Note: in this example, only the Destination address is look at.
# add port pos mask 1 pos mask 2
EOS_T1_Filter_Config $devID 0x1 0x0 0x0 0xFFFFFFFFFFFF 0x6 0xFFFFFFFFFFFF
# For example:
# Setup Table 1 to extract packet with SA = 0xFFFFFFFFFFFF to RAM
# Setup Table 1 to extract packet with SA = 0x111111111111 to RAM
# Setup Table 1 to extract packet with SA = 0x222222222222 to RAM
# Setup Table 1 to extract packet with SA = 0x333333333333 to RAM
# add n HF1 MAC Addr (m=0) HF1 MAC Addr (m =1)
EOS_T1_Table_Config $devID 0x1 1 0x0 0xFFFFFFFFFFFF 0x0 0x111111111111
# add n HF1 MAC Addr (m=0) HF1 MAC Addr (m =1)
EOS_T1_Table_Config $devID 0x1 2 0x0 0x222222222222 0x0 0x333333333333
# Setup Consequential Action RAM
# 5-bit Matching Index generated by Table 1
# n_m 5-bit index
# 1_0 00000
# 1_1 00001
# 2_0 00010
# 2_1 00011
# ...
# 15_1 11101
# Since Table 2 is not enabled, the generated index will be 11110 (0x1E)
# dir T1ind T2ind Ext_to_RAM
CA_Table_Config $devID 0x1 0x0 0x1E 0x2
CA_Table_Config $devID 0x1 0x1 0x1E 0x2
CA_Table_Config $devID 0x1 0x2 0x1E 0x2
CA_Table_Config $devID 0x1 0x3 0x1E 0x2
# Enable Consequential Action RAM and Table 1
admwrb $devID 0xEA00 31 1
admwrb $devID 0xEA03 0 1
}
#------------------------------------------------------------------------------
# SCRIPT NAME: EOS_T1_Filter_Config (Used in EOS_EAPO_Extract_RAM_Example)
#
# DESCRIPTION: Setup Table 1 Filter
#
# PARAMETERS: devID - This parameter is used to specify the device
# under configuration
#
# dir - 0 (Drop direction),
# 1 (Add direction)
#
# port - 0 (port 0), 1 (port 1), ... , 7 (port 7)
#
# start_pos1 - Mask starting position: 0x0 to 0x19
#
# mask1 - 0x000000000000 to 0xFFFFFFFFFFFF
#
# start_pos2 - Mask starting position: 0x0 to 0x19
#
# mask2 - 0x000000000000 to 0xFFFFFFFFFFFF
#
# NOTES:
# 1) Examples:
# start_pos = 0x0: Destination MAC Address
# start_pos = 0x6: Source MAC Address
# start_pos = 0xC: Length/Type
#
#------------------------------------------------------------------------------
proc EOS_T1_Filter_Config {devID dir port start_pos1 mask1 start_pos2 mask2} {
source /usr/lib/cgi-bin/apps/tclscripts/PM5337_util.tcl
### Defining address for ingress or egress direction ###
set addr_0xE803 [dec2hex [expr 0xE803 + ($dir * 0x200)]]
set addr_0xE804 [dec2hex [expr 0xE804 + ($dir * 0x200)]]
set addr_0xE805 [dec2hex [expr 0xE805 + ($dir * 0x200)]]
set addr_0xE806 [dec2hex [expr 0xE806 + ($dir * 0x200)]]
set addr_0xE807 [dec2hex [expr 0xE807 + ($dir * 0x200)]]
set addr_0xE808 [dec2hex [expr 0xE808 + ($dir * 0x200)]]
set addr_0xE809 [dec2hex [expr 0xE809 + ($dir * 0x200)]]
set addr_0xE80A [dec2hex [expr 0xE80A + ($dir * 0x200)]]
set addr_0xE80B [dec2hex [expr 0xE80B + ($dir * 0x200)]]
set addr_0xE869 [dec2hex [expr 0xE869 + ($dir * 0x200)]]
set addr_0xE86A [dec2hex [expr 0xE86A + ($dir * 0x200)]]
set addr_0xE86B [dec2hex [expr 0xE86B + ($dir * 0x200)]]
set addr_0xE86C [dec2hex [expr 0xE86C + ($dir * 0x200)]]
set addr_0xE86D [dec2hex [expr 0xE86D + ($dir * 0x200)]]
### Configure header filters start position and mask ###
# a) Write value to indirect data register
# Bit 127 to 96 (IND_DATA3) <- imask2 [47:43] + start_pos2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -