交换芯片Helix4 L2 L3功能验证


 Helix4 L2 L3功能验证

 


 

目录

Helix4 L2 L3功能验证 1

1

1.验证环境及工具 5

1.1 验证环境 5

5

1.2 报文构造工具 6

1.3 软件配置环境 6

2.端口状态 6

2.1 获取端口当前工作状态 6

2.2 获取端口的转发状态 7

2.3 设置端口的转发状态 7

2.4 端口状态变化通知注册 14

2.5 端口状态变化通知反注册 15

3.地址表 16

3.1 地址表通知注册 16

3.2 地址表通知反注册 16

3.3 添加单播地址 17

3.4 删除单播地址 17

3.5 添加组播地址 18

3.6 删除组播地址 19

3.7 清除所有动态地址 19

3.8 获取地址表老化时间 20

3.9 地址表老化时间设置 21

4. VLAN 22

4.1 创建VLAN 22

4.2 删除VLAN 22

4.3 端口以UNTAG形式加入VLAN 23

4.4 端口以TAG形式加入VLAN 24

4.5 端口退出VLAN 24

4.6 获取端口默认VLAN 25

4.7 设置端口默认VLAN 25

4.8 广播报文转发 26

4.9 已知单播报文转发 27

5. IGMP SNOOPING 28

5.1 获取IGMP报文送CPU 28

5.2 设置IGMP报文送CPU 29

5.3 获取未知名组播不转发 29

5.4 设置未知名组播不转发 30

5.5 组播报文转发 31

6. 端口聚合 34

6.1 创建聚合口 34

6.2 删除聚合口 34

6.3 聚合口是否存在 35

6.4 端口加入聚合口 35

6.5 端口退出聚合口 36

6.6 聚合组负载分担 37

7. 端口安全 41

7.1 开启端口安全 41

7.2 关闭端口安全 42

8. 路由表 43

8.1 创建三层接口 43

8.2 添加IP 43

8.3 删除IP 44

8.4 添加路由 44

8.5 删除路由 45

8.6 路由表项流程分析 45

8.7 主机路由 47

8.8 网段路由 50

9. QoS 53

10. 问题及解决方法 60

10. SDK初始化处理流程 62
























1.验证环境及工具

1.1 验证环境

PC 1


Helix4 Switch


5120 Switch


 


 

PC 2


 BCM芯片Ingress 流程

交换芯片Helix4 L2 L3功能验证

 

 

 

BCM.0> v

Broadcom Command Monitor: Copyright (c) 1998-2010 Broadcom Corporation

Release: sdk-6.4.8 built 20160524 (Tue May 24 13:17:02 2016)

From broadcom@old-CentOS:/work/platform/broadcom/sdk-xgs-robo-6.4.8

Platform: IPROC_CMICD

OS: Unix (Posix)

Chips:


BCM56640_A0,


BCM56340_A0,


PHYs: BCM5218, BCM5220/21, BCM5226, BCM5228,

BCM5238, BCM5248, BCM5324/FE, BCM5348/FE,

BCM53242/FE, BCM53262/FE, BCM53101/FE, BCM53280/FE,

BCM53600/FE, BCM5400, BCM5401, BCM5402,

BCM5404, BCM5424/34, BCM5411, BCM5461,

BCM5464, BCM5466, BCM5478, BCM5488,

BCM54980, BCM54980, BCM54980, BCM54980,

BCM53314, BCM5482/801x, BCM54684, BCM54640,

BCM54682E, BCM54684E, BCM54685, BCM54616,

BCM54618E, BCM54618SE, BCM54210, BCM54220,

BCM54280, BCM54282, BCM54240, BCM54285,

BCM5428X, BCM54290, BCM54292, BCM54294,

BCM54295, BCM54296, BCM5421S, BCM54680,

BCM53324, BCM53125, BCM53128, BCM53010,

BCM53018, BCM5302X, BCM54880, BCM54881,

BCM54810, BCM54811, BCM89500, BCM54640E

BCM54880E, BCM54680E, BCM52681E, BCM8703,

BCM8704, BCM8705/24/25, BCM8706/8726, BCM8727,

BCM8728/8747, BCM8072, BCM8073, BCM8074,

BCM8040, BCM8481X, BCM84812, BCM84821,

BCM84822, BCM84823, BCM84833, BCM84834,

BCM84835, BCM84836, BCM84844, BCM84846,

BCM84848, BCM84858, BCM84856, BCM84860,

BCM84861, BCM84864, BCM84868, BCM8750,

BCM8752, BCM8754, BCM84740, BCM84164,

BCM84758, BCM84780, BCM84784, BCM84318,

BCM84328, copper sfp


BCM.0>


1.2 报文构造工具

Xcap 0.4.2


1.3 软件配置环境

 

L2 Entry表中增加如下cpu mac 表项

BCM.0>L2 add mac=02:10:18:db:88:47 vlan=1 pbm=cpu0 Static=true ReplacePriority=false Replace=false L3=true

BCM.0> knet filter show

Filter ID 1: prio=127 dest=NetIF(1) desc=‘‘ striptag

BCM.0> knet filter destroy 1

BCM.0> knet filter create desttype=netif destid=1 prio=127 striptag=yes mirror=yes

Filter ID 1: prio=127 dest=NetIF(1) desc=‘‘ mirror=rxapi striptag

BCM.0>

Shell下配置虚拟接口vintf0ip地址,即为交换机ip地址。

ifconfig vintf0 192.168.21.231

2.端口状态

2.1 获取端口当前工作状态

BCM.0> ps ge12

ps ge12

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge12 up 100M FD SW Yes Forward TX RX None FA SGMII 16356

BCM.0> ps ge8

ps ge8

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge8 up 1G FD SW Yes Forward TX RX None FA SGMII 16356

 

如上所示命令调用下面两个驱动接口获取端口状态

Void port_info_init(int unit, int port, bcm_port_info_t *info, uint32 actions)

int bcm_port_selective_get(int unit, bcm_port_t port, bcm_port_info_t *info)

Actions = BCM_PORT_ATTR_ALL_MASK


2.2 获取端口的转发状态

BCM.0> debug bcm api

debug bcm api

BCM.0> stg show 1

stg show 1

API: bcm_stg_vlan_list(0,1,...) -> 0 Ok

STG 1: contains 2 VLANs (1-2)

API: bcm_stg_vlan_list_destroy(0,...) -> 0 Ok

BCM.0> stg stp 1

stg stp 1

STG 1:

API: bcm_port_config_get(0,...) -> 0 Ok

API: bcm_stg_stp_get(0,1,1,...) -> 0 Ok

API: bcm_stg_stp_get(0,1,2,...) -> 0 Ok

...

API: bcm_stg_stp_get(0,1,55,...) -> 0 Ok

Forward: ge,xe,hg


如上所示,调用驱动接口获取端口stp 状态。

bcm_stg_stp_get(int unit, bcm_stg_t stg, bcm_port_t port, int *stp_state)


2.3 设置端口的转发状态

BCM.0> debug bcm api

debug bcm api

BCM.0> stg stp 1 ge15 block

stg stp 1 ge15 block

API: bcm_port_config_get(0,...) -> 0 Ok

API: bcm_stg_stp_set(0,1,16,...) -> 0 Ok

BCM.0> ps ge15

ps ge15

API: bcm_port_config_get(0,...) -> 0 Ok

API: bcm_port_selective_get(0,16,...) -> 0 Ok

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge15 up 1G FD SW Yes Block TX RX None FA SGMII 16356

BCM.0> clear c

clear c

BCM.0> show c

show c

R255.ge10 : 1 +1

R511.ge10 : 4 +4

RPKT.ge10 : 5 +5

RMCA.ge10 : 5 +5

RPOK.ge10 : 5 +5

RBYT.ge10 : 1,499 +1,499

RPORTD.ge15 : 25 +11

RDBGC0.ge15 : 25 +11

R127.ge15 : 7 +6

R255.ge15 : 7 +4

R511.ge15 : 1 +1

RPKT.ge15 : 25 +11

RMCA.ge15 : 7 +4

RBCA.ge15 : 18 +7

RPOK.ge15 : 25 +11

RBYT.ge15 : 2,631 +1,422

命令在调用驱动接口

bcm_stg_stp_set( int unit, bcm_stg_t stg, bcm_port_t port, int stp_state)

设置端口ge15 stp 状态为Block之后,查看端口状态,显示为block,打入广播报文,其他端口没有广播报文统计计数。


BCM.0> m L2_user_entry 3 1 MAC_ADDR=0x000000000003 VLAN_ID=1 MODULE_ID=0 MASK=0x00ffffffffffffff cpu=0 PORT_NUM=15

BCM.0> d l2_user_entry 3 1

d l2_user_entry 3 1

L2_USER_ENTRY.ipipe0[3]: <VLAN_ID=1,VFI=1,VALID=1,TGID=0xf,T=0,RPE=0,RESERVED_0=0,PRI=0,PORT_NUM=0xf,MODULE_ID=0,MASK=0x00ffffffffffffff,MAC_ADDR=0x000000000003,L2_PROTOCOL_PKT=0,KEY_TYPE=0,KEY=0x0001000000000003,EVEN_PARITY=0,DST_DISCARD=0,DO_NOT_LEARN_MACSA=0,CPU=0,CLASS_ID=0,BPDU=1>


修改L2_user_entry index 3的表项,mac 0x000000000003,从block ge12打入构造的目的mac0x03的二层报文,其他端口有统计计数。

或者通过如下方式增加L2_user_entry表项

BCM.0> bpdu add index=-1 mac=0x000000000001

BCM.0> bpdu show

unit 0 has 512 BPDU entries

BPDU 0: 01:80:c2:00:00:00

BPDU 1: 01:80:c2:00:00:00

BPDU 2: 01:80:c2:00:00:00

BPDU 3: 01:80:c2:00:00:00

BPDU 4: 01:80:c2:00:00:00

BPDU 5: 01:80:c2:00:00:00

BPDU 6: 01:80:c2:00:00:10

BPDU 7: 00:00:00:00:00:01

BPDU 510: 01:80:c2:00:00:20

BPDU 511: 01:80:c2:00:00:00

BCM.0>

BCM.0> d chg L2_user_entry

L2_USER_ENTRY.ipipe0[0]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[1]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[2]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[3]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[4]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[5]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[6]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000010,KEY=0x00000180c2000010,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[7]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x000000000001,KEY=0x0000000000000001,BPDU=1>

L2_USER_ENTRY.ipipe0[510]: <VALID=1,MASK=0x0000fffffffffff0,MAC_ADDR=0x0180c2000020,KEY=0x00000180c2000020,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[511]: <VALID=1,MASK=0x0000fffffffffff0,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

BCM.0>


BCM.0> stg stp 1 ge12 block

stg stp 1 ge12 block

BCM.0> ps ge12

ps ge12

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge12 up 1G FD SW Yes Block TX RX None FA SGMII 16356

BCM.0> show c

show c

RUC.ge12 : 10 +10

R64.ge12 : 10 +10

RPKT.ge12 : 10 +10

RUCA.ge12 : 10 +10

RPRM.ge12 : 10 +10

RPOK.ge12 : 10 +10

RBYT.ge12 : 640 +640

T64.ge14 : 10 +10

TPOK.ge14 : 10 +10

TPKT.ge14 : 10 +10

TUCA.ge14 : 10 +10

TBYT.ge14 : 640 +640

MC_PERQ_PKT(0).ge14 : 10 +10

MC_PERQ_BYTE(0).ge14 : 640 +640

T64.ge48 : 10 +10

TPOK.ge48 : 10 +10

TPKT.ge48 : 10 +10

TUCA.ge48 : 10 +10

TBYT.ge48 : 640 +640

MC_PERQ_PKT(0).ge48 : 10 +10

MC_PERQ_BYTE(0).ge48 : 640 +640


BCM.0> stg stp 1 ge8 block

BCM.0> clear c

BCM.0> show c

RPORTD.ge8 : 10 +10

RDBGC0.ge8 : 10 +10

R64.ge8 : 10 +10

RPKT.ge8 : 10 +10

RBCA.ge8 : 10 +10

RPOK.ge8 : 10 +10

RBYT.ge8 : 640 +640

BCM.0> bpdu show

unit 0 has 512 BPDU entries

BPDU 0: 01:80:c2:00:00:00

BPDU 1: 01:80:c2:00:00:00

BPDU 2: 01:80:c2:00:00:00

BPDU 3: 01:80:c2:00:00:00

BPDU 4: 01:80:c2:00:00:00

BPDU 5: 01:80:c2:00:00:00

BPDU 6: 01:80:c2:00:00:10

BPDU 510: 01:80:c2:00:00:20

BPDU 511: 01:80:c2:00:00:00

BCM.0> bpdu add index=-1 mac=01:80:c2:05:00:01

BCM.0> bpdu show

unit 0 has 512 BPDU entries

BPDU 0: 01:80:c2:00:00:00

BPDU 1: 01:80:c2:00:00:00

BPDU 2: 01:80:c2:00:00:00

BPDU 3: 01:80:c2:00:00:00

BPDU 4: 01:80:c2:00:00:00

BPDU 5: 01:80:c2:00:00:00

BPDU 6: 01:80:c2:00:00:10

BPDU 7: 01:80:c2:05:00:01

BPDU 510: 01:80:c2:00:00:20

BPDU 511: 01:80:c2:00:00:00

BCM.0> d chg L2_user_entry

L2_USER_ENTRY.ipipe0[0]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[1]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[2]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[3]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[4]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[5]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[6]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2000010,KEY=0x00000180c2000010,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[7]: <VALID=1,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2050001,KEY=0x00000180c2050001,BPDU=1>

