📄 pm5337_eos_eapo.tcl
字号:
admwr $devID $addr_0xE869 [expr ($start_pos2 << 6)| [imask $mask2 47 43]]
# Bit 95 to 64 (IND_DATA2) <- imask2 [42:11]
admwr $devID $addr_0xE86A [imask $mask2 42 11]
# Bit 63 to 32 (IND_DATA1) <- mask2[10:0] + startpos1 + mask1[47:32]
admwr $devID $addr_0xE86B [expr ([imask $mask2 10 0] << 21)|($start_pos1 << 16)|[imask $mask1 47 32]]
# Bit 31 to 0 (IND_DATA0) <- mask1[31:0]
admwr $devID $addr_0xE86C [imask $mask1 31 0]
# b) Write value to indirect address register
set BUSY_ING 1
set BUSY_EGR 0
set RWB 0
set IND_ADDR [expr 0x000 + ($port * 0x1)]
set iaddr [expr ($BUSY_ING << 31)|($BUSY_EGR << 30)|($RWB << 29)|$IND_ADDR]
set iaddr [dec2hex $iaddr]
admwr $devID $addr_0xE86D $iaddr
#c) Poll BUSY bit until low
Poll_BUSY_Bit $devID $addr_0xE86D 31
}
#------------------------------------------------------------------------------
# SCRIPT NAME: EOS_T1_Table_Config (Used in EOS_EAPO_Extract_RAM_Example)
#
# DESCRIPTION: Setup Table 1
#
# PARAMETERS: devID - This parameter is used to specify the device
# under configuration
#
# dir - 0 (Drop direction),
# 1 (Add direction)
#
# index_n - 1 to 15
##
# value1 - The expected value: 0x000000000000 to 0xFFFFFFFFFFFF
#
# hfindex1 - 0 (header field 1 is used), 1 (header field 2 is used)
#
# value2 - The expected value: 0x000000000000 to 0xFFFFFFFFFFFF
#
# hfindex2 - 0 (header field 1 is used), 1 (header field 2 is used)
#
#------------------------------------------------------------------------------
proc EOS_T1_Table_Config {devID dir index_n hfindex1 value1 hfindex2 value2 } {
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
set T1_F_PORT_SEL_INDEXn_0 0x000
set T1_F_HF_SEL_INDEXn_0 $hfindex1
set T1_F_EN_INDEXn_0 0x1
set T1_F_ALL_PORT_EN_INDEXn_0 0x1
set T1_F_PORT_SEL_INDEXn_1 0x000
set T1_F_HF_SEL_INDEXn_1 $hfindex2
set T1_F_EN_INDEXn_1 0x1
set T1_F_ALL_PORT_EN_INDEXn_1 0x1
# IND_DATA3 (Bit 127 to 96)
set word [expr ($T1_F_ALL_PORT_EN_INDEXn_1<< 11)|($T1_F_EN_INDEXn_1<<10)|($T1_F_HF_SEL_INDEXn_1<<9)|($T1_F_PORT_SEL_INDEXn_1<<6)|[imask $value2 47 42]]
admwr $devID $addr_0xE869 $word
# IND_DATA2(Bit 95 to 64)
admwr $devID $addr_0xE86A [imask $value2 41 10]
# IND_DATA1 (Bit 63 to 32)
set word [expr ([imask $value2 9 0] << 22)|($T1_F_ALL_PORT_EN_INDEXn_0<<21)|($T1_F_EN_INDEXn_0<<20)|($T1_F_HF_SEL_INDEXn_0<<19)|($T1_F_PORT_SEL_INDEXn_0<<16)|[imask $value1 47 32]]
admwr $devID $addr_0xE86B $word
# IND_DATA0 (Bit 31 to 0)
admwr $devID $addr_0xE86C [imask $value1 31 0]
# b) Write value to indirect address register
set BUSY_ING 1
set BUSY_EGR 0
set RWB 0
set IND_ADDR [expr 0x020 + 0x1 * ($index_n - 1) ]
set iaddr [expr ($BUSY_ING << 31)|($BUSY_EGR << 30)|($RWB << 29)|$IND_ADDR]
set iaddr [dec2hex $iaddr]
admwr $devID $addr_0xE86D $iaddr
#c) Poll BUSY bit until low
Poll_BUSY_Bit $devID $addr_0xE86D 31
}
#------------------------------------------------------------------------------
# SCRIPT NAME: CA_Table_Config (Used in EOS_EAPO_Extract_RAM_Example)
#
# DESCRIPTION: Setup Consequential Action Table
#
# PARAMETERS:
#
# devID - This parameter is used to specify the device
# under configuration
#
# dir - 0 (Drop direction),
# 1 (Add direction)
#
# table1index - 0x00 to 0x1D, or 0x1F (for no match)
#
# table2index - 0x00 to 0x1D, or 0x1F (for no match)
#
# action - 0x0 Transport
# 0x1 Drop
# 0x2 Send to RAM
# 0x3 Send only 32 byte to RAM
# 0x4 Transport and send to RAM
# 0x5 Transport and send only 32 byte to RAM
#
# Note: 1) tablenindex should be set to 0x1E when the Table n is not enabled
#
#------------------------------------------------------------------------------
proc CA_Table_Config {devID dir table1index table2index action} {
set addr_0xE86C [dec2hex [expr 0xE86C + ($dir * 0x200)]]
set addr_0xE86D [dec2hex [expr 0xE86D + ($dir * 0x200)]]
set n [dec2hex [expr (($table2index & 0x3)<<5)|$table1index]]
set m [dec2hex [expr ($table2index >> 2) & 0x7]]
# Write value to indirect address register
admwr $devID $addr_0xE86C [expr $action << (3 * $m)]
set BUSY_ING 1
set BUSY_EGR 0
set RWB 0
set IND_ADDR [expr 0x100 + 0x1 * $n ]
set iaddr [expr ($BUSY_ING << 31)|($BUSY_EGR << 30)|($RWB << 29)|$IND_ADDR]
set iaddr [dec2hex $iaddr]
admwr $devID $addr_0xE86D $iaddr
}
#------------------------------------------------------------------------------
# SCRIPT NAME: EAPO_RAM_Rd
#
# DESCRIPTION: Read content in the extraction RAM
#
# PARAMETERS:
# devID - This parameter is used to specify the device
# under configuration
#
# dir - 0 (Drop direction),
# 1 (Add direction)
#
# port - 0 to 7
# NOTES:
#
#------------------------------------------------------------------------------
proc EAPO_RAM_Rd {{devID 0} {dir 1} {port 0}} {
if {$dir == 0} {
set addr [expr 0xE812 + $port]
set addr2 [expr 0xE82D + $port]
set addr [dec2hex $addr]
set addr2 [dec2hex $addr2]
}
if {$dir == 1} {
set addr [expr 0xEA12 + $port]
set addr2 [expr 0xEA2D + $port]
set addr [dec2hex $addr]
set addr2 [dec2hex $addr2]
}
# Check if there is an content in RAM
set CPU_PEXT_RAMn_PAI_V [admrdb $devID $addr2 $port]
if {$CPU_PEXT_RAMn_PAI_V== 0 } {
puts "RAM[expr $port + 1]_Packet_DATA is empty"
return
}
# Read the first byte of the RAM to determine the packet length
set first_read [admrd $devID $addr]
set packetlength [expr (( $first_read >> 16) & 0xFFFF)/4 ]
# Check the extracted packet length
if {$packetlength == 0 } {
# Check for error again
puts "RAM[expr $port + 1]_Packet_DATA is empty"
return
} elseif {$packetlength > 1518} {
# Check for error again
puts "Invalid Packet Length"
return
} else {
set second_read [admrd $devID $addr]
set third_read [admrd $devID $addr]
set forth_read [admrd $devID $addr]
puts "Dest Addr (47:39) = [dec2hex [expr $first_read & 0xFF ]]"
puts "Dest Addr (38:8) = [dec2hex [expr $second_read ]]"
puts "Dest Addr (7:0) = [dec2hex [expr ($third_read >> 24) & 0xFF]]"
puts ""
puts "Source Addr (47:16) = [dec2hex [expr $third_read & 0xFFFFFF]]"
puts "Source Addr (15:0) = [dec2hex [expr ($forth_read >> 8)& 0xFFFFFF]]"
puts ""
puts "Length/Type = [dec2hex [expr $forth_read & 0xFF]]"
puts ""
puts "Payload and FCS:"
# Calculate if there is any remainer when dividing the packet
# lenght by 4
set remainer [expr (($first_read >> 16) & 0xFFFF)%4]
if {$remainer == 0} {
for {set i 5} {$i <= $packetlength} {incr i} {
puts [admrd $devID $addr]
}
puts [dec2hex [expr ([admrd $devID $addr]>>0x8) & 0xFFFFFF]]
}
if {$remainer == 1} {
for {set i 5} {$i <= $packetlength} {incr i} {
puts [admrd $devID $addr]
}
puts [admrd $devID $addr]
}
if {$remainer == 2} {
for {set i 5} {$i <= $packetlength} {incr i} {
puts [admrd $devID $addr]
}
puts [admrd $devID $addr]
puts [dec2hex [expr ([admrd $devID $addr]>>0x23) & 0xFF]]
}
if {$remainer == 3} {
for {set i 5} {$i <= $packetlength} {incr i} {
puts [admrd $devID $addr]
}
puts [admrd $devID $addr]
puts [dec2hex [expr ([admrd $devID $addr]>>0x16) & 0xFFFF]]
}
}
}
#------------------------------------------------------------------------------
# SCRIPT NAME: EOS_EAPO_Packet_Ins_Example
#
# DESCRIPTION: In this example, a packet with Dest MAC = 0x0123456789AB
# Src MAC = 0x0123456789AB and Length/type/payload = 0x5555
# is sent once every second
#
# PARAMETERS: devID - This parameter is used to specify the device
# under configuration
#
# dir - 0x0 (Drop), 0x1 (Add)
#
# port - 0x0 (port 1), ... 0x7 (port 8)
#
# NOTES:
#
# 1) When PERIODIC_TRANS is set to 0
# Use the following procedure to insert the packet manually
#
# proc ins {} {
# admwrb 0 0xE841 16 0
# admwrb 0 0xE841 16 1
# }
#
#------------------------------------------------------------------------------
proc EOS_EAPO_Packet_Ins_Example {devID dir port} {
### Defining address for ingress or egress direction ###
set addr_0xE83F [dec2hex [expr 0xE83F + ($dir * 0x200)]]
set addr_0xE840 [dec2hex [expr 0xE840 + ($dir * 0x200)]]
set addr_0xE841 [dec2hex [expr 0xE841 + ($dir * 0x200)]]
set addr_0xE842 [dec2hex [expr 0xE842 + ($dir * 0x200)]]
set addr_0xE843 [dec2hex [expr 0xE843 + ($dir * 0x200)]]
# 1. Toggle RESET_WR_PTR and set TRANS_PACKET to 0
admwrb $devID $addr_0xE841 16 0
admwrb $devID $addr_0xE841 17 1
admwrb $devID $addr_0xE841 17 0
# 3. Configure Packet Insertion Controller and RAM
set insert_length 0x40 ;# lenght = 64
set port 0x0
set FCS_CPU_PACKET_COMP 0x1
set CPU_PACKET_PRIORITY 0x1
set PERIODIC_TRANS 0x1
if {$dir == 0} {
# Drop direction
set PERIOD_LSB 0x7735940 ;# 1 sec
}
if {$dir == 1} {
# Add direction
set PERIOD_LSB 0x4A28600 ;# 1 sec
}
# Write to RAM
# Src and Dest MAC Addr = 0x0123456789AB
# Define length and port
set length_port [expr ($insert_length << 16)|($port)]
admwr $devID $addr_0xE843 $length_port
# first write
admwr $devID $addr_0xE843 0x01234567
# second write
admwr $devID $addr_0xE843 0x89AB0123
# third write
admwr $devID $addr_0xE843 0x456789AB
# Write the rest of the packet
for {set i 4} {$i <= [expr $insert_length /4]} {incr i} {
admwr $devID $addr_0xE843 0x55555555
}
# Trigger write
admwr $devID $addr_0xE842 $PERIOD_LSB
set value [dec2hex [expr 0x10000|($FCS_CPU_PACKET_COMP << 13)|($PERIODIC_TRANS << 10)|($CPU_PACKET_PRIORITY << 14)]]
admwr $devID $addr_0xE841 $value
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -