in src/iccpd/src/iccp_cmd_show.c [351:611]
int iccp_local_if_dump(char * *buf, int *num, int mclag_id)
{
struct System *sys = NULL;
struct CSM *csm = NULL;
struct LocalInterface *lif_po = NULL;
struct LocalInterface *lif_peer = NULL;
struct mclagd_local_if mclagd_lif;
struct VLAN_ID* vlan_id = NULL;
char * str_buf = NULL;
int str_size = MCLAGDCTL_PARA3_LEN - 1;
int len = 0;
int lif_num = 0;
int id_exist = 0;
int lif_buf_size = MCLAGDCTL_CMD_SIZE;
char * lif_buf = NULL;
if (!(sys = system_get_instance()))
{
return EXEC_TYPE_NO_EXIST_SYS;
}
lif_buf = (char*)malloc(lif_buf_size);
if (!lif_buf)
return EXEC_TYPE_FAILED;
LIST_FOREACH(csm, &(sys->csm_list), next)
{
if (mclag_id > 0)
{
if (csm->mlag_id == mclag_id)
id_exist = 1;
else
continue;
}
LIST_FOREACH(lif_po, &(MLACP(csm).lif_list), mlacp_next)
{
memset(&mclagd_lif, 0, sizeof(struct mclagd_local_if));
mclagd_lif.ifindex = lif_po->ifindex;
if (lif_po->type == IF_T_UNKNOW)
memcpy(mclagd_lif.type, "Unknown", 6);
else if (lif_po->type == IF_T_PORT)
memcpy(mclagd_lif.type, "Ethernet", 8);
else if (lif_po->type == IF_T_PORT_CHANNEL)
memcpy(mclagd_lif.type, "PortChannel", 11);
memcpy(mclagd_lif.name, lif_po->name, MAX_L_PORT_NAME);
memcpy(mclagd_lif.mac_addr, lif_po->mac_addr, ETHER_ADDR_LEN);
if (lif_po->state == PORT_STATE_UP)
memcpy(mclagd_lif.state, "Up", 2);
else if (lif_po->state == PORT_STATE_DOWN)
memcpy(mclagd_lif.state, "Down", 4);
else if (lif_po->state == PORT_STATE_ADMIN_DOWN)
memcpy(mclagd_lif.state, "Admin-down", 10);
else if (lif_po->state == PORT_STATE_TEST)
memcpy(mclagd_lif.state, "Test", 4);
memcpy(mclagd_lif.ipv4_addr, show_ip_str(lif_po->ipv4_addr), 16);
mclagd_lif.prefixlen = lif_po->prefixlen;
mclagd_lif.l3_mode = local_if_is_l3_mode(lif_po);
mclagd_lif.is_peer_link = lif_po->is_peer_link;
memcpy(mclagd_lif.portchannel_member_buf, lif_po->portchannel_member_buf, 512);
mclagd_lif.po_id = lif_po->po_id;
mclagd_lif.po_active = lif_po->po_active;
/*mlacp_state*/
if (lif_po->mlacp_state == MLACP_STATE_INIT)
memcpy(mclagd_lif.mlacp_state, "INIT", 4);
else if (lif_po->mlacp_state == MLACP_STATE_STAGE1)
memcpy(mclagd_lif.mlacp_state, "STAGE1", 6);
else if (lif_po->mlacp_state == MLACP_STATE_STAGE2)
memcpy(mclagd_lif.mlacp_state, "STAGE2", 6);
else if (lif_po->mlacp_state == MLACP_STATE_EXCHANGE)
memcpy(mclagd_lif.mlacp_state, "EXCHANGE", 8);
else if (lif_po->mlacp_state == MLACP_STATE_ERROR)
memcpy(mclagd_lif.mlacp_state, "ERROR", 5);
mclagd_lif.isolate_to_peer_link = lif_po->isolate_to_peer_link;
mclagd_lif.is_traffic_disable = lif_po->is_traffic_disable;
str_buf = mclagd_lif.vlanlist;
len = 0;
int prev_vlan_id = 0;
int range = 0;
int to_be_printed = 0;
RB_FOREACH (vlan_id, vlan_rb_tree, &(lif_po->vlan_tree))
{
if (str_size - len < 4)
break;
if (!prev_vlan_id || vlan_id->vid != prev_vlan_id + 1)
{
if (range)
{
if (str_size - len < (4 + ((range)?8:0)))
{
break;
}
len += snprintf(str_buf + len, str_size - len, "- %d ", prev_vlan_id);
}
len += snprintf(str_buf + len, str_size - len, "%d ", vlan_id->vid);
range = 0;
to_be_printed = 0;
}
else
{
range = 1;
to_be_printed = 1;
}
prev_vlan_id = vlan_id->vid;
}
if (to_be_printed && (str_size - len > (4 + ((range)?8:0))))
{
if (prev_vlan_id)
{
len += snprintf(str_buf + len, str_size - len, "%s%d ", range?"- ":"", prev_vlan_id);
range = 0;
}
}
memcpy(lif_buf + MCLAGD_REPLY_INFO_HDR + lif_num * sizeof(struct mclagd_local_if),
&mclagd_lif, sizeof(struct mclagd_local_if));
lif_num++;
if ((lif_num + 1) * sizeof(struct mclagd_local_if) > (lif_buf_size - MCLAGD_REPLY_INFO_HDR))
{
lif_buf_size += MCLAGDCTL_CMD_SIZE;
lif_buf = (char*)realloc(lif_buf, lif_buf_size);
if (!lif_buf)
return EXEC_TYPE_FAILED;
}
}
if (csm->peer_link_if) {
lif_peer = csm->peer_link_if;
memset(&mclagd_lif, 0, sizeof(struct mclagd_local_if));
mclagd_lif.ifindex = lif_peer->ifindex;
if (lif_peer->type == IF_T_UNKNOW)
memcpy(mclagd_lif.type, "Unknown", strlen("unknown"));
else if (lif_peer->type == IF_T_PORT)
memcpy(mclagd_lif.type, "Ethernet", strlen("Ethernet"));
else if (lif_peer->type == IF_T_PORT_CHANNEL)
memcpy(mclagd_lif.type, "PortChannel", 11);
memcpy(mclagd_lif.name, lif_peer->name, MAX_L_PORT_NAME);
memcpy(mclagd_lif.mac_addr, lif_peer->mac_addr, ETHER_ADDR_LEN);
if (lif_peer->state == PORT_STATE_UP)
memcpy(mclagd_lif.state, "Up", strlen("Up"));
else if (lif_peer->state == PORT_STATE_DOWN)
memcpy(mclagd_lif.state, "Down", strlen("Down"));
else if (lif_peer->state == PORT_STATE_ADMIN_DOWN)
memcpy(mclagd_lif.state, "Admin-down", strlen("Admin-down"));
else if (lif_peer->state == PORT_STATE_TEST)
memcpy(mclagd_lif.state, "Test", strlen("Test"));
memcpy(mclagd_lif.ipv4_addr, show_ip_str(lif_peer->ipv4_addr), 16);
mclagd_lif.prefixlen = lif_peer->prefixlen;
mclagd_lif.l3_mode = local_if_is_l3_mode(lif_peer);
mclagd_lif.is_peer_link = lif_peer->is_peer_link;
memcpy(mclagd_lif.portchannel_member_buf, lif_peer->portchannel_member_buf, 512);
mclagd_lif.po_id = lif_peer->po_id;
mclagd_lif.po_active = lif_peer->po_active;
/*mlacp_state*/
if (lif_peer->mlacp_state == MLACP_STATE_INIT)
memcpy(mclagd_lif.mlacp_state, "INIT", strlen("INIT"));
else if (lif_peer->mlacp_state == MLACP_STATE_STAGE1)
memcpy(mclagd_lif.mlacp_state, "STAGE1", strlen("STAGE1"));
else if (lif_peer->mlacp_state == MLACP_STATE_STAGE2)
memcpy(mclagd_lif.mlacp_state, "STAGE2", strlen("STAGE2"));
else if (lif_peer->mlacp_state == MLACP_STATE_EXCHANGE)
memcpy(mclagd_lif.mlacp_state, "EXCHANGE", strlen("EXCHANGE"));
else if (lif_peer->mlacp_state == MLACP_STATE_ERROR)
memcpy(mclagd_lif.mlacp_state, "ERROR", strlen("ERROR"));
mclagd_lif.isolate_to_peer_link = lif_peer->isolate_to_peer_link;
mclagd_lif.is_traffic_disable = lif_peer->is_traffic_disable;
str_buf = mclagd_lif.vlanlist;
len = 0;
int prev_vlan_id = 0;
int range = 0;
int to_be_printed = 0;
RB_FOREACH (vlan_id, vlan_rb_tree, &(lif_peer->vlan_tree))
{
if (str_size - len < 4)
break;
if (!prev_vlan_id || vlan_id->vid != prev_vlan_id + 1)
{
if (range)
{
if (str_size - len < (4 + ((range)?8:0)))
{
break;
}
len += snprintf(str_buf + len, str_size - len, "- %d ", prev_vlan_id);
}
len += snprintf(str_buf + len, str_size - len, "%d ", vlan_id->vid);
range = 0;
to_be_printed = 0;
}
else
{
range = 1;
to_be_printed = 1;
}
prev_vlan_id = vlan_id->vid;
}
if (to_be_printed && (str_size - len > (4 + ((range)?8:0))))
{
if (prev_vlan_id)
{
len += snprintf(str_buf + len, str_size - len, "%s%d ", range?"- ":"", prev_vlan_id);
range = 0;
}
}
memcpy(lif_buf + MCLAGD_REPLY_INFO_HDR + lif_num * sizeof(struct mclagd_local_if),
&mclagd_lif, sizeof(struct mclagd_local_if));
lif_num++;
if ((lif_num + 1) * sizeof(struct mclagd_local_if) > (lif_buf_size - MCLAGD_REPLY_INFO_HDR))
{
lif_buf_size += MCLAGDCTL_CMD_SIZE;
lif_buf = (char*)realloc(lif_buf, lif_buf_size);
if (!lif_buf)
return EXEC_TYPE_FAILED;
}
}
}
*buf = lif_buf;
*num = lif_num;
if (mclag_id > 0 && !id_exist)
return EXEC_TYPE_NO_EXIST_MCLAGID;
return EXEC_TYPE_SUCCESS;
}