L2_USER_ENTRY.ipipe0[510]: <VALID=1,MASK=0x0000fffffffffff0,MAC_ADDR=0x0180c2000020,KEY=0x00000180c2000020,CPU=1,BPDU=1>

L2_USER_ENTRY.ipipe0[511]: <VALID=1,MASK=0x0000fffffffffff0,MAC_ADDR=0x0180c2000000,KEY=0x00000180c2000000,CPU=1,BPDU=1>

BCM.0> d L2_user_entry 7 1

L2_USER_ENTRY.ipipe0[7]: <VLAN_ID=0,VFI=0,VALID=1,TGID=0,T=0,RPE=0,RESERVED_0=0,PRI=0,PORT_NUM=0,MODULE_ID=0,MASK=0x0000ffffffffffff,MAC_ADDR=0x0180c2050001,L2_PROTOCOL_PKT=0,KEY_TYPE=0,KEY=0x00000180c2050001,EVEN_PARITY=0,DST_DISCARD=0,DO_NOT_LEARN_MACSA=0,CPU=0,CLASS_ID=0,BPDU=1>

BCM.0> mod L2_user_entry 7 1 cpu=1

BCM.0> clear c

BCM.0> show c

MC_PERQ_PKT(0).cpu0 : 10 +10

MC_PERQ_BYTE(0).cpu0 : 680 +680

R64.ge8 : 10 +10

RPKT.ge8 : 10 +10

RMCA.ge8 : 10 +10

RPOK.ge8 : 10 +10

RBYT.ge8 : 640 +640



BCM.0> stg stp 1 ge15 forward

stg stp 1 ge15 forward

API: bcm_port_config_get(0,...) -> 0 Ok

API: bcm_stg_stp_set(0,1,16,...) -> 0 Ok

BCM.0> clear c

clear c

BCM.0> show c

show c

T64.ge10 : 10 +10

T127.ge10 : 2 +2

TPOK.ge10 : 12 +12

TPKT.ge10 : 12 +12

TBCA.ge10 : 12 +12

TBYT.ge10 : 812 +812

MC_PERQ_PKT(0).ge10 : 12 +12

MC_PERQ_BYTE(0).ge10 : 812 +812

R64.ge15 : 10 +10

R127.ge15 : 2 +2

RPKT.ge15 : 12 +12

RBCA.ge15 : 12 +12

RPOK.ge15 : 12 +12

RBYT.ge15 : 812 +812

T64.ge48 : 10 +10

T127.ge48 : 2 +2

TPOK.ge48 : 12 +12

TPKT.ge48 : 12 +12

TBCA.ge48 : 12 +12

TBYT.ge48 : 812 +812

MC_PERQ_PKT(0).ge48 : 12 +12

MC_PERQ_BYTE(0).ge48 : 812 +812


BCM.0> ps ge15

ps ge15

API: bcm_port_config_get(0,...) -> 0 Ok

API: bcm_port_selective_get(0,16,...) -> 0 Ok

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge15 up 1G FD SW Yes Forward TX RX None FA SGMII 16356

BCM.0>

在将端口ge15 stp设置为forward 之后,查看端口状态显示为forward, ge15打入二层广播报文,其他端口有报文统计计数。


BCM.0> stg stp 1 ge10 disable

stg stp 1 ge10 disable

BCM.0> clear c

clear c

BCM.0> ps ge10

ps ge10

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge10 up 1G FD SW Yes Disable TX RX None FA SGMII 16356

BCM.0> show c

show c

RPORTD.ge10 : 10 +10

RDBGC0.ge10 : 10 +10

R64.ge10 : 10 +10

RPKT.ge10 : 10 +10

RBCA.ge10 : 10 +10

RPOK.ge10 : 10 +10

RBYT.ge10 : 640 +640

BCM.0>


BCM.0> stg stp 1 ge10 forward

stg stp 1 ge10 forward

BCM.0> clear c

clear c

BCM.0> show c

show c

R64.ge10 : 10 +10

RPKT.ge10 : 10 +10

RBCA.ge10 : 10 +10

RPOK.ge10 : 10 +10

RBYT.ge10 : 640 +640

R511.ge14 : 1 +1

RPKT.ge14 : 1 +1

RMCA.ge14 : 1 +1

RPOK.ge14 : 1 +1

RBYT.ge14 : 333 +333

T64.ge14 : 10 +10

TPOK.ge14 : 10 +10

TPKT.ge14 : 10 +10

TBCA.ge14 : 10 +10

TBYT.ge14 : 640 +640

MC_PERQ_PKT(0).ge14 : 10 +10

MC_PERQ_BYTE(0).ge14 : 640 +640

BCM.0>


BCM.0> stg stp 1 ge10 listen

stg stp 1 ge10 listen

BCM.0> ps ge10

ps ge10

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge10 up 1G FD SW Yes Block TX RX None FA SGMII 16356

BCM.0> clear c

clear c

BCM.0> show c

show c

RPORTD.ge10 : 11 +11

RDBGC0.ge10 : 11 +11

R64.ge10 : 10 +10

R255.ge10 : 1 +1

RPKT.ge10 : 11 +11

RBCA.ge10 : 11 +11

RPOK.ge10 : 11 +11

RBYT.ge10 : 887 +887

BCM.0>


BCM.0> stg stp 1 ge10 forward

stg stp 1 ge10 forward

BCM.0> ps ge10

ps ge10

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge10 up 1G FD SW Yes Forward TX RX None FA SGMII 16356

BCM.0> stg stp 1 ge10 learn

stg stp 1 ge10 learn

BCM.0> ps ge10

ps ge10

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge10 up 1G FD SW Yes LEarn TX RX None FA SGMII 16356

BCM.0> clear c

clear c

BCM.0> show c

show c

RPORTD.ge10 : 10 +10

RDBGC0.ge10 : 10 +10

R64.ge10 : 10 +10

RPKT.ge10 : 10 +10

RBCA.ge10 : 10 +10

RPOK.ge10 : 10 +10

RBYT.ge10 : 640 +640

R255.ge14 : 1 +1

RPKT.ge14 : 1 +1

RMCA.ge14 : 1 +1

RPOK.ge14 : 1 +1

RBYT.ge14 : 167 +167

BCM.0>


2.4 端口状态变化通知注册

2.4.1 电口up/down事件

BCM.0> dispatch linkreg 0

dispatch linkreg 0

API: bcm_linkscan_register(0,...) -> 0 Ok

BCM.0> port ge8 en=false

port ge8 en=false

BCM.0> [bcmLINK.0] port 0.9 link down


BCM.0> ps ge8

ps ge8

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge8 !ena - SW Yes Forward TX RX None FA SGMII 16356

BCM.0> port ge8 en=true

port ge8 en=true

BCM.0> [bcmLINK.0] port 0.9 link up 1000Mb/s FD


命令调用驱动接口

int bcm_linkscan_register( int unit, bcm_linkscan_handler_t f)


注册linkscan 回调处理函数,在port ge8 enable 设置为false 时,打印link down消息,

enable 设置为true之后,打印link up消息。


2.4.2 光口up/down事件

分别使用光转电,光模块,线缆验证。接光转电模块时,在插拔网线或光转电模块都会上报up/down事件;在接光模块时,插拔光纤或光模块都会上报up/down事件;在接线缆时,插拔线缆会上报up/down事件。

BCM.0> dispatch linkreg 0

dispatch linkreg 0

[bcmLINK.0] port 0.3 link up 1000Mb/s FD

[bcmLINK.0] port 0.3 link down

[bcmLINK.0] port 0.3 link up 1000Mb/s FD

[bcmLINK.0] port 0.3 link down

[bcmLINK.0] port 0.1 link up 1000Mb/s FD

[bcmLINK.0] port 0.1 link down

[bcmLINK.0] port 0.1 link up 1000Mb/s FD

[bcmLINK.0] port 0.7 link up 1000Mb/s FD

[bcmLINK.0] port 0.1 link down

[bcmLINK.0] port 0.7 link down

[bcmLINK.0] port 0.1 link up 1000Mb/s FD

[bcmLINK.0] port 0.7 link up 1000Mb/s FD

[bcmLINK.0] port 0.1 link down

[bcmLINK.0] port 0.7 link down

[bcmLINK.0] port 0.1 link up 1000Mb/s FD

[bcmLINK.0] port 0.7 link up 1000Mb/s FD

[bcmLINK.0] port 0.1 link down

[bcmLINK.0] port 0.7 link down

[bcmLINK.0] port 0.3 link up 1000Mb/s FD

[bcmLINK.0] port 0.6 link up 1000Mb/s FD

[bcmLINK.0] port 0.3 link down

[bcmLINK.0] port 0.6 link down

2.5 端口状态变化通知反注册

BCM.0> dispatch linkunreg 0

dispatch linkunreg 0

API: bcm_linkscan_unregister(0,...) -> 0 Ok

BCM.0> port ge8 en=false

port ge8 en=false

BCM.0> ps ge8

ps ge8

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge8 !ena - SW Yes Forward TX RX None FA SGMII 16356

BCM.0> port ge8 en=true

port ge8 en=true

BCM.0> ps ge8

ps ge8

ena/ speed/ link auto STP lrn inter max loop

port link duplex scan neg? state pause discrd ops face frame back

ge8 up 1G FD SW Yes Forward TX RX None FA SGMII 16356

BCM.0>


命令调用驱动接口

int bcm_linkscan_unregister(int unit, bcm_linkscan_handler_t f)


取消注册的回调处理函数,在将port ge8设置为enable = false true 之后,都不打印linkdown /linkup消息。


2.6 VCT

BCM.0> cable ge12

cable ge12

port ge12: cable (4 pairs, length +/- 10 meters)

pair A Open, length 1 meters

pair B Open, length 1 meters

pair C Open, length 1 meters

pair D Open, length 1 meters

2.7 Mirror

BCM.0> dmir 11 mode=ingress destport=13

dmir 11 mode=ingress destport=13



3.地址表

3.1 地址表通知注册

BCM.0> l2 watch start

l2 watch start

API: bcm_l2_addr_register(0,...) -> 0 Ok

BCM.0> API: bcm_stk_my_modid_get(0,...) -> 0 Ok

L2 ADD: mac=00:00:00:00:00:03 vlan=1 GPORT=0x9API: bcm_port_local_get(0,134217737,...) -> 0 Ok modid=0 port=9/ge8


命令调用驱动接口

int bcm_l2_addr_register( int unit, bcm_l2_addr_callback_t callback, void *userdata)


打入mac=00:00:00:00:00:03 的广播报文,可以看到,提示mac地址添加消息。

3.2 地址表通知反注册

BCM.0> l2 watch stop

l2 watch stop

API: bcm_l2_addr_unregister(0,...) -> 0 Ok

BCM.0> debug bcm api -

debug bcm api -

BCM.0> l2 show

l2 show

mac=00:50:c5:00:00:d7 vlan=1 GPORT=0xd modid=0 port=13/ge12 Hit

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=2 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:03 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:01 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:04 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

BCM.0>


命令调用驱动接口

int bcm_l2_addr_unregister( int unit, bcm_l2_addr_callback_t callback,

void *userdata)


打入mac=00:00:00:00:00:04 的广播报文,可以看到,没有打印mac地址添加消息,查看L2 地址表,04 mac地址已学习到。

3.3 添加单播地址

BCM.0> debug bcm api

debug bcm api

BCM.0> l2 add port=ge8 MACaddress=0x000000000005 vlanid=1 STatic=true

l2 add port=ge8 MACaddress=0x000000000005 vlanid=1 STatic=true

API: bcm_stk_modmap_map(0,2,0,...) -> 0 Ok

API: bcm_l2_addr_add(0,...) -> 0 Ok

API: bcm_stk_my_modid_get(0,...) -> 0 Ok

ADD: mac=00:00:00:00:00:05 vlan=1 GPORT=0x9API: bcm_port_local_get(0,134217737,...) -> 0 Ok modid=0 port=9/ge8 Static ReplacePriority


BCM.0> debug bcm api -

debug bcm api -

BCM.0> l2 show

l2 show

mac=00:50:c5:00:00:d7 vlan=1 GPORT=0xd modid=0 port=13/ge12 Hit

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=2 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:03 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:01 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:05 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Static ReplacePriority

mac=00:00:00:00:00:04 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

BCM.0>


在命令添加L2 地址时,调用驱动接口

int bcm_l2_addr_add( int unit, bcm_l2_addr_t *l2addr)


添加单播地址mac = 0x000000000005,查看L2 地址表,添加成功。

3.4 删除单播地址

BCM.0> debug bcm api

debug bcm api

BCM.0> l2 del macaddress=0x000000000005 vlanid=1

l2 del macaddress=0x000000000005 vlanid=1

API: bcm_l2_addr_get(0,...) -> 0 Ok

API: bcm_l2_addr_delete(0,...) -> 0 Ok

BCM.0> debug bcm api -

debug bcm api -

BCM.0> l2 show

l2 show

mac=00:50:c5:00:00:d7 vlan=1 GPORT=0xd modid=0 port=13/ge12 Hit

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=2 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:03 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:01 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:04 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

BCM.0>


在命令删除mac 0x000000000005 vlanid=1 的表项时,调用驱动接口

int bcm_l2_addr_delete( int unit, bcm_mac_t mac, bcm_vlan_t vid)


查看L2 表,成功删除。


3.5 添加组播地址

BCM.0> mcast add mac=0x01005e000009 vlanid=1 pbm=ge8-ge11

mcast add mac=0x01005e000009 vlanid=1 pbm=ge8-ge11

BCM.0> L2 show

L2 show

mac=00:50:c5:00:00:d7 vlan=1 GPORT=0xd modid=0 port=13/ge12 Hit

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=2 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=01:00:5e:00:00:09 vlan=1 GPORT=0x0 modid=0 port=0/cpu0 Static CPU MCast=1

