int iccp_local_if_dump()

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;
}