mpls - VPN标签2003

发布时间 : 星期四 文章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)

联系合同范文客服:xxxxx#qq.com(#替换为@)