mac=00:00:00:00:00:03 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:01 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:04 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

BCM.0> d L2mc 1 1

d L2mc 1 1

L2MC.ipipe0[1]: <VALID=1,PORT_BITMAP_W1=0,PORT_BITMAP_W0=0x1e00,PORT_BITMAP=0x0000000000001e00,HIGIG_TRUNK_OVERRIDE_PROFILE_PTR=0,EVEN_PARITY=0>

BCM.0> pbmp 0x0000000000001e00

pbmp 0x0000000000001e00

0x0000000000000000000000000000000000000000000000000000000000001e00 ==> ge8-ge11


命令在调用驱动接口

int bcm_mcast_addr_add( int unit, bcm_mcast_addr_t *mcaddr)


添加组播mac=0x01005e000009 vlanid=1 pbm=ge8-ge11 的表项后,查看L2 entry表,MCast=1,即L2mc 表的index1dump L2mc,端口位图为0x1e00,对应ge8-ge11.


3.6 删除组播地址

BCM.0> debug bcm api

debug bcm api

BCM.0> mcast delete mac=0x01005e000009 vlanid=1

mcast delete mac=0x01005e000009 vlanid=1

API: bcm_mcast_addr_remove(0,...) -> 0 Ok

BCM.0> debug bcm api -

debug bcm api -

BCM.0> d chg L2mc

d chg L2mc

BCM.0> L2 show

L2 show

mac=00:50:c5:00:00:d7 vlan=1 GPORT=0xd modid=0 port=13/ge12 Hit

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=2 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:03 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:01 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:04 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

BCM.0>


命令调用驱动接口

int bcm_mcast_addr_remove( int unit, bcm_mac_t mac, bcm_vlan_t vid)


删除mac=0x01005e000009 vlanid=1 的组播地址之后,查看L2mc L2 entry

都没有此表项。

3.7 清除所有动态地址

BCM.0> l2 show

l2 show

mac=00:50:c5:00:00:d7 vlan=1 GPORT=0xd modid=0 port=13/ge12 Hit

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:03 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:01 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:05 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Static

mac=00:00:00:00:00:04 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

BCM.0> debug bcm api

debug bcm api

BCM.0> L2 clear port=ge8 Static=false

L2 clear port=ge8 Static=false

L2: Deleting non-static addresses by port, local module ID

API: bcm_l2_addr_delete_by_port(0,-1,9,...) -> 0 Ok

BCM.0> debug bcm api -

debug bcm api -

BCM.0> L2 show

L2 show

mac=00:50:c5:00:00:d7 vlan=1 GPORT=0xd modid=0 port=13/ge12 Hit

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:05 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Static

BCM.0>


命令调用驱动接口

int

bcm_l2_addr_delete_by_port( int unit, bcm_module_t mod,

bcm_port_t port, uint32 flags)


基于端口删除所有动态地址之后,查看L2 entry表,静态地址保留,动态地址删除。

mac=d4:be:d9:e3:95:8d pc 的地址。


3.8 获取地址表老化时间

BCM.0> debug bcm api

debug bcm api

BCM.0> age

age

API: bcm_l2_age_timer_get(0,...) -> 0 Ok

Current age timer is 0.

BCM.0>


命令调用驱动接口

int bcm_l2_age_timer_get(int unit, int *age_seconds)


获取地址表老化时间,Setting to 0 disables hardware aging

3.9 地址表老化时间设置

BCM.0> age 60

age 60

API: bcm_l2_age_timer_set(0,60) -> 0 Ok

Set age timer to 60.

BCM.0> age

age

API: bcm_l2_age_timer_get(0,...) -> 0 Ok

Current age timer is 60.

BCM.0>

BCM.0> debug bcm api -

debug bcm api -

BCM.0> L2 show

L2 show

mac=00:50:c5:00:00:d7 vlan=1 GPORT=0xd modid=0 port=13/ge12 Hit

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:03 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:01 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:02 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:05 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Static

mac=00:00:00:00:00:04 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

BCM.0> date

date

1970/01/01 02:39:50 UTC

BCM.0> L2 show

L2 show

mac=00:50:c5:00:00:d7 vlan=1 GPORT=0xd modid=0 port=13/ge12 Hit

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0x9 modid=0 port=9/ge8 Hit

mac=00:00:00:00:00:03 vlan=1 GPORT=0x9 modid=0 port=9/ge8

mac=00:00:00:00:00:01 vlan=1 GPORT=0x9 modid=0 port=9/ge8

mac=00:00:00:00:00:02 vlan=1 GPORT=0x9 modid=0 port=9/ge8

mac=00:00:00:00:00:05 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Static

mac=00:00:00:00:00:04 vlan=1 GPORT=0x9 modid=0 port=9/ge8

BCM.0> L2 show

L2 show

mac=00:50:c5:00:00:d7 vlan=1 GPORT=0xd modid=0 port=13/ge12

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0x9 modid=0 port=9/ge8

mac=00:00:00:00:00:05 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Static

BCM.0> date

date

1970/01/01 02:41:10 UTC

BCM.0>

BCM.0> L2 show

L2 show

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0x9 modid=0 port=9/ge8

mac=00:00:00:00:00:05 vlan=1 GPORT=0x9 modid=0 port=9/ge8 Static

BCM.0>


命令调用驱动接口

int bcm_l2_age_timer_set( int unit, int age_seconds)

设置硬件老化时候为60s 之后,在第一个60s 到来时,如果地址没有再次命中,将hit 0,第二个60s 到来时,将hit0的表项删除。


4. VLAN

4.1 创建VLAN

BCM.0> vlan create 2 pbm=ge8-ge13 ubm=ge8-ge10

vlan create 2 pbm=ge8-ge13 ubm=ge8-ge10

API: bcm_vlan_create(0,2) -> 0 Ok

API: bcm_vlan_port_add(0,2,...) -> 0 Ok

BCM.0> db bcm api -

db bcm api -

BCM.0> vlan show 2

vlan show 2

vlan 2 ports ge8-ge13 (0x0000000000000000000000000000000000000000000000000000000000007e00), untagged ge8-ge10 (0x0000000000000000000000000000000000000000000000000000000000000e00) MCAST_FLOOD_UNKNOWN

BCM.0>


命令调用驱动接口

int bcm_vlan_create( int unit, bcm_vlan_t vid)


创建vlan 2 ,添加端口ge8--ge10untag方式,ge11--ge13tag方式加入vlan.


4.2 删除VLAN

BCM.0> db bcm api

db bcm api

BCM.0> vlan destroy 2

vlan destroy 2

API: bcm_vlan_destroy(0,2) -> 0 Ok

BCM.0> db bcm api -

db bcm api -

BCM.0> vlan show

vlan show

vlan 1 ports cpu,ge,xe,hg (0x00000000000000000000000000000000000000000000000000ffffffffffffff), untagged ge,xe,hg (0x00000000000000000000000000000000000000000000000000fffffffffffffe) MCAST_FLOOD_UNKNOWN

BCM.0>


命令调用驱动接口

int bcm_vlan_destroy( int unit, bcm_vlan_t vid)


删除vlan 2 之后,查看vlan entry,只有vlan 1 的表项。


4.3 端口以UNTAG形式加入VLAN

BCM.0> vlan create 2

vlan create 2

API: bcm_vlan_create(0,2) -> 0 Ok

API: bcm_vlan_port_add(0,2,...) -> 0 Ok

BCM.0> vlan add 2 pbm=ge8-ge10 ubm=ge8-ge10

vlan add 2 pbm=ge8-ge10 ubm=ge8-ge10

API: bcm_vlan_port_add(0,2,...) -> 0 Ok

BCM.0> vlan show 2

vlan show 2

API: bcm_vlan_list(0,...) -> 0 Ok

API: bcm_vlan_mcast_flood_get(0,2,...) -> 0 Ok

vlan 2 ports ge8-ge10 (0x0000000000000000000000000000000000000000000000000000000000000e00), untagged ge8-ge10 (0x0000000000000000000000000000000000000000000000000000000000000e00) MCAST_FLOOD_UNKNOWN

API: bcm_vlan_list_destroy(0,...) -> 0 Ok

BCM.0>


命令调用驱动接口

int

bcm_vlan_port_add( int unit, bcm_vlan_t vid, bcm_pbmp_t pbmp,

bcm_pbmp_t ubmp)


添加untag bmp ge8-ge10vlan 2中。

4.4 端口以TAG形式加入VLAN

BCM.0> vlan add 2 pbm=ge11-ge13

vlan add 2 pbm=ge11-ge13

API: bcm_vlan_port_add(0,2,...) -> 0 Ok

BCM.0> vlan show 2

vlan show 2

API: bcm_vlan_list(0,...) -> 0 Ok

API: bcm_vlan_mcast_flood_get(0,2,...) -> 0 Ok

vlan 2 ports ge8-ge13 (0x0000000000000000000000000000000000000000000000000000000000007e00), untagged ge8-ge10 (0x0000000000000000000000000000000000000000000000000000000000000e00) MCAST_FLOOD_UNKNOWN

API: bcm_vlan_list_destroy(0,...) -> 0 Ok

BCM.0>


命令调用驱动接口

int

bcm_vlan_port_add( int unit, bcm_vlan_t vid, bcm_pbmp_t pbmp,

bcm_pbmp_t ubmp)


添加tag bmp ge11-ge13vlan 2中。


4.5 端口退出VLAN

BCM.0> vlan remove 2 pbm=ge11-ge13

vlan remove 2 pbm=ge11-ge13

API: bcm_vlan_port_remove(0,2,...) -> 0 Ok

BCM.0> vlan show 2

vlan show 2

API: bcm_vlan_list(0,...) -> 0 Ok

API: bcm_vlan_mcast_flood_get(0,2,...) -> 0 Ok

vlan 2 ports ge8-ge10 (0x0000000000000000000000000000000000000000000000000000000000000e00), untagged ge8-ge10 (0x0000000000000000000000000000000000000000000000000000000000000e00) MCAST_FLOOD_UNKNOWN

API: bcm_vlan_list_destroy(0,...) -> 0 Ok

BCM.0>


命令调用驱动接口

int

bcm_vlan_port_remove( int unit, bcm_vlan_t vid, bcm_pbmp_t pbmp)


vlan 2 pbm中删除ge11-ge13


4.6 获取端口默认VLAN

BCM.0> vlan default

vlan default

API: bcm_vlan_default_get(0,...) -> 0 Ok

Default VLAN ID is 1

BCM.0>


命令调用

int

bcm_port_untagged_vlan_get( int unit, bcm_port_t port, bcm_vlan_t *vid_ptr)


获取端口的default vlanid.


4.7 设置端口默认VLAN

BCM.0> vlan default 2

vlan default 2

API: bcm_vlan_default_set(0,2) -> 0 Ok

Default VLAN ID set to 2

BCM.0> vlan default

vlan default

API: bcm_vlan_default_get(0,...) -> 0 Ok

Default VLAN ID is 2

BCM.0>


命令调用驱动接口

int

bcm_port_untagged_vlan_set(int unit, bcm_port_t port, bcm_vlan_t vid)


设置端口的default vlan id


4.8 广播报文转发

交换芯片Helix4 L2 L3功能验证


端口状态中,有ge9, ge10, ge11 三个端口为up, 创建vlan 2 ,将ge9, ge10tagged加入valn中,构造20个带vlan tag2的广播报文,从ge9打入,查看端口报文统计,只有ge10 出。

BCM.0> vlan create 2 pbm=ge9,ge10

vlan create 2 pbm=ge9,ge10

BCM.0> vlan show

vlan show

vlan 1 ports cpu,ge,xe,hg (0x00000000000000000000000000000000000000000000000000ffffffffffffff), untagged ge,xe,hg (0x00000000000000000000000000000000000000000000000000fffffffffffffe) MCAST_FLOOD_UNKNOWN

vlan 2 ports ge9-ge10 (0x0000000000000000000000000000000000000000000000000000000000000c00), untagged none (0x0000000000000000000000000000000000000000000000000000000000000000) MCAST_FLOOD_UNKNOWN

BCM.0> clear c

clear c

BCM.0> show c

show c

交换芯片Helix4 L2 L3功能验证


所有端口以untag 方式加入vlan 1 ,ge11口打入目的未知单播的二层报文,查看端口统计计数,报文在vlan 1内广播。

BCM.0> vlan show 1

vlan show 1

vlan 1 ports cpu,ge,xe,hg (0x00000000000000000000000000000000000000000000000000ffffffffffffff), untagged ge,xe,hg (0x00000000000000000000000000000000000000000000000000fffffffffffffe) MCAST_FLOOD_UNKNOWN

BCM.0>

 

4.9 已知单播报文转发

端口ge9, ge10, ge11 都以untag 加入vlan 1中,从ge9打入20个目的mac00:50:c5:00:00:d7untag报文,查看端口报文统计,只有ge10 收到。

BCM.0> l2 show

l2 show

mac=00:50:c5:00:00:d7 vlan=1 GPORT=0xb modid=0 port=11/ge10 Hit

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0xa modid=0 port=10/ge9 Hit

mac=3c:8c:40:0f:8d:1f vlan=1 GPORT=0xc modid=0 port=12/ge11 Hit

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0xc modid=0 port=12/ge11 Hit

mac=00:00:00:00:00:01 vlan=2 GPORT=0xa modid=0 port=10/ge9 Hit

BCM.0> vlan destroy 2

vlan destroy 2

BCM.0> vlan show

vlan show

vlan 1 ports cpu,ge,xe,hg (0x00000000000000000000000000000000000000000000000000ffffffffffffff), untagged ge,xe,hg (0x00000000000000000000000000000000000000000000000000fffffffffffffe) MCAST_FLOOD_UNKNOWN

