发布时间 : 星期四 文章mpls - VPN标签2003更新完毕开始阅读
/*action的类型枚举,用来区别所有类型*/
typedef enum mpls_action_s{ MPLS_PUSH = 0x1, //单层标签push动作 MPLS_SWAP, // 标签报文交换动作 MPLS_PHP, // 标签报文的倒数第二跳弹出动作
MPLS_POP, // 单层标签的弹出动作 MPLS_L3_VPN_POP, // L3_VPN的弹出标签动作 MPLS_L3_VPN_PUSH, // L3_VPN的压入标签动作 MPLS_L2_VPWS_POP, // VPWS的弹出标签动作 MPLS_L2_VPWS_PUSH, // VPWS的压入标签动作 MPLS_L2_VPLS_POP, // VPLS的弹出标签动作 MPLS_L2_VPLS_PUSH, // VPLS的压入标签动作
}mpls_action_e;
1下刷arp的结构体:表中所有内容都为平台下刷
/*mpls arp 信息结构体,表中所有内容都为平台下刷*/ typedef struct drv_arp_mpls_info_s {
eth_mac_addr_t mac_addr; /*目地mac. */ u32 out_port; /*出端口*/
u32 vlan_id; /* 出端口 vlan. */ u32 egr_intf_idx; /*egr_l3_intf index. */
u32 vc_index; /*vc 表的索引值*/
u32 valid; /* arp表是否已学习到. 0:没学到 1:arp学习到*/
u32 action; /*用action代替表项类型*/ u32 update; /*update 标志 1:代表更新arp表 ,此时arp_index 有效*/ } drv_arp_mpls_info_t;
2. 公网标签信息结构体
/*tunnel_label_info 结构体,除tunnel_index外,其他全部为平台下刷*/ typedef struct tunnel_label_info_s {
u32 vlan_id; // 出口vlan id u32 mpls_label; // 公网标签值
u32 entry_type; // 表项的类型 u32 mpls_ttl; u32 mpls_exp; u32 new_cfi; u32 new_pri;
u32 tunnel_index; // tunnel的索引, 驱动填写
}tunnel_label_info_t;
/*私网标签信息结构体*/
/*vc tabel info 结构体,所有内容都为平台下刷*/ typedef struct vc_label_info_s {
u32 mpls_label; //标签值 u32 mpls_ttl; // ttl值 u32 mpls_exp; u32 new_cfi; u32 new_pri;
u32 update; // 是否更新swap label
u32 action; //转发类型,见枚举mpls_action_e;
}vc_label_info_t;
/*标签信息结构体,intf_index和vc_index为驱动返回值*/ typedef struct drv_mpls_info_s {
u32 intf_index; // 出接口表的索引值,驱动返回 u32 vc_index; // vc 表的索引值 驱动返回 u32 tunnel_counter; // 隧道标签的个数 u32 egr_vlan_id; //出口vlan_id
u32 action; //转发类型,见枚举mpls_action_e;vc_label_info_t vc_info; // 私网标签结构体
// 单层做swap动作信息结构体
tunnel_label_info_t tunnel_info[2]; // 公网信息结构体
}drv_mpls_info_t;
Push时,用vc_info结构体 tunnel_info[2]结构体 Swap时, 用vc_info结构体
Php/pop 时, 两个结构体都不用设置 只有push时,需设置tunnel label的个数
//vpn 类型
typedef enum mpls_vpn_s{ BCM_MPLS_VPN_NONE, // 非vpn BCM_MPLS_VPN_L3, // L3 vpn BCM_MPLS_VPN_VPWS, // vpws BCM_MPLS_VPN_VPLS , // vpls }mpls_vpn_e;
typedef struct bcm_vpn_id_info_s {
u32 type; // vpn 类型 u32 in_vlan; // 入口vlan
}bcm_vpn_id_info_t;
/*mpls_entry table info 结构体*/ 所有内容为平台下刷 typedef struct entry_label_info_s {
u32 ing_label; //标签值
u32 mpls_ttl;
u32 new_cfi; u32 vpn_type; // vpn 的类型,见枚举mpls_vpn_e
u32 vpn_id ; // vpn 的值
u32 arp_index; //arp表的索引值 u32 in_port; //入端口
mpls_action_e action; //转发类型,见枚举mpls_action_e;
}entry_label_info_t;
删除接口:
u32 drv_mpls_tunnel_label_swap(u32 slot_id, u32 ing_label, drv_mpls_label_info_t
egr_label_info, u32 nh_idx) u32 drv_mpls_tunnel_label_php(u32 slot_id, u32 ing_label, u32 nh_idx) u32 drv_mpls_tunnel_label_pop(u32 slot_id, u32 ing_label) u32 drv_mpls_tunnel_label_del(u32 slot_id, u32 ing_label)
修改接口
//这个接口提供贴标签的动作
u32 drv_mpls_egr_intf_label_add(u32 slot_id, drv_mpls_info_t *info) u32 drv_mpls_egr_intf_label_del(u32 slot_id, drv_mpls_info_t *info)
添加接口:
接口修改
u32 drv_mpls_entry_add(u32 slot_id, entry_label_info_t* info, u32 arp_index) u32 drv_mpls_entry_del(u32 slot_id, u32 ing_label)
u32 drv_mpls_arp_add(u32 slot_id, drv_arp_mpls_info_t *info, u32 *arp_index) u32 drv_mpls_arp_del(u32 slot_id, u32 arp_index)
表项下刷流程
11.1单标签报文下刷流程
Push:动作为push, arp表类型为mpls,添加tunnel label
① u32 drv_mpls_egr_intf_label_add(u32 slot_id, drv_mpls_info_t *info) ② u32 drv_mpls_arp_add(u32 slot_id, drv_arp_mpls_info_t *info, u32 *arp_index) ③ u32 drv_l3_route_add(u32 slot_id, u32 ip_addr,u32 ip_mask, u32 vrf_id, u32 route_type,
u32 drv_nexthop_content, u32 drv_defip_content)
Swap: 动作为swap,arp表类型为mpls, 添加vc label
① u32 drv_mpls_egr_intf_label_add(u32 slot_id, drv_mpls_info_t *info) ② u32 drv_mpls_arp_add(u32 slot_id, drv_arp_mpls_info_t *info, u32 *arp_index) ③ u32 drv_mpls_entry_add(u32 slot_id, entry_label_info_t *info)
php:动作为php,arp表类型为mpls,不添加label
① u32 drv_mpls_egr_intf_label_add(u32 slot_id, drv_mpls_info_t *info)
② u32 drv_mpls_arp_add(u32 slot_id, drv_arp_mpls_info_t *info, u32 *arp_index) ③ u32 drv_mpls_entry_add(u32 slot_id, entry_label_info_t *info)
pop:动作为pop, arp表类型为ip
① u32 drv_vlan_intf_add(u32 slot_id, u32 vlan_id, eth_mac_addr_t addr, u32 *intf_idx) ② u32 drv_mpls_arp_add(u32 slot_id, drv_arp_mpls_info_t *info, u32 *arp_index) ③ u32 drv_l3_route_add(u32 slot_id, u32 ip_addr,u32 ip_mask, u32 vrf_id, u32 route_type, u32 drv_nexthop_content, u32 drv_defip_content) ④ u32 drv_mpls_entry_add(u32 slot_id, entry_label_info_t *info)
// vpn id为驱动返回,作为vpn标识
l3 vpn下刷流程
Push:动作为push, arp表类型为mpls,添加tunnel label,添加swap label vrf有效 ① u32 bcm_mpls_vpn_id_create( u32 vpn_type, u32 *vpn_id);
② u32 drv_mpls_egr_intf_label_add(u32 slot_id, drv_mpls_info_t *info) ② u32 drv_mpls_arp_add(u32 slot_id, drv_arp_info_t *info, u32 *drv_content)
③ u32 drv_vlan_vrf_set(u32 slot_id, u32 vlan_id, u32 vrf_id) ④ u32 drv_l3_route_add(u32 slot_id, u32 ip_addr,u32 ip_mask, u32 vrf_id, u32 route_type,
u32 drv_nexthop_content, u32 drv_defip_content)
swap/php/动作与单标签下表流程一致。
Pop:动作为pop,添加路由表,设置vrf
① u32 bcm_mpls_vpn_id_create( u32 vpn_type, u32 *vpn_id);
② u32 drv_vlan_intf_add(u32 slot_id, u32 vlan_id, eth_mac_addr_t addr, u32 *intf_idx) ③ u32 drv_mpls_arp_add(u32 slot_id, drv_arp_mpls_info_t *info, u32 *drv_content)
④ u32 drv_vlan_vrf_set(u32 slot_id, u32 vlan_id, u32 vrf_id) ⑤ u32 drv_l3_route_add(u32 slot_id, u32 ip_addr,u32 ip_mask, u32 vrf_id, u32 route_type,
u32 drv_nexthop_content, u32 drv_defip_content) ⑥ u32 drv_mpls_entry_add(u32 slot_id, entry_label_info_t* info, u32 arp_index)