BCM.0> clear c

交换芯片Helix4 L2 L3功能验证


5. IGMP SNOOPING

5.1 获取IGMP报文送CPU

BCM.0> db bcm api

db bcm api

BCM.0> switchcontrol IgmpPktToCpu

switchcontrol IgmpPktToCpu

API: bcm_switch_control_get(0,92,...) -> 0 Ok

0x0

BCM.0>


命令调用驱动接口

int

bcm_switch_control_port_get( int unit, bcm_port_t port,

bcm_switch_control_t type, int *arg)


获取IGMP报文送cpu是否使能。

5.2 设置IGMP报文送CPU

BCM.0> switchcontrol IgmpPktToCpu=1

switchcontrol IgmpPktToCpu=1

API: bcm_switch_control_set(0,92,1) -> 0 Ok

BCM.0> switchcontrol IgmpPktToCpu

switchcontrol IgmpPktToCpu

API: bcm_switch_control_get(0,92,...) -> 0 Ok

0x1

BCM.0>


命令调用驱动接口

int

bcm_switch_control_port_set( int unit, bcm_port_t port,

bcm_switch_control_t type, int arg)


设置IGMP报文送CPU使能。

5.3 获取未知名组播不转发

BCM.0> db bcm api

db bcm api

BCM.0> vlan MulticastFlood 1

vlan MulticastFlood 1

API: bcm_vlan_mcast_flood_get(0,1,...) -> 0 Ok

vlan 1 Multicast Flood Mode is MCAST_FLOOD_UNKNOWN

BCM.0>

或者是如下命令

BCM.0> vlan 1

vlan 1

Current settings:

VRF=0

OuterTPID=0x8100

LearnDisable=0

UnknownIp6McastToCpu=0

UnknownIp4McastToCpu=0

Ip4Disable=0

Ip6Disable=0

Ip4McastDisable=0

Ip6McastDisable=0

Ip4McastL2Disable=0

Ip6McastL2Disable=0

L3VrfGlobalDisable=0

MplsDisable=0

CosqEnable=0

MiMTermDisable=0

Cosq=0

Ip6McastFloodMode=MCAST_FLOOD_UNKNOWN

Ip4McastFloodMode=MCAST_FLOOD_UNKNOWN

L2McastFloodMode=MCAST_FLOOD_UNKNOWN

IfClass=0

BCM.0>


命令调用驱动接口

int

bcm_vlan_mcast_flood_set( int unit, bcm_vlan_t vlan,

bcm_vlan_mcast_flood_t mode)


获取vlan 1 multicast flood mode


5.4 设置未知名组播不转发

BCM.0> vlan MulticastFlood 1 2

vlan MulticastFlood 1 2

API: bcm_vlan_mcast_flood_set(0,1,2) -> 0 Ok

BCM.0> vlan MulticastFlood 1

vlan MulticastFlood 1

API: bcm_vlan_mcast_flood_get(0,1,...) -> 0 Ok

vlan 1 Multicast Flood Mode is MCAST_FLOOD_NONE

BCM.0>


/*

* Defines:

* _SHR_PORT_MCAST_FLOOD_*

* Purpose:

* Multicast packet flooding mode

*/

typedef enum _shr_port_mcast_flood_e {

_SHR_PORT_MCAST_FLOOD_ALL = 0,

_SHR_PORT_MCAST_FLOOD_UNKNOWN = 1,

_SHR_PORT_MCAST_FLOOD_NONE = 2,

_SHR_PORT_MCAST_FLOOD_COUNT /* last, please */

} _shr_port_mcast_flood_t;


命令调用驱动接口

int

bcm_vlan_mcast_flood_set( int unit, bcm_vlan_t vlan,

bcm_vlan_mcast_flood_t mode)


设置vlan 1 pfm2,即未知组播丢弃。


5.5 组播报文转发

1. Vlan 1 的组播报文pfm设置为FLOOD UNKNOWN, 打入目的mac01005e000010的组播mac,在vlan内所有端口转发。

BCM.0> vlan show 1

vlan show 1

vlan 1 ports cpu,ge,xe,hg (0x00000000000000000000000000000000000000000000000000ffffffffffffff), untagged ge,xe,hg (0x00000000000000000000000000000000000000000000000000fffffffffffffe) MCAST_FLOOD_UNKNOWN

BCM.0> d chg l2mc

d chg l2mc

交换芯片Helix4 L2 L3功能验证


2. 配置未知组播丢弃之后,配置ge11为组播源,ge15加入组播组,从ge11打入13个目的mac01:00:00:00:00:10 的报文,只有ge15收到组播报文。

BCM.0> vlan MulticastFlood 1 2

BCM.0> vlan multicastflood 1

vlan 1 Multicast Flood Mode is MCAST_FLOOD_NONE

BCM.0> mcast add mac=01:00:00:00:00:10 vlan=1 pbm=ge11 ubm=ge11


BCM.0> mcast join mac=01:00:00:00:00:10 vlan=1 pbm=ge15

port ge15 updated

BCM.0> l2 show

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0xc modid=0 port=12/ge11 Hit

mac=01:00:00:00:00:10 vlan=1 GPORT=0x0 modid=0 port=0/cpu0 Static CPU MCast=1

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit

BCM.0> d chg l2mc 1 1

L2MC.ipipe0[1]: <VALID=1,PORT_BITMAP_W0=0x11000,PORT_BITMAP=0x0000000000011000,>

BCM.0> pbmp 0x0000000000011000

0x0000000000000000000000000000000000000000000000000000000000011000 ==> ge11,ge15

交换芯片Helix4 L2 L3功能验证


3. 端口ge15 离开组播组,从ge11发送组播流量,未知组播都被丢弃。

BCM.0> mcast leave mac=01:00:00:00:00:10 vlan=1 pbm=ge15

mcast leave mac=01:00:00:00:00:10 vlan=1 pbm=ge15

port ge15 updated

BCM.0> l2 show

l2 show

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0xc modid=0 port=12/ge11 Hit

mac=01:00:00:00:00:10 vlan=1 GPORT=0x0 modid=0 port=0/cpu0 Static Hit CPU MCast=1

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit

BCM.0> d chg l2mc 1 1

d chg l2mc 1 1

L2MC.ipipe0[1]: <VALID=1,PORT_BITMAP_W0=0x1000,PORT_BITMAP=0x0000000000001000,>

BCM.0> pbmp 0x0000000000001000

pbmp 0x0000000000001000

0x0000000000000000000000000000000000000000000000000000000000001000 ==> ge11

BCM.0> clear c

BCM.0> vlan multicastflood 1

vlan multicastflood 1

vlan 1 Multicast Flood Mode is MCAST_FLOOD_NONE

BCM.0>

6. 端口聚合

6.1 创建聚合口

BCM.0> trunk init

trunk init

API: bcm_trunk_init(0) -> 0 Ok

BCM.0> trunk add id=1 rtag=1 pbmp=ge8-ge10

trunk add id=1 rtag=1 pbmp=ge8-ge10

API: bcm_stk_my_modid_get(0,...) -> 0 Ok

API: bcm_trunk_chip_info_get(0,...) -> 0 Ok

API: bcm_stk_modmap_map(0,2,0,...) -> 0 Ok

API: bcm_stk_modmap_map(0,2,0,...) -> 0 Ok

API: bcm_stk_modmap_map(0,2,0,...) -> 0 Ok

API: bcm_trunk_create(0,16,...) -> 0 Ok

API: bcm_trunk_set(0,1,...) -> 0 Ok

BCM.0> db bcm api -

db bcm api -

BCM.0> trunk show id=1

trunk show id=1

Device supports 1032 trunk groups:

1024 front panel trunks (0..1023), 256 ports/trunk

8 fabric trunks (1024..1031), 16 ports/trunk

trunk 1: (front panel, 3 ports)=ge8,ge9,ge10 dlf=any mc=any ipmc=any psc=srcmac (0x1)


命令调用驱动接口

int bcm_trunk_create( int unit, uint32 flags, bcm_trunk_t *tid)


创建trunk ID 1 ,并添加端口。


6.2 删除聚合口

BCM.0> db bcm api

db bcm api

BCM.0> trunk remove id=1 pbmp=ge8-ge10

trunk remove id=1 pbmp=ge8-ge10

API: bcm_stk_my_modid_get(0,...) -> 0 Ok

API: bcm_trunk_get(0,1,...) -> 0 Ok

API: bcm_stk_my_modid_get(0,...) -> 0 Ok

API: bcm_trunk_destroy(0,1) -> 0 Ok

BCM.0> trunk show id=1

trunk show id=1

API: bcm_trunk_chip_info_get(0,...) -> 0 Ok

Device supports 1032 trunk groups:

1024 front panel trunks (0..1023), 256 ports/trunk

8 fabric trunks (1024..1031), 16 ports/trunk

API: bcm_trunk_get(0,1,...) -> -7 Entry not found

[no matching trunks defined]

BCM.0>


命令调用驱动接口

int bcm_trunk_destroy( int unit, bcm_trunk_t tid)


删除trunk ID 1 trunk 组。


6.3 聚合口是否存在

BCM.0> trunk show id=1

trunk show id=1

API: bcm_trunk_chip_info_get(0,...) -> 0 Ok

Device supports 1032 trunk groups:

1024 front panel trunks (0..1023), 256 ports/trunk

8 fabric trunks (1024..1031), 16 ports/trunk

API: bcm_trunk_get(0,1,...) -> -7 Entry not found

[no matching trunks defined]

BCM.0>


命令调用驱动接口

int

bcm_trunk_get( int unit, bcm_trunk_t tid, bcm_trunk_info_t *t_data,

int member_max, bcm_trunk_member_t *member_array,

int *member_count)


获取trunk 组是否存在。

6.4 端口加入聚合口


BCM.0> trunk show id=1

trunk show id=1

Device supports 1032 trunk groups:

1024 front panel trunks (0..1023), 256 ports/trunk

8 fabric trunks (1024..1031), 16 ports/trunk

trunk 1: (front panel, 3 ports)=ge8,ge9,ge10 dlf=any mc=any ipmc=any psc=srcmac (0x1)

BCM.0> db bcm api

db bcm api

BCM.0> trunk add id=1 rtag=1 pbmp=ge11-13

trunk add id=1 rtag=1 pbmp=ge11-13

API: bcm_stk_my_modid_get(0,...) -> 0 Ok

API: bcm_trunk_chip_info_get(0,...) -> 0 Ok

API: bcm_stk_modmap_map(0,2,0,...) -> 0 Ok

API: bcm_stk_modmap_map(0,2,0,...) -> 0 Ok

API: bcm_trunk_create(0,16,...) -> -8 Entry exists

API: bcm_trunk_set(0,1,...) -> 0 Ok

BCM.0> db bcm api -

db bcm api -

BCM.0> trunk show id=1

trunk show id=1

Device supports 1032 trunk groups:

1024 front panel trunks (0..1023), 256 ports/trunk

8 fabric trunks (1024..1031), 16 ports/trunk

trunk 1: (front panel, 2 ports)=ge11,ge12 dlf=any mc=any ipmc=any psc=srcmac (0x1)

BCM.0>


命令调用驱动接口

int

bcm_trunk_set( int unit, bcm_trunk_t tid, bcm_trunk_info_t *trunk_info,

int member_count, bcm_trunk_member_t *member_array)


添加port ge11-ge13trunk id 1 中。


6.5 端口退出聚合口

5.4 中所示,

命令调用驱动接口

int

bcm_trunk_set( int unit, bcm_trunk_t tid, bcm_trunk_info_t *trunk_info,

int member_count, bcm_trunk_member_t *member_array)


在将新的端口ge11-ge13加入到trunk id 1 中之后,原有的ge8, ge9, ge10不存在于trunk 组中。




6.6 聚合组负载分担

如下,创建Trunk 组,配置rtag 1,基于源mac负载分担,将端口ge9, ge10加入trunk组。

BCM.0> trunk init

BCM.0> pbmp ge9,ge10

pbmp ge9,ge10

0x0000000000000000000000000000000000000000000000000000000000000c00 ==> ge9-ge10

BCM.0> trunk add id=1 rtag=1 pbmp=0x0c00

BCM.0> trunk show

Device supports 1032 trunk groups:

1024 front panel trunks (0..1023), 256 ports/trunk

8 fabric trunks (1024..1031), 16 ports/trunk

trunk 1: (front panel, 2 ports)=ge9,ge10 dlf=any mc=any ipmc=any psc=srcmac (0x1)


添加静态mac,目的端口为trunk组,构造目的mac00:00:00:03:02:02,源mac递增的二层报文,分别打入10000个和以1000p/s速率打入ge12,查看ge9,ge10上报文统计计数,

报文个数和速率都已负载分担。


BCM.0> l2 add mac=00:00:00:03:02:02 Vlanid=1 Trunk=true TrunkGroupId=1


BCM.0> show c

show c

MC_PERQ_PKT(0).cpu0 : 1 +1

MC_PERQ_BYTE(0).cpu0 : 337 +337

RUC.ge9 : 5,000 +5,000

RDBGC0.ge9 : 5,000 +5,000

R64.ge9 : 5,000 +5,000

R511.ge9 : 1 +1

RPKT.ge9 : 5,001 +5,001

RUCA.ge9 : 5,000 +5,000

RMCA.ge9 : 1 +1

RPRM.ge9 : 5,000 +5,000

RPOK.ge9 : 5,001 +5,001

RBYT.ge9 : 320,333 +320,333

T64.ge9 : 5,000 +5,000

T127.ge9 : 2 +2

TPOK.ge9 : 5,002 +5,002

TPKT.ge9 : 5,002 +5,002

TUCA.ge9 : 5,000 +5,000

TBCA.ge9 : 2 +2

TBYT.ge9 : 320,172 +320,172

MC_PERQ_PKT(0).ge9 : 2 +2

MC_PERQ_BYTE(0).ge9 : 172 +172

UC_PERQ_PKT(0).ge9 : 5,000 +5,000

UC_PERQ_BYTE(0).ge9 : 320,000 +320,000

RUC.ge10 : 5,000 +5,000

RDBGC0.ge10 : 5,000 +5,000

R64.ge10 : 5,000 +5,000

R127.ge10 : 2 +2

RPKT.ge10 : 5,002 +5,002

RUCA.ge10 : 5,000 +5,000

RBCA.ge10 : 2 +2

RPRM.ge10 : 5,000 +5,000

RPOK.ge10 : 5,002 +5,002

RBYT.ge10 : 320,172 +320,172

T64.ge10 : 5,000 +5,000

TPOK.ge10 : 5,000 +5,000

TPKT.ge10 : 5,000 +5,000

TUCA.ge10 : 5,000 +5,000

TBYT.ge10 : 320,000 +320,000

UC_PERQ_PKT(0).ge10 : 5,000 +5,000

UC_PERQ_BYTE(0).ge10 : 320,000 +320,000

RUC.ge12 : 10,000 +10,000

R64.ge12 : 10,000 +10,000

R127.ge12 : 2 +2

RPKT.ge12 : 10,002 +10,002

RUCA.ge12 : 10,000 +10,000

RBCA.ge12 : 2 +2

RPRM.ge12 : 10,000 +10,000

RPOK.ge12 : 10,002 +10,002

RBYT.ge12 : 640,172 +640,172

T127.ge12 : 2 +2

TPOK.ge12 : 2 +2

TPKT.ge12 : 2 +2

TBCA.ge12 : 2 +2

TBYT.ge12 : 172 +172

MC_PERQ_PKT(0).ge12 : 2 +2

MC_PERQ_BYTE(0).ge12 : 172 +172

T127.ge48 : 4 +4

TPOK.ge48 : 4 +4

TPKT.ge48 : 4 +4

TBCA.ge48 : 4 +4

TBYT.ge48 : 344 +344

MC_PERQ_PKT(0).ge48 : 4 +4

MC_PERQ_BYTE(0).ge48 : 344 +344

BCM.0> clear c

clear c

BCM.0> show c

show c

RUC.ge9 : 1,716 +1,716 501/s

RDBGC0.ge9 : 1,716 +1,716 501/s

R64.ge9 : 1,716 +1,716 501/s

RPKT.ge9 : 1,716 +1,716 501/s

RUCA.ge9 : 1,716 +1,716 501/s

RPRM.ge9 : 1,716 +1,716 501/s

RPOK.ge9 : 1,716 +1,716 501/s

RBYT.ge9 : 109,824 +109,824 32,072/s

T64.ge9 : 1,716 +1,716 501/s

T255.ge9 : 1 +1 1/s

TPOK.ge9 : 1,717 +1,717 502/s

TPKT.ge9 : 1,717 +1,717 502/s

TUCA.ge9 : 1,716 +1,716 501/s

TMCA.ge9 : 1 +1 1/s

TBYT.ge9 : 109,985 +109,985 32,220/s

MC_PERQ_PKT(0).ge9 : 1 +1 1/s

MC_PERQ_BYTE(0).ge9 : 161 +161 148/s

UC_PERQ_PKT(0).ge9 : 1,732 +1,732 495/s

UC_PERQ_BYTE(0).ge9 : 110,848 +110,848 31,661/s

RUC.ge10 : 1,716 +1,716 501/s

RDBGC0.ge10 : 1,716 +1,716 501/s

RDBGC1.ge10 : 1 +1 1/s

R64.ge10 : 1,716 +1,716 501/s

R255.ge10 : 1 +1 1/s

RPKT.ge10 : 1,717 +1,717 502/s

RUCA.ge10 : 1,716 +1,716 501/s

RMCA.ge10 : 1 +1 1/s

RPRM.ge10 : 1,716 +1,716 501/s

RPOK.ge10 : 1,717 +1,717 502/s

RBYT.ge10 : 109,985 +109,985 32,220/s

T64.ge10 : 1,715 +1,715 501/s

TPOK.ge10 : 1,715 +1,715 501/s

TPKT.ge10 : 1,715 +1,715 501/s

TUCA.ge10 : 1,715 +1,715 501/s

TBYT.ge10 : 109,760 +109,760 32,072/s

UC_PERQ_PKT(0).ge10 : 1,731 +1,731 494/s

UC_PERQ_BYTE(0).ge10 : 110,784 +110,784 31,602/s

RUC.ge12 : 3,424 +3,424 1,002/s

RDBGC1.ge12 : 1 +1 1/s

R64.ge12 : 3,423 +3,423 1,002/s

R255.ge12 : 1 +1 1/s

RPKT.ge12 : 3,424 +3,424 1,003/s

RUCA.ge12 : 3,423 +3,423 1,002/s

RMCA.ge12 : 1 +1 1/s

RPRM.ge12 : 3,423 +3,423 1,002/s

RPOK.ge12 : 3,424 +3,424 1,003/s

RBYT.ge12 : 219,169 +219,169 64,291/s

T255.ge12 : 1 +1 1/s

TPOK.ge12 : 1 +1 1/s

TPKT.ge12 : 1 +1 1/s

TMCA.ge12 : 1 +1 1/s

TBYT.ge12 : 161 +161 148/s

MC_PERQ_PKT(0).ge12 : 1 +1 1/s

MC_PERQ_BYTE(0).ge12 : 161 +161 148/s

7. 端口安全

7.1 开启端口安全

在端口ge11 上使能安全检查,LearnEnable 设置为false之后,查看port ge11Lrn 标识为cpu。从ge11 打入构造的源mac 为非L2 Entry表中的广播二层报文,查看端口报文统计,其他端口没有收到,打入源macd4:be:d9:e3:95:8d 广播报文,其他端口都可以收到。

BCM.0> auth init

auth init

BCM.0> auth mac init

auth mac init

All ports set to MAC address 00:19:ad:75:01:11

BCM.0> port ge11

port ge11

PORT: Status (* indicates PHY link up)

*ge11 LS(SW) Auto(1GFD,pause) Ability (fd = 10MB,100MB,1000MB hd = intf = sgmii medium = copper pause = pause_tx,pause_rx,pause_asymm lb = none,MAC,PHY flags = autoneg )Local (fd = 10MB,100MB,1000MB hd = intf = medium = pause = pause_tx,pause_rx lb = flags = )Remote (fd = 10MB,100MB,1000MB hd = 10MB,100MB,1000MB intf = medium = pause = pause_rx lb = flags = )STP(Forward) Lrn(ARL,FWD) UtPri(0) Pfm(FloodNone) IF(SGMII) PH(Auto) Max_frame(16356) MDIX(Auto, Normal) Medium(Copper) VLANFILTER(2)

BCM.0> l2 show

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0xc modid=0 port=12/ge11 Hit

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit

BCM.0> db bcm api

db bcm api

BCM.0> BCM.0> auth enable pbm=ge11 LE=false IL=false

auth enable pbm=ge11 LE=false IL=false

API: bcm_port_config_get(0,...) -> 0 Ok

API: bcm_auth_mode_set(0,12,4) -> 0 Ok

port ge11 authorization enabled.

BCM.0> port ge11

PORT: Status (* indicates PHY link up)

*ge11 LS(SW) Auto(1GFD,pause) Ability (fd = 10MB,100MB,1000MB hd = intf = sgmii medium = copper pause = pause_tx,pause_rx,pause_asymm lb = none,MAC,PHY flags = autoneg )Local (fd = 10MB,100MB,1000MB hd = intf = medium = pause = pause_tx,pause_rx lb = flags = )Remote (fd = 10MB,100MB,1000MB hd = 10MB,100MB,1000MB intf = medium = pause = pause_rx lb = flags = )STP(Forward) Lrn(CPU) UtPri(0) Pfm(FloodNone) IF(SGMII) PH(Auto) Max_frame(16356) MDIX(Auto, Normal) Medium(Copper) VLANFILTER(2)

BCM.0> clear c

交换芯片Helix4 L2 L3功能验证

命令调用驱动接口

int bcm_auth_mode_set( int unit, int port, uint32 mode)


7.2 关闭端口安全

BCM.0> debug bcm api

debug bcm api

BCM.0> auth unblock pbm=ge11

auth unblock pbm=ge11

API: bcm_port_config_get(0,...) -> 0 Ok

API: bcm_auth_mode_set(0,12,1) -> 0 Ok

port ge11 unblock - all traffic allowed now.

ge11 口打入源mac在与不在L2 Entry表中二层广播的报文,其他端口都能收到。

8. 路由表

8.1 创建三层接口

BCM.0> l3 init

l3 init

API: bcm_l3_init(0) -> 0 Ok

BCM.0> l3 intf add mac=00:19:ad:75:01:11 vlan=1 intf=1

l3 intf add mac=00:19:ad:75:01:11 vlan=1 intf=1

API: bcm_l3_intf_create(0,...) -> 0 Ok

BCM.0>

BCM.0> l3 intf show intf=1

l3 intf show intf=1

Free L3INTF entries: 8190

Unit Intf VRF Group VLAN Source Mac MTU TTL Tunnel InnerVlan NATRealm

------------------------------------------------------------------

0 1 0 0 1 00:19:ad:75:01:11 16383 0 0 0 0


命令调用驱动接口

int bcm_l3_intf_create( int unit, bcm_l3_intf_t *intf)


创建Intf 1,交换机mac 00:19:ad:75:01:11, vlan 1

查看my_station_tcam 表,已成功创建。


BCM.0> d chg my_station_tcam

d chg my_station_tcam

MY_STATION_TCAM.ipipe0[511]: <VLAN_ID_MASK=0xfff,VLAN_ID=1,VALID=1,MASK=0x00000fffffffffffffff,MAC_ADDR_MASK=0xffffffffffff,MAC_ADDR=0x0019ad750111,KEY=0x000000010019ad750111,IPV6_TERMINATION_ALLOWED=1,IPV4_TERMINATION_ALLOWED=1,DATA=0x38,ARP_RARP_TERMINATION_ALLOWED=1>

8.2 添加IP

BCM.0> debug bcm api

debug bcm api

BCM.0> l3 l3table add ip=192.168.6.10 intf=1 mac=00:19:ad:75:01:12 port=ge8

l3 l3table add ip=192.168.6.10 intf=1 mac=00:19:ad:75:01:12 port=ge8

API: bcm_l3_host_add(0,...) -> 0 Ok

BCM.0> l3 l3table show

l3 l3table show

Unit 0, free L3 table entries: 24575

Entry VRF IP address Mac Address INTF MOD PORT CLASS HIT

1 0 192.168.6.10 00:19:ad:75:01:12 1 0 9 0 n


命令调用驱动接口

int bcm_l3_host_add( int unit, bcm_l3_host_t *info)


创建主机路由表项192.168.6.10 对应mac 00:19:ad:75:01:12,端口为9.


8.3 删除IP

BCM.0> debug bcm api

debug bcm api

BCM.0> l3 l3table destroy vrf=0 ip=192.168.6.10

l3 l3table destroy vrf=0 ip=192.168.6.10

API: bcm_l3_host_delete(0,...) -> 0 Ok

BCM.0>

BCM.0> l3 l3table show

l3 l3table show

Unit 0, free L3 table entries: 24576

Entry VRF IP address Mac Address INTF MOD PORT CLASS HIT

BCM.0>


命令调用驱动接口

int bcm_l3_host_delete( int unit, bcm_l3_host_t *ip_addr)


删除主机路由ip = 192.168.6.10.

8.4 添加路由

BCM.0> l3 defip add vrf=0 ip=192.168.5.0 MaSk=255.255.255.0 Mac=0x000000030201 INtf=2 port=ge12

API: bcm_l3_route_add(0,...) -> 0 Ok

BCM.0>

BCM.0> l3 defip show

l3 defip show

Unit 0, Total Number of DEFIP entries: 8192

# VRF Net addr Next Hop Mac INTF MODID PORT PRIO CLASS HIT VLAN

2048 0 192.168.5.0/24 00:00:00:03:02:01 2 0 13 0 0 n

BCM.0>


命令调用驱动接口

int bcm_l3_route_add( int unit, bcm_l3_route_t *info)


添加网段路由192.168.5.0/24 dmac 0x000000030201, egress intf 2, 出端口ge12.

8.5 删除路由

BCM.0> debug bcm api

BCM.0> l3 defip destroy vrf=0 ip=192.168.5.0 mask=255.255.255.0

API: bcm_l3_route_delete(0,...) -> 0 Ok

BCM.0> debug bcm api -

debug bcm api -

BCM.0> l3 defip show

l3 defip show

Unit 0, Total Number of DEFIP entries: 8192

# VRF Net addr Next Hop Mac INTF MODID PORT PRIO CLASS HIT VLAN

BCM.0>


命令调用驱动接口

int bcm_l3_route_delete( int unit, bcm_l3_route_t *info)


删除dip 192.168.5.0/24 的网段路由。

8.6 路由表项流程分析

8.6.1 添加intf 2,交换机mac 02:01

BCM.0> L3 intf add mac=00:00:00:00:02:01 vlan=2 intf=2

BCM.0> L3 intf show intf=2

Free L3INTF entries: 8190

Unit Intf VRF Group VLAN Source Mac MTU TTL Tunnel InnerVlan NATRealm

------------------------------------------------------------------

0 2 0 0 2 00:00:00:00:02:01 16383 0 0 0 0


查看my_station_tcam,成功添加。

BCM.0> d chg my_station_tcam

d chg my_station_tcam

MY_STATION_TCAM.ipipe0[511]: <VLAN_ID_MASK=0xfff,VLAN_ID=2,VALID=1,MASK=0x00000fffffffffffffff,MAC_ADDR_MASK=0xffffffffffff,MAC_ADDR=0x000000000201,KEY=0x00000002000000000201,IPV6_TERMINATION_ALLOWED=1,IPV4_TERMINATION_ALLOWED=1,DATA=0x38,ARP_RARP_TERMINATION_ALLOWED=1>

 

8.6.2 添加主机路由

BCM.0> L3 l3table add ip=192.168.2.1 intf=2 mac=00:00:00:00:02:02 port=ge8

BCM.0> L3 l3table show

l3 l3table show

Unit 0, free L3 table entries: 24575

Entry VRF IP address Mac Address INTF MOD PORT CLASS HIT

1 0 192.168.2.1 00:00:00:00:02:02 2 0 9 0 n


8.6.3 查看L3_ENTRY表,获取Next_hop_index.

BCM.0> d chg L3_ENTRY_1

L3_ENTRY_1.ism0[5972]: <WIDE_ENTRY_BITS=0x0000000000100006054010080003,VALID=1,NEXT_HOP_INDEX=2,KEY=0x01815004020000,IP_ADDR=0xc0a80201,IPV4UC:NEXT_HOP_INDEX=2,IPV4UC:KEY=0x01815004020000,IPV4UC:IP_ADDR=0xc0a80201,IPV4UC:HASH_LSB=0x201,IPV4UC:DATA=0x0000020000,HASH_LSB=0x201,EVEN_PARITY=1,DATA=0x0000020000,>


8.6.4 根据NH index索引INITIAL_ING_L3_NEXT_HOP,获取MODULE_ID和出端口

BCM.0> d chg INITIAL_ING_L3_NEXT_HOP 2 1

INITIAL_ING_L3_NEXT_HOP.ipipe0[2]: <TGID=9,PORT_NUM=9,>


8.6.5 根据NH index索引ING_L3_NEXT_HOP

BCM.0> d chg ING_L3_NEXT_HOP 2 1

ING_L3_NEXT_HOP.ipipe0[2]: <VLAN_ID=2,TGID=9,PORT_NUM=9,L3_OIF=2,DVP_RES_INFO=2,DVP_ATTRIBUTE_1_INDEX=2,>


8.6.6 根据NH index索引EGR_L3_NEXT_HOP

BCM.0> d chg EGR_L3_NEXT_HOP 2 1

EGR_L3_NEXT_HOP.epipe0[2]: <SD_TAG_VID=2,OVID=2,MAC_ADDRESS=0x000000000202,L3MC:INTF_NUM=2,L3MC:EH_TAG_TYPE=2,L3MC:EH_QUEUE_TAG=0x40,L3:OVID=2,L3:MAC_ADDRESS=0x000000000202,L3:IVID=0x202,L3:INTF_NUM=2,IVID=0x202,INTF_NUM=2,DVP=0x202,>

获取到下一跳的目的mac地址。


8.6.7 根据EGR_L3_NEXT_HOP 中的INTF_NUM索引到EGR_L3_INTF

BCM.0> d chg EGR_L3_INTF 2 1

EGR_L3_INTF.epipe0[2]: <VID=2,OVID=2,MAC_ADDRESS=0x000000000201,>

获取到交换机的mac地址,作为源mac,以及egress vid


8.6.8 添加网段路由

BCM.0> L3 defip add ip=192.168.3.0 mask=255.255.255.0 mac=00:00:02:00:00:03 intf=2 port=ge8

BCM.0> d chg L3_defip

L3_DEFIP.ipipe0[2048]: <VRF_ID_MASK0=0x7ff,VALID0=1,NEXT_HOP_INDEX0=2,MODE_MASK0=3,MASK0=0x1ffffffffc03,KEY0=0x000302a00c00,IP_ADDR_MASK0=0xffffff00,IP_ADDR0=0xc0a80300,EVEN_PARITY=1,ECMP_PTR0=2,>


通过命令添加网段路由的处理过程和添加主机路由的是相同的,不同的是路由表下发到硬件的defip中。

8.7 主机路由

默认情况下,所有端口都以untag方式加入vlan 1,将ge11vlan 1 中删除,以untag方式加入到vlan 2,并设置port ge11 port_vid 2,使从ge11打入不带tag的报文时,打上vlan tag 2.


BCM.0> vlan show 1

vlan show 1

vlan 1 ports cpu,ge,xe,hg (0x00000000000000000000000000000000000000000000000000ffffffffffffff), untagged ge,xe,hg (0x00000000000000000000000000000000000000000000000000fffffffffffffe) MCAST_FL OOD_UNKNOWN

BCM.0> vlan remove 1 pbm=ge11

vlan remove 1 pbm=ge11

BCM.0> vlan create 2 pbm=ge11 ubm=ge11

vlan create 2 pbm=ge11 ubm=ge11

BCM.0> vlan show 2

vlan show 2

vlan 2 ports ge11 (0x0000000000000000000000000000000000000000000000000000000000001000), untagge d ge11 (0x0000000000000000000000000000000000000000000000000000000000001000) MCAST_FLOOD_UNKNOWN

BCM.0> vlan show 1

vlan show 1

vlan 1 ports cpu,ge0-ge10,ge12-ge48,xe,hg (0x00000000000000000000000000000000000000000000000000 ffffffffffefff), untagged ge0-ge10,ge12-ge48,xe,hg (0x000000000000000000000000000000000000000000 00000000ffffffffffeffe) MCAST_FLOOD_UNKNOWN

BCM.0> age 60

age 60

Set age timer to 60.

BCM.0> L2 show

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0xc modid=0 port=12/ge11 Hit

mac=3c:8c:40:0f:8d:1f vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit

BCM.0> L2 clear port=ge11

L2: Deleting static and non-static addresses by port, local module ID

BCM.0> L2 show


mac=3c:8c:40:0f:8d:1f vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit

BCM.0> d chg port 12 1

PORT.ipipe0[12]: <VT_PORT_TYPE_SELECT_2=1,VT_PORT_TYPE_SELECT=1,VT_KEY_TYPE_2=5,VT_KEY_TYPE=4,VL AN_PROTOCOL_DATA_INDEX=0xc,VFP_ENABLE=1,V6L3_ENABLE=1,V6IPMC_ENABLE=1,V4L3_ENABLE=1,V4IPMC_ENABL E=1,TRUST_INCOMING_VID=1,TRUST_DSCP_PTR=0xc,SUBNET_BASED_VID_ENABLE=1,PRI_MAPPING=0xfac688,PORT_ VID=1,OVID=1,OUTER_TPID_ENABLE=1,OAM_ENABLE=1,MIM_TERM_ENABLE=1,MIM_MC_TERM_ENABLE=1,MAC_BASED_V ID_ENABLE=1,IPRI_MAPPING=0xfac688,IPMC_DO_VLAN=1,ICFI_1_MAPPING=1,FP_PORT_FIELD_SEL_INDEX=0xc,FI LTER_ENABLE=1,CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,CFI_1_MAPPING=1,>

BCM.0> mod port 12 1 PORT_VID=2


BCM.0> L2 show

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0xc modid=0 port=12/ge11

mac=d4:be:d9:e3:95:8d vlan=2 GPORT=0xc modid=0 port=12/ge11 Hit

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit

BCM.0> L2 clear port=ge11

L2: Deleting static and non-static addresses by port, local module ID

BCM.0> L2 show

mac=d4:be:d9:e3:95:8d vlan=2 GPORT=0xc modid=0 port=12/ge11 Hit

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit

mac=00:00:00:00:00:33 vlan=2 GPORT=0xc modid=0 port=12/ge11 Hit


分别添加L3 intf 12 配置交换机mac00:00:00:03:02:01.

BCM.0> L3 init

BCM.0> L3 intf add vlan=2 mac=00:00:00:03:02:01 intf=2 vrf=0 mtu=1500

BCM.0> L3 intf add vlan=1 mac=00:00:00:03:02:01 intf=1 vrf=0 mtu=1500

BCM.0> L3 intf show

Free L3INTF entries: 8189

Unit Intf VRF Group VLAN Source Mac MTU TTL Tunnel InnerVlan NATRealm

------------------------------------------------------------------

0 1 0 0 1 00:00:00:03:02:01 1500 0 0 0 0

0 2 0 0 2 00:00:00:03:02:01 1500 0 0 0 0


添加主机路由1.1.1.1 2.1.1.1 分别和intf 1, 2 对应,出端口分别为ge15,ge11.

ge11口打入构造的目的mac为交换机mac 000000030201,源macd4:be:d9:e3:95:8d,

目的ip 1.1.1.1,源ip2.1.1.1ipv4报文,查看端口报文统计,可以看到ge15端口有报文计数,查看L3tableHit位都置位了。

BCM.0> L2 show


mac=00:00:00:03:02:01 vlan=1 GPORT=0x0 modid=0 port=0/cpu0 Static CPU

mac=00:00:00:03:02:01 vlan=2 GPORT=0x0 modid=0 port=0/cpu0 Static CPU

mac=d4:be:d9:e3:95:8d vlan=2 GPORT=0xc modid=0 port=12/ge11 Hit

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit


BCM.0> L3 l3table add vrf=0 ip=2.1.1.1 mac=d4:be:d9:e3:95:8d intf=2 port=ge11

BCM.0> L3 l3table add vrf=0 ip=1.1.1.1 mac=3c:8c:40:0f:8d:40 intf=1 port=ge15

BCM.0> L3 l3table show

Unit 0, free L3 table entries: 24574

Entry VRF IP address Mac Address INTF MOD PORT CLASS HIT

1 0 1.1.1.1 3c:8c:40:0f:8d:40 1 0 16 0 n

2 0 2.1.1.1 d4:be:d9:e3:95:8d 2 0 12 0 n

BCM.0> d chg my_station_tcam

d chg my_station_tcam

MY_STATION_TCAM.ipipe0[510]: <VLAN_ID_MASK=0xfff,VLAN_ID=1,VALID=1,MASK=0x00000fffffffffffffff,M AC_ADDR_MASK=0xffffffffffff,MAC_ADDR=0x000000030201,KEY=0x00000001000000030201,IPV6_TERMINATION_ ALLOWED=1,IPV4_TERMINATION_ALLOWED=1,DATA=0x38,ARP_RARP_TERMINATION_ALLOWED=1>

MY_STATION_TCAM.ipipe0[511]: <VLAN_ID_MASK=0xfff,VLAN_ID=2,VALID=1,MASK=0x00000fffffffffffffff,M AC_ADDR_MASK=0xffffffffffff,MAC_ADDR=0x000000030201,KEY=0x00000002000000030201,IPV6_TERMINATION_ ALLOWED=1,IPV4_TERMINATION_ALLOWED=1,DATA=0x38,ARP_RARP_TERMINATION_ALLOWED=1>

BCM.0> clear c


BCM.0> show c

RIPC4.ge11 : 3 +3

RUC.ge11 : 3 +3

RDBGC0.ge11 : 4 +4

R64.ge11 : 7 +7

RPKT.ge11 : 7 +7

RUCA.ge11 : 3 +3

RBCA.ge11 : 4 +4

RPRM.ge11 : 3 +3

RPOK.ge11 : 7 +7

RBYT.ge11 : 448 +448

TDBGC4.ge15 : 3 +3

T64.ge15 : 3 +3

TPOK.ge15 : 3 +3

TPKT.ge15 : 3 +3

TUCA.ge15 : 3 +3

TBYT.ge15 : 192 +192

UC_PERQ_PKT(0).ge15 : 3 +3

UC_PERQ_BYTE(0).ge15 : 192 +192


BCM.0> L2 show

mac=00:00:00:03:02:01 vlan=1 GPORT=0x0 modid=0 port=0/cpu0 Static CPU

mac=00:00:00:03:02:01 vlan=2 GPORT=0x0 modid=0 port=0/cpu0 Static Hit CPU

mac=d4:be:d9:e3:95:8d vlan=2 GPORT=0xc modid=0 port=12/ge11 Hit

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit


BCM.0> L3 l3table show

Unit 0, free L3 table entries: 24574

Entry VRF IP address Mac Address INTF MOD PORT CLASS HIT

1 0 1.1.1.1 3c:8c:40:0f:8d:40 1 0 16 0 y

2 0 2.1.1.1 d4:be:d9:e3:95:8d 2 0 12 0 y


8.8 网段路由

ge11以不带vlan tag的方式加入到vlan 2 中,并设置ge11port_vid2

BCM.0> vlan remove 1 pbm=ge11

vlan remove 1 pbm=ge11

BCM.0> vlan create 2 pbm=ge11 ubm=ge11

vlan create 2 pbm=ge11 ubm=ge11

BCM.0> vlan show

vlan show

vlan 1 ports cpu,ge0-ge10,ge12-ge48,xe,hg (0x00000000000000000000000000000000000000000000000000ffffffffffefff), untagged ge0-ge10,ge12-ge48,xe,hg (0x00000000000000000000000000000000000000000000000000ffffffffffeffe) MCAST_FLOOD_UNKNOWN

vlan 2 ports ge11 (0x0000000000000000000000000000000000000000000000000000000000001000), untagged ge11 (0x0000000000000000000000000000000000000000000000000000000000001000) MCAST_FLOOD_UNKNOWN

^[[A BCM.0> l2 show

mac=d4:be:d9:e3:95:8d vlan=1 GPORT=0xc modid=0 port=12/ge11 Hit

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit

BCM.0> L2 clear port=ge11

L2: Deleting static and non-static addresses by port, local module ID

BCM.0> l2 show

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit

BCM.0> d chg port 12 1

PORT.ipipe0[12]: <VT_PORT_TYPE_SELECT_2=1,VT_PORT_TYPE_SELECT=1,VT_KEY_TYPE_2=5,VT_KEY_TYPE=4,VLAN_PROTOCOL_DATA_INDEX=0xc,VFP_ENABLE=1,V6L3_ENABLE=1,V6IPMC_ENABLE=1,V4L3_ENABLE=1,V4IPMC_ENABLE=1,TRUST_INCOMING_VID=1,TRUST_DSCP_PTR=0xc,SUBNET_BASED_VID_ENABLE=1,PRI_MAPPING=0xfac688,PORT_VID=1,OVID=1,OUTER_TPID_ENABLE=1,OAM_ENABLE=1,MIM_TERM_ENABLE=1,MIM_MC_TERM_ENABLE=1,MAC_BASED_VID_ENABLE=1,IPRI_MAPPING=0xfac688,IPMC_DO_VLAN=1,ICFI_1_MAPPING=1,FP_PORT_FIELD_SEL_INDEX=0xc,FILTER_ENABLE=1,CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,CFI_1_MAPPING=1,>

BCM.0> mod port 12 1 port_vid=2

mod port 12 1 port_vid=2

BCM.0> l2 clear port=ge11

l2 clear port=ge11

L2: Deleting static and non-static addresses by port, local module ID

BCM.0> l2 show

l2 show

mac=d4:be:d9:e3:95:8d vlan=2 GPORT=0xc modid=0 port=12/ge11 Hit

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit


创建L3 intf 12,配置交换机mac00:00:00:03:02:01,分别对应vlan 1,2

BCM.0> L3 init

BCM.0> L3 intf add vlan=2 mac=00:00:00:03:02:01 intf=2 vrf=0 mtu=1500

L3 intf add vlan=2 mac=00:00:00:03:02:01 intf=2 vrf=0 mtu=1500

BCM.0> L3 intf add vlan=1 mac=00:00:00:03:02:01 intf=1 vrf=0 mtu=1500

L3 intf add vlan=1 mac=00:00:00:03:02:01 intf=1 vrf=0 mtu=1500

BCM.0> L3 intf show

Free L3INTF entries: 8189

Unit Intf VRF Group VLAN Source Mac MTU TTL Tunnel InnerVlan NATRealm

------------------------------------------------------------------

0 1 0 0 1 00:00:00:03:02:01 1500 0 0 0 0

0 2 0 0 2 00:00:00:03:02:01 1500 0 0 0 0


创建主机路由2.1.1.1,对应intf 2, port ge11

创建网段路由1.1.1.0/24 ,对应inf 1 , port ge15

构造目的mac00:00:00:03:02:01,源macd4:be:d9:e3:95:8d 的不带vlan tagipv4报文,

ip2.1.1.1,目的ip1.1.1.1,从ge11口打入,查看报文统计计数,ge15口有计数,查看L3 defipHit位已置位。

BCM.0> l2 show

l2 show

mac=d4:be:d9:e3:95:8d vlan=2 GPORT=0xc modid=0 port=12/ge11 Hit

mac=3c:8c:40:0f:8d:40 vlan=1 GPORT=0x10 modid=0 port=16/ge15 Hit


BCM.0> L3 l3table add vrf=0 ip=2.1.1.1 mac=d4:be:d9:e3:95:8d intf=2 port=ge11

L3 l3table add vrf=0 ip=2.1.1.1 mac=d4:be:d9:e3:95:8d intf=2 port=ge11

BCM.0> L3 defip add vrf=0 ip=1.1.1.0 mask=255.255.255.0 mac=3c:8c:40:0f:8d:40 intf=1 port=ge15


BCM.0> L3 L3table show

Unit 0, free L3 table entries: 24575

Entry VRF IP address Mac Address INTF MOD PORT CLASS HIT

1 0 2.1.1.1 d4:be:d9:e3:95:8d 2 0 12 0 n

BCM.0> L3 defip show

Unit 0, Total Number of DEFIP entries: 8192

# VRF Net addr Next Hop Mac INTF MODID PORT PRIO CLASS HIT VLAN

2048 0 1.1.1.0/24 3c:8c:40:0f:8d:40 1 0 16 0 0 n

BCM.0> clear c

clear c

BCM.0> show c

show c

RIPC4.ge11 : 5 +5

RUC.ge11 : 5 +5

R64.ge11 : 5 +5

RPKT.ge11 : 5 +5

RUCA.ge11 : 5 +5

RPRM.ge11 : 5 +5

RPOK.ge11 : 5 +5

RBYT.ge11 : 320 +320

TDBGC4.ge15 : 5 +5

T64.ge15 : 5 +5

TPOK.ge15 : 5 +5

TPKT.ge15 : 5 +5

TUCA.ge15 : 5 +5

TBYT.ge15 : 320 +320

UC_PERQ_PKT(0).ge15 : 5 +5

UC_PERQ_BYTE(0).ge15 : 320 +320

BCM.0> L3 defip show

Unit 0, Total Number of DEFIP entries: 8192

# VRF Net addr Next Hop Mac INTF MODID PORT PRIO CLASS HIT VLAN

2048 0 1.1.1.0/24 3c:8c:40:0f:8d:40 1 0 16 0 0 y

BCM.0> L3 L3table show

Unit 0, free L3 table entries: 24575

Entry VRF IP address Mac Address INTF MOD PORT CLASS HIT

1 0 2.1.1.1 d4:be:d9:e3:95:8d 2 0 12 0 y

BCM.0>


BCM.0> vlan create 2

BCM.0> vlan add 2 pbm=ge10 ubm=ge10

BCM.0> mod port 11 1 port_vid=2


BCM.0> l3 intf add int=2 vlan=2 mac=00:00:00:00:00:f2

BCM.0> l3 egress add intf=2 mac=d4:be:d9:e3:95:8d port=ge10

BCM.0> l3 defip add ip=2.2.2.0 mask=255.255.255.0 intf=$egr_object_id


  1. QoS

优先级映射实现从QoS优先级到内部优先级或从内部优先级到QoS优先级的映射,并利用DiffServ域来管理和记录QoS优先级和服务等级之间的映射关系。

对于进入设备的报文,将报文携带的优先级或者端口优先级映射为内部优先级,然后根据内部优先级与队列之间的映射关系确定报文进入的队列,从而针对队列进行流量整形、拥塞避免、队列调度等处理,并可以根据配置修改报文发送出去时所携带的优先级,以便其他设备根据报文的优先级提供相应的QoS服务。

对报文进行优先级标记,可以打在二层报文上,也可以在三层(ip)报文头上。

1. 二层802.1P 优先级映射

如下,查看port ge8COS配置,PRIO 0 映射到COS QUEUE 0, PRIO 3 映射到COS QUEUE 1 , PRIO 5映射到COS QUEUE 2.

BCM.0> cos port show pbm=ge8


Port ge8 COS configuration:

------------------------------

Config (max queues): 4

Schedule mode: weighted round-robin

Weighting (in packets):

COSQ 0 = 1 packets

COSQ 1 = 1 packets

COSQ 2 = 1 packets

COSQ 3 = 1 packets

Priority to queue mappings:

PRIO 0 ==> COSQ 0

PRIO 1 ==> COSQ 0

PRIO 2 ==> COSQ 1

PRIO 3 ==> COSQ 1

PRIO 4 ==> COSQ 2

PRIO 5 ==> COSQ 2

PRIO 6 ==> COSQ 3

PRIO 7 ==> COSQ 3

PRIO 8 ==> COSQ 3

PRIO 9 ==> COSQ 3

PRIO 10 ==> COSQ 3

PRIO 11 ==> COSQ 3

PRIO 12 ==> COSQ 3

PRIO 13 ==> COSQ 3

PRIO 14 ==> COSQ 3

PRIO 15 ==> COSQ 3

 

配置队列调度模式为为Deficit Round Robin,四个队列权重分别为1,3,5,7.

BCM.0> cos drr W0=1 W1=3 W2=5 W3=7

BCM.0> cos show

COS configuration:

Config (max queues): 4

Schedule mode: deficit round-robin

Weighting (in Kbytes):

COSQ 0 = 1 Kbytes

COSQ 1 = 3 Kbytes

COSQ 2 = 5 Kbytes

COSQ 3 = 7 Kbytes

Priority to queue mappings:

PRIO 0 ==> COSQ 0

PRIO 1 ==> COSQ 0

PRIO 2 ==> COSQ 1

PRIO 3 ==> COSQ 1

PRIO 4 ==> COSQ 2

PRIO 5 ==> COSQ 2

PRIO 6 ==> COSQ 3

PRIO 7 ==> COSQ 3

PRIO 8 ==> COSQ 3

PRIO 9 ==> COSQ 3

PRIO 10 ==> COSQ 3

PRIO 11 ==> COSQ 3

PRIO 12 ==> COSQ 3

PRIO 13 ==> COSQ 3

PRIO 14 ==> COSQ 3

PRIO 15 ==> COSQ 3


配置从ge8 端口入的报文的Prio 0 CFI 0 映射到内部IntPrio 3,设置Queue 1 的带宽范围,ge8以带vlan tag方式加入到vlan 1,打入不带vlan tag上送CPUARP报文,rxAPI打印出来的报文IntPrio3COS QUEUE 1.


BCM.0> memwatch ING_PRI_CNG_MAP write

BCM.0> color map port=2 pktPrio=0 cfi=0 intprio=1 color=green

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 16, Entry - <PRI=1,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 17, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 18, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 19, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 20, Entry - <PRI=0,EVEN_PARITY=0,CNG=1>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 21, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 22, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 23, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 24, Entry - <PRI=1,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 25, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 26, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 27, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 28, Entry - <PRI=1,EVEN_PARITY=0,CNG=1>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 29, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 30, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 31, Entry - <PRI=0,EVEN_PARITY=0,CNG=0>


其中,ING_PRI_CNG_MAPindex值由Port 中的TRUST_DOT1P_PTR *16 索引。

BCM.0> d chg port 2 1

PORT.ipipe0[2]: <VT_PORT_TYPE_SELECT_2=1,VT_PORT_TYPE_SELECT=1,VT_KEY_TYPE_2=5,VT_KEY_TYPE=4,VLAN_PROTOCOL_DATA_INDEX=2,VFP_ENABLE=1,V6L3_ENABLE=1,V6IPMC_ENABLE=1,V4L3_ENABLE=1,V4IPMC_ENABLE=1,TRUST_INCOMING_VID=1,TRUST_DSCP_PTR=2,TRUST_DOT1P_PTR=1,SUBNET_BASED_VID_ENABLE=1,PROTOCOL_PKT_INDEX=2,PRI_MAPPING=0xfac688,PORT_VID=1,OVID=1,OUTER_TPID_ENABLE=1,OAM_ENABLE=1,MIM_TERM_ENABLE=1,MIM_MC_TERM_ENABLE=1,MAC_BASED_VID_ENABLE=1,IPRI_MAPPING=0xfac688,IPMC_DO_VLAN=1,ICFI_1_MAPPING=1,FP_PORT_FIELD_SEL_INDEX=2,FILTER_ENABLE=1,CML_FLAGS_NEW=8,CML_FLAGS_MOVE=8,CFI_1_MAPPING=1,>


BCM.0> memwatch ING_PRI_CNG_MAP read

BCM.0> color map port=ge8 PktPrio=-1

Color map settings for port ge8

Packet Prio=0, CFI=0, Internal Prio=3, Color=Green

Packet Prio=0, CFI=1, Internal Prio=0, Color=Red

Packet Prio=1, CFI=0, Internal Prio=1, Color=Green

Packet Prio=1, CFI=1, Internal Prio=1, Color=Red

Packet Prio=2, CFI=0, Internal Prio=2, Color=Green

Packet Prio=2, CFI=1, Internal Prio=2, Color=Red

Packet Prio=3, CFI=0, Internal Prio=5, Color=Green

Packet Prio=3, CFI=1, Internal Prio=3, Color=Red

Packet Prio=4, CFI=0, Internal Prio=4, Color=Green

Packet Prio=4, CFI=1, Internal Prio=4, Color=Red

Packet Prio=5, CFI=0, Internal Prio=5, Color=Green

Packet Prio=5, CFI=1, Internal Prio=5, Color=Red

Packet Prio=6, CFI=0, Internal Prio=6, Color=Green

Packet Prio=6, CFI=1, Internal Prio=6, Color=Red

Packet Prio=7, CFI=0, Internal Prio=7, Color=Green

Packet Prio=7, CFI=1, Internal Prio=7, Color=Red


BCM.0> d ING_PRI_CNG_MAP 16 1

Unit = 0, mem = ING_PRI_CNG_MAP (3202), copyno = 4 index = 16, Entry - <PRI=1,EVEN_PARITY=0,CNG=0>


ING_PRI_CNG_MAP.ipipe0[16]: <PRI=1,EVEN_PARITY=0,CNG=0>

BCM.0>

BCM.0> memwatch ING_PRI_CNG_MAP off

BCM.0>


BCM.0> vlan add 1 pbm=ge8

BCM.0> vlan show

vlan 1 ports ge,xe,hg (0x00000000000000000000000000000000000000000000000000fffffffffffffe), untagged ge0-ge7,ge9-ge 48,xe,hg (0x00000000000000000000000000000000000000000000000000fffffffffffdfe) MCAST_FLOOD_UNKNOWN

BCM.0>


BCM.0> cos bandwidth pbm=ge8 Queue=1 KbpsMIn=20 KbpsMAx=1000

BCM.0> cos bandwidth_show

cos bandwidth_show

COSQ bandwith configuration:

-----+---+----------+----------+-------

ge8 | 0 | 0 | 0 | 0

ge8 | 1 | 24 | 1000 | 0

ge8 | 2 | 0 | 0 | 0

ge8 | 3 | 0 | 0 | 0

-----+---+----------+----------+-------


BCM.0> pw start

BCM.0> pw report +raw


[bcmPW.0]

[bcmPW.0]Packet[11]: data[0000]: {ffffffffffff} {d4bed9e3958d} 0806 0001

[bcmPW.0]Packet[11]: data[0010]: 0800 0604 0001 d4be d9e3 958d c0a8 154d

[bcmPW.0]Packet[11]: data[0020]: 0000 0000 0000 c0a8 154d 0000 0000 0000

[bcmPW.0]Packet[11]: data[0030]: 0000 0000 0000 0000 0000 0000 8d22 f91b

[bcmPW.0]Packet[11]: data[0040]: 0000 0000

[bcmPW.0]Packet[11]: length 68 (68). rx-port 9. cos 1. prio_int 3. vlan 1. reason 0x2000. Untagged.

[bcmPW.0]Packet[11]: dest-port 1. dest-mod 0. src-port 9. src-mod 0. opcode 2. matched 0. classification-tag 0.

[bcmPW.0]Packet[11]: reasons: Protocol


BCM.0> pw quiet

 

配置报文优先级0映射为Int Prio 5,对应的队列为2

BCM.0> color unmap Port=ge8 IntPrio=3 Color=green PktPrio=0 CFI=0

BCM.0> color map port=ge8 IntPrio=5 Color=green PktPrio=0 CFI=0

color map port=ge8 IntPrio=5 Color=green PktPrio=0 CFI=0

BCM.0> pw report +raw

[bcmPW.0]Packet[12]: data[0000]: {ffffffffffff} {d4bed9e3958d} 0806 0001

[bcmPW.0]Packet[12]: data[0010]: 0800 0604 0001 d4be d9e3 958d c0a8 154d

[bcmPW.0]Packet[12]: data[0020]: 0000 0000 0000 c0a8 15d3 0000 0000 0000

[bcmPW.0]Packet[12]: data[0030]: 0000 0000 0000 0000 0000 0000 41d7 d706

[bcmPW.0]Packet[12]: data[0040]: 0000 0000

[bcmPW.0]Packet[12]: length 68 (68). rx-port 9. cos 2. prio_int 5. vlan 1. reason 0x2000. Untagged.

[bcmPW.0]Packet[12]: dest-port 1. dest-mod 0. src-port 9. src-mod 0. opcode 2. matched 0. classification-tag 0.

[bcmPW.0]Packet[12]: reasons: Protocol


通过FP 规则,匹配报文,修改IntPrio

BCM.0> fp init

BCM.0> fp qset add IpProtocol

BCM_FIELD_QSET_ADD(IpProtocol) okay

BCM.0> fp group create 0 0

BCM.0> fp entry create 0 1

BCM.0> fp qual 1 IpProtocol 0x1 0xf

BCM.0> fp action add 1 PrioIntNew 4

BCM.0> fp entry install 1

BCM.0> pw report +raw

BCM.0> [bcmPW.0]

[bcmPW.0]Packet[252]: data[0000]: {0019ad197521} {000000000002} 0800 4500

[bcmPW.0]Packet[252]: data[0010]: 0014 0001 0000 4001 ce77 c0a8 154d c0a8

[bcmPW.0]Packet[252]: data[0020]: 15d3 0000 0000 0000 0000 0000 0000 0000

[bcmPW.0]Packet[252]: data[0030]: 0000 0000 0000 0000 676f a7d2 4574 6865

[bcmPW.0]Packet[252]: length 64 (64). rx-port 1. cos 2. prio_int 4. vlan 1. reason 0x80000000. Outer tagged.

[bcmPW.0]Packet[252]: dest-port 0. dest-mod 0. src-port 1. src-mod 0. opcode 1. matched 0. classification-tag 0.

[bcmPW.0]Packet[252]: reasons: Nhop


  1. 三层DSCP 报文优先级映射

配置源DSCP0的三层报文映射为5IntPrio 3

BCM.0> dscp ge8 mode=2 0 5 3 0

BCM.0> dscp ge8

0:ge8 dscp map:

0->5 prio=3 cng=0

1->0 prio=0 cng=0

2->0 prio=0 cng=0

3->0 prio=0 cng=0

4->0 prio=0 cng=0

5->0 prio=0 cng=0

6->0 prio=0 cng=0

7->0 prio=0 cng=0

8->0 prio=0 cng=0

9->0 prio=0 cng=0

10->0 prio=0 cng=0

11->0 prio=0 cng=0

12->0 prio=0 cng=0

13->0 prio=0 cng=0

14->0 prio=0 cng=0

15->0 prio=0 cng=0

16->0 prio=0 cng=0

17->0 prio=0 cng=0

18->0 prio=0 cng=0

19->0 prio=0 cng=0

20->0 prio=0 cng=0

21->0 prio=0 cng=0

22->0 prio=0 cng=0

23->0 prio=0 cng=0

24->0 prio=0 cng=0

25->0 prio=0 cng=0

26->0 prio=0 cng=0

27->0 prio=0 cng=0

28->0 prio=0 cng=0

29->0 prio=0 cng=0

30->0 prio=0 cng=0

31->0 prio=0 cng=0

32->0 prio=0 cng=0

33->0 prio=0 cng=0

34->0 prio=0 cng=0

35->0 prio=0 cng=0

36->0 prio=0 cng=0

37->0 prio=0 cng=0

38->0 prio=0 cng=0

39->0 prio=0 cng=0

40->0 prio=0 cng=0

41->0 prio=0 cng=0

42->0 prio=0 cng=0

43->0 prio=0 cng=0

44->0 prio=0 cng=0

45->0 prio=0 cng=0

46->0 prio=0 cng=0

47->0 prio=0 cng=0

48->0 prio=0 cng=0

49->0 prio=0 cng=0

50->0 prio=0 cng=0

51->0 prio=0 cng=0

52->0 prio=0 cng=0

53->0 prio=0 cng=0

54->0 prio=0 cng=0

55->0 prio=0 cng=0

56->0 prio=0 cng=0

57->0 prio=0 cng=0

58->0 prio=0 cng=0

59->0 prio=0 cng=0

60->0 prio=0 cng=0

61->0 prio=0 cng=0

62->0 prio=0 cng=0

63->0 prio=0 cng=0


BCM.0> pw report +raw

BCM.0> [bcmPW.0]

[bcmPW.0]Packet[25]: data[0000]: {0019ad197521} {000000000033} 0800 4500

[bcmPW.0]Packet[25]: data[0010]: 0014 0001 0000 4001 ce77 c0a8 154d c0a8

[bcmPW.0]Packet[25]: data[0020]: 15d3 0000 0000 0000 0000 0000 0000 0000

[bcmPW.0]Packet[25]: data[0030]: 0000 0000 0000 0000 0000 0000 76a3 5424

[bcmPW.0]Packet[25]: data[0040]: 6173 6520

[bcmPW.0]Packet[25]: length 68 (68). rx-port 9. cos 1. prio_int 3. vlan 1. reason 0x80000000. Untagged.

[bcmPW.0]Packet[25]: dest-port 0. dest-mod 0. src-port 9. src-mod 0. opcode 1. matched 0. classification-tag 0.

[bcmPW.0]Packet[25]: reasons: Nhop

[bcmPW.0]

10. 问题及解决方法

以大于200p/s发送二层广播报文时出现发送流控问题,此时cpu口在vlan 1内,将cpu口从vlan中移除,不会发送流控,对于需要上送cpu的报文可以通过添加L2 Entry表项或设置寄存器或ACL规则上送,此外需要配置cpu上送报文限速。  

BCM.0> vlan show 1

vlan show 1

vlan 1 ports cpu,ge,xe,hg (0x00000000000000000000000000000000000000000000000000ffffffffffffff), untagged ge,xe,hg (0x00000000000000000000000000000000000000000000000000fffffffffffffe) MCAST_FLOOD_UNKNOWN

BCM.0> vlan remove 1 pbm=cpu0

vlan remove 1 pbm=cpu0

BCM.0> vlan show 1

vlan show 1

vlan 1 ports ge,xe,hg (0x00000000000000000000000000000000000000000000000000fffffffffffffe), untagged ge,xe,hg (0x00000000000000000000000000000000000000000000000000fffffffffffffe) MCAST_FLOOD_UNKNOWN

BCM.0>

BCM.0> rate pbm=cpu0 bc=true limit=400


  1. 通过添加L2 Entry,目的maccpu macICMP报文实现上送

BCM.0>L2 add mac=02:10:18:db:88:47 vlan=1 pbm=cpu0 Static=true ReplacePriority=false Replace=false L3=true

2. 寄存器配置ARP报文上送

BCM.0> sc ArpReplyToCpu=1

BCM.0> sc ArpRequestToCpu=1

3. 通过FP规则配置EtherType 0x0806ARP报文上送cpu

配置如下:

BCM.0> fp init

BCM.0> fp qset add EtherType

BCM_FIELD_QSET_ADD(EtherType) okay

BCM.0> fp group create 0 0

BCM.0> fp entry create 0 1

BCM.0> fp qual 1 EtherType 0x0806 0xfff

BCM.0> fp action add 1 CopyToCPU 0 0

BCM.0> fp entry install 1

BCM.0> fp show

fp show

FP: unit 0:PIPELINE STAGE INGRESS

FP: :tcam_sz=4096(0x1000), tcam_slices=16, tcam_ext_numb=-1,

PIPELINE STAGE EGRESS

FP: :tcam_sz=1024(0x400), tcam_slices=4, tcam_ext_numb=-1,

PIPELINE STAGE LOOKUP

FP: :tcam_sz=2048(0x800), tcam_slices=4, tcam_ext_numb=-1,

GID 0: gid=0x0, instance=0 mode=Single, stage=Ingress lookup=Enabled, ActionResId={-1}, pbmp={0x00000000000000000000000000000000000000000000000000ffffffffffffff}

qset={EtherType, Stage},

selcodes[0]=

{

FPF1=4

Intraslice=Primary slice.

{

Stage->EtherType},


slice_pri= 0 {slice_number=0, Entry count=256(0x100),pbmp={0x00000000000000000000000000000000000000000000000000ffffffffffffff}},

group_status={prio_min=0, prio_max=2147483647, entries_total=4096, entries_free=4095,

counters_total=4096, counters_free=4096, meters_total=4096, meters_free=4096}

EID 0x00000001: gid=0x0,

slice=0, slice_idx=0, part =0 prio=0, flags=0x10602, Installed, Enabled

tcam: color_indep=1,

Stage

EtherType

Offset0: 201 Width0: 16

DATA=0x00000806

MASK=0x00000fff

action={act=CopyToCpu, param0=0(0), param1=0(0), param2=0(0), param3=0(0)}

policer=

statistics=NULL

BCM.0>

BCM.0> pw start report +dec

BCM.0> pw report +raw

BCM.0> pw quiet


  1. SDK初始化处理流程

_bcm_modules_init <--_bcm_esw_init <--bcm_esw_init <--bcm_init <-- sh_init <--

cmdlist_init <-- diag_init <-- sh_rcload_file <--diag_shell

函数sh_init 中,对从rc.soc中读取到的,或通过命令下发的init soc, init bcm , init mmu, init all 进行处理,下发init bcm时,调用bcm_init 函数。

_bcm_modules_init中,完成各个模块的初始化。

首先,初始化tx, rx ,然后注册驱动功能处理函数指针,实现根据芯片类型dispatch到对应的处理。

如下为_bcm_modules_init 中处理流程:














































































而由bcm_init 调用到bcm_esw_init 是通过dispatch 实现的。

Src/bcm/Control.c 中的bcm_init 调用函数指针_dispatch_init[BCM_DTYPE(unit)](unit); 分发到具体的芯片处理初始化函数。


src/bcm/Control.c中,定义宏BCM_DLIST_ENTRY 参数为_dtype 时,声明的外部函数为

Int bcm_##_dtype##_init(int);


#define BCM_DLIST_ENTRY(_dtype)\

extern int bcm_##_dtype##_init(int);

#include <bcm_int/bcm_dlist.h>


#define BCM_DLIST_ENTRY(_dtype)\

bcm_##_dtype##_init,


static int (*_dispatch_init[])(int) = {

#include <bcm_int/bcm_dlist.h>

};


bcm_dlist.h 中,定义

#ifdef BCM_ESW_SUPPORT

BCM_DLIST_ENTRY(esw)

#endif


这样,支持esw类型的芯片(Helix4)调用_dispatch_init 时,就分发到bcm_esw_init 函数处理。

和芯片初始化相关的函数定义在Src/bcm/Control.c中,和功能相关的函数定义在src/bcm/Dispatch.c中。

上面为一次分发调用过程,此外还有多次分发调用过程。

例如src/bcm/Dispatch.c 中的bcm_l3_init,首先分发到src/bcm/esw/L3.c 中的bcm_esw_l3_init,在其中再调用

mbcm_driver[unit]->mbcm_l3_tables_init(unit),

mbcm_l3_tables_init 是一个函数指针,在src/bcm/esw/Mbcm.c mbcm_init 中,通过

mbcm_driver[unit] = &mbcm_firebolt_driver;

将函数指针数组mbcm_firebolt_driver 赋值给mbcm_driver,这样,调用mbcm_l3_tables_init就会调用到函数指针数组中对应的bcm_xgs3_l3_tables_init





交换芯片Helix4 L2 L3功能验证

上一篇:Echarts x轴文本内容太长的几种解决方案


下一篇:数据库选项--页面检查