Hi all,

I am writing a simple application to test the virtual IP address feature of 
IfSv, for example, to install/free a virtual IP address, to take a switchover. 
I can subscribe/unsubscribe to IfSv successfully; but unfortunately, I failed 
to install a virtual IP address, it notifies a "NCSCC_RC_VIP_INTERNAL_ERROR" 
error.

Could someone who has experience on IfSv help me on this issue? I really need 
your help! Thanks for your thinking about this.

The test app and a simple makefile is attached (please mainly refer to 
"install_vip() function" if you are interested in it, and maybe some code is 
incorrect because of my insufficient understanding to IfSv ) and the output is 
like below:

/* app output */

[EMAIL PROTECTED] ifsv_test]# ./ifsv_app_test

Subscribe to interface service successfully!

Subscribe handle: g_subscr_hdl == -16777214

NCS_IFSV_VIP_HANDLE: vipApplName == ifsv_app_test
NCS_IFSV_VIP_HANDLE: poolHdl == 12345
virtual IP address: 192.168.1.100
v_ip_addr.ipaddr.info.v4 == 1677830336
virtual IP address netmask: 255.255.255.0
v_ip_addr.mask_len == 7
req_info.info.i_vip_install.i_intf_name == eth0

Install virtual IP address failed!

NCS_IFSV_VIP_ERRORS: 12
NCS_IFSV_VIP_ERRORS: NCSCC_RC_VIP_INTERNAL_ERROR

NCS_IFSV_VIP_HANDLE: vipApplName == ifsv_app_test
NCS_IFSV_VIP_HANDLE: poolHdl == 12345

Free virtual IP address failed!

NCS_IFSV_VIP_ERRORS: 8
NCS_IFSV_VIP_ERRORS: NCSCC_RC_INVALID_PARAM


Unsubscribe handle: g_subscr_hdl == -16777214

Unsubscribe to interface service successfully!

[EMAIL PROTECTED] ifsv_test]#


Best Regards,

Qiao Lei

while(1){
    Problem *newProblem = new Problem();
    solveProblem(newProblem);
    cout<<"This is the life!"<<endl;
}

尽力而为还不够,得竭尽全力才行。

Attachment: makefile
Description: makefile

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>

#define NCS_VIP 1

#include "ifsv_papi.h"
#include "ifa_papi.h"
#include "ncs_ipv4.h"

uns32 g_subscr_hdl;

uns32 g_pool_hdl = 12345;
char g_vip_app_name[32] = "ifsv_app_test";

char g_vip_addr[32] = "192.168.1.100";
char g_vip_mask[32] = "255.255.255.0";
char g_intf_name[16] = "eth0";

uns32 * p_g_subscr_hdl;

void print_NCS_IFSV_VIP_ERRORS(NCS_IFSV_VIP_ERRORS v_vip_errors) {

        printf("NCS_IFSV_VIP_ERRORS: %d\n",v_vip_errors);

        switch(v_vip_errors) {
                case NCSCC_RC_INTF_ADMIN_DOWN: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_RC_INTF_ADMIN_DOWN\n");
                        break;
                }
                case NCSCC_RC_INVALID_INTF: {
                        printf("NCS_IFSV_VIP_ERRORS: NCSCC_RC_INVALID_INTF\n");
                        break;
                }
                case NCSCC_RC_INVALID_IP: {
                        printf("NCS_IFSV_VIP_ERRORS: NCSCC_RC_INVALID_IP\n");
                        break;
                }
                case NCSCC_RC_IP_ALREADY_EXISTS: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_RC_IP_ALREADY_EXISTS\n");
                        break;
                }
                case NCSCC_RC_INVALID_PARAM: {
                        printf("NCS_IFSV_VIP_ERRORS: NCSCC_RC_INVALID_PARAM\n");
                        break;
                }
                case NCSCC_RC_INVALID_VIP_HANDLE: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_RC_INVALID_VIP_HANDLE\n");
                        break;
                }
                case NCSCC_RC_NULL_APPLNAME: {
                        printf("NCS_IFSV_VIP_ERRORS: NCSCC_RC_NULL_APPLNAME\n");
                        break;
                }
                case NCSCC_RC_VIP_RETRY: {
                        printf("NCS_IFSV_VIP_ERRORS: NCSCC_RC_VIP_RETRY\n");
                        break;
                }
                case NCSCC_RC_VIP_INTERNAL_ERROR: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_RC_VIP_INTERNAL_ERROR\n");
                        break;
                }
                case NCSCC_VIP_EXISTS_ON_OTHER_INTERFACE: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_VIP_EXISTS_ON_OTHER_INTERFACE\n");
                        break;
                }
                case NCSCC_RC_IP_EXISTS_BUT_NOT_VIP: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_RC_IP_EXISTS_BUT_NOT_VIP\n");
                        break;
                }
                case NCSCC_VIP_HDL_IN_USE_FOR_DIFF_IP: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_VIP_HDL_IN_USE_FOR_DIFF_IP\n");
                        break;
                }
                case NCSCC_RC_APPLNAME_LEN_EXCEEDS_LIMIT: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_RC_APPLNAME_LEN_EXCEEDS_LIMIT\n");
                        break;
                }
                case NCSCC_VIP_EXISTS_FOR_OTHER_HANDLE: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_VIP_EXISTS_FOR_OTHER_HANDLE\n");
                        break;
                }
                case NCSCC_RC_APPLICAION_NOT_OWNER_OF_IP: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_RC_APPLICAION_NOT_OWNER_OF_IP\n");
                        break;
                }
                case NCSCC_RC_INVALID_FLAG: {
                        printf("NCS_IFSV_VIP_ERRORS: NCSCC_RC_INVALID_FLAG\n");
                        break;
                }
                case NCSCC_RC_IP_ADDR_TYPE_NOT_SUPPORTED: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_RC_IP_ADDR_TYPE_NOT_SUPPORTED\n");
                        break;
                }
                case NCSCC_RC_INVALID_MASKLEN: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_RC_INVALID_MASKLEN\n");
                        break;
                }
                case NCSCC_VIP_APPL_NAME_ALREADY_IN_USE_FOR_SAME_IP: {
                        printf("NCS_IFSV_VIP_ERRORS: 
NCSCC_VIP_APPL_NAME_ALREADY_IN_USE_FOR_SAME_IP\n");
                        break;
                }
                default: {
                        printf("NCS_IFSV_VIP_ERRORS: Unrecognized vip error\n");
                        break;
                }
        }
        return;
}

void print_NCS_IFSV_VIP_HANDLE(NCS_IFSV_VIP_HANDLE v_vip_hdl) {

        printf("NCS_IFSV_VIP_HANDLE: vipApplName == ");
        for (int i = 0;i < m_NCS_IFSV_VIP_APPL_NAME;i ++) {
                printf("%c",v_vip_hdl.vipApplName[i]);
        }
        printf("\n");
        printf("NCS_IFSV_VIP_HANDLE: poolHdl == %d\n",v_vip_hdl.poolHdl);
        
        return;
}

void print_NCS_IFSV_IFINDEX(NCS_IFSV_IFINDEX v_ifindex) {

        printf("NCS_IFSV_IFINDEX: %d\n",v_ifindex);

        return;
}

void print_NCS_IFSV_SPT(NCS_IFSV_SPT v_spt) {

        printf("NCS_IFSV_SPT: shelf == %d\n",v_spt.shelf);
        printf("NCS_IFSV_SPT: slot == %d\n",v_spt.slot);
        printf("NCS_IFSV_SPT: port == %d\n",v_spt.port);
        printf("NCS_IFSV_SPT: type == %d\n",v_spt.type);
        printf("NCS_IFSV_SPT: subscr_scope == %d\n",v_spt.subscr_scope);

        return;
}

void print_NCS_IFSV_INTF_STATS(NCS_IFSV_INTF_STATS v_intf_stats) {

        printf("NCS_IFSV_INTF_STATS: last_chg == %d\n",v_intf_stats.last_chg);
        printf("NCS_IFSV_INTF_STATS: in_octs == %d\n",v_intf_stats.in_octs);
        printf("NCS_IFSV_INTF_STATS: in_upkts == %d\n",v_intf_stats.in_upkts);
        printf("NCS_IFSV_INTF_STATS: in_nupkts == %d\n",v_intf_stats.in_nupkts);
        printf("NCS_IFSV_INTF_STATS: in_dscrds == %d\n",v_intf_stats.in_dscrds);
        printf("NCS_IFSV_INTF_STATS: in_errs == %d\n",v_intf_stats.in_errs);
        printf("NCS_IFSV_INTF_STATS: in_unknown_prots == 
%d\n",v_intf_stats.in_unknown_prots);
        printf("NCS_IFSV_INTF_STATS: out_octs == %d\n",v_intf_stats.out_octs);
        printf("NCS_IFSV_INTF_STATS: out_upkts == %d\n",v_intf_stats.out_upkts);
        printf("NCS_IFSV_INTF_STATS: out_nupkts == 
%d\n",v_intf_stats.out_nupkts);
        printf("NCS_IFSV_INTF_STATS: out_dscrds == 
%d\n",v_intf_stats.out_dscrds);
        printf("NCS_IFSV_INTF_STATS: out_errs == %d\n",v_intf_stats.out_errs);
        printf("NCS_IFSV_INTF_STATS: out_qlen == %d\n",v_intf_stats.out_qlen);
        printf("NCS_IFSV_INTF_STATS: if_specific == 
%d\n",v_intf_stats.if_specific);

        return;
}

void print_NCS_IFSV_NODEID_IFNAME(NCS_IFSV_NODEID_IFNAME v_nodeid_ifname) {

        printf("NCS_IFSV_NODEID_IFNAME: node_id == 
%d\n",v_nodeid_ifname.node_id);
        printf("NCS_IFSV_NODEID_IFNAME: if_name == 
%s\n",v_nodeid_ifname.if_name);

        return;
}

void print_NCS_SVDEST(NCS_SVDEST v_svdest) {

        printf("NCS_SVDEST: svcid == %d\n",v_svdest.svcid);
        printf("NCS_SVDEST: dest == %ld\n",v_svdest.dest);
        
        return;
}

void print_TIME_T(time_t v_time) {

        printf("TIME_T: %ld\n",v_time);

        return;
}

void print_NCS_IFSV_INTF_INFO(NCS_IFSV_INTF_INFO v_intf_info) {

        printf("NCS_IFSV_INTF_INFO: if_am == %d\n",v_intf_info.if_am);

        if (((v_intf_info.if_am)&(NCS_IFSV_IAM_DESCR)) != 0) {
                printf("NCS_IFSV_INTF_INFO: if_descr == 
%s\n",v_intf_info.if_descr);
        }
        if (((v_intf_info.if_am)&(NCS_IFSV_IAM_NAME)) != 0) {
                printf("NCS_IFSV_INTF_INFO: if_name == 
%d\n",v_intf_info.if_name);
        }
        if (((v_intf_info.if_am)&(NCS_IFSV_IAM_MTU)) != 0) {
                printf("NCS_IFSV_INTF_INFO: mtu == %d\n",v_intf_info.mtu);
        }
        if (((v_intf_info.if_am)&(NCS_IFSV_IAM_IFSPEED)) != 0) {
                printf("NCS_IFSV_INTF_INFO: if_speed == 
%d\n",v_intf_info.if_speed);
        }
        if (((v_intf_info.if_am)&(NCS_IFSV_IAM_PHYADDR)) != 0) {
                printf("NCS_IFSV_INTF_INFO: phy_addr == 
%s\n",v_intf_info.phy_addr);
        }
        if (((v_intf_info.if_am)&(NCS_IFSV_IAM_ADMSTATE)) != 0) {
                printf("NCS_IFSV_INTF_INFO: admin_state == 
%d\n",v_intf_info.admin_state);
        }
        if (((v_intf_info.if_am)&(NCS_IFSV_IAM_OPRSTATE)) != 0) {
                printf("NCS_IFSV_INTF_INFO: oper_state == 
%d\n",v_intf_info.oper_state);
        }
        if (((v_intf_info.if_am)&(NCS_IFSV_IAM_LAST_CHNG)) != 0) {
                print_TIME_T(v_intf_info.last_change);
        }
        if (((v_intf_info.if_am)&(NCS_IFSV_IAM_SVDEST)) != 0) {
//              printf("NCS_IFSV_INTF_INFO: addsvd_list == %d\n",v_intf_info.);
                printf("NCS_IFSV_INTF_INFO: addsvd_cnt == 
%d\n",v_intf_info.addsvd_cnt);
//              printf("NCS_IFSV_INTF_INFO: delsvd_list == %d\n",v_intf_info.);
                printf("NCS_IFSV_INTF_INFO: delsvd_cnt == 
%d\n",v_intf_info.delsvd_cnt);
        }
        if (((v_intf_info.if_am)&(NCS_IFSV_IAM_CHNG_MASTER)) != 0) {
                printf("NCS_IFSV_INTF_INFO: bind_master_ifindex == 
%d\n",v_intf_info.bind_master_ifindex);
                printf("NCS_IFSV_INTF_INFO: bind_slave_ifindex == 
%d\n",v_intf_info.bind_slave_ifindex);
                print_NCS_IFSV_NODEID_IFNAME(v_intf_info.bind_master_info);
                print_NCS_IFSV_NODEID_IFNAME(v_intf_info.bind_slave_info);
        }

        return;
}

void print_NCS_IFSV_IFGET_RSP_ERR(NCS_IFSV_IFGET_RSP_ERR v_ifget_rsp_err) {

        printf("NCS_IFSV_IFGET_RSP_ERR: %d\n",v_ifget_rsp_err);
        
        switch(v_ifget_rsp_err) {
                case NCS_IFSV_IFGET_RSP_SUCCESS: {
                        printf("NCS_IFSV_IFGET_RSP_ERR: 
NCS_IFSV_IFGET_RSP_SUCCESS\n");
                        break;
                }
                case NCS_IFSV_IFGET_RSP_NO_REC: {
                        printf("NCS_IFSV_IFGET_RSP_ERR: 
NCS_IFSV_IFGET_RSP_NO_REC\n");
                        break;
                }
                default: {
                        printf("NCS_IFSV_IFGET_RSP_ERR: Unrecognized rsp 
err\n");
                        break;
                }
        }

        return;
}

void print_NCS_IFSV_INFO_TYPE(NCS_IFSV_INFO_TYPE v_info_type) {

        printf("NCS_IFSV_INFO_TYPE: %d\n",v_info_type);

        switch(v_info_type) {
                case NCS_IFSV_IF_INFO: {
                        printf("NCS_IFSV_INFO_TYPE: NCS_IFSV_IF_INFO\n");
                        break;
                }
                case NCS_IFSV_BIND_GET_LOCAL_INTF: {
                        printf("NCS_IFSV_INFO_TYPE: 
NCS_IFSV_BIND_GET_LOCAL_INTF\n");
                        break;
                }
                case NCS_IFSV_IFSTATS_INFO: {
                        printf("NCS_IFSV_INFO_TYPE: NCS_IFSV_IFSTATS_INFO\n");
                        break;
                }
                default: {
                        printf("NCS_IFSV_INFO_TYPE: Unrecognized info type\n");
                        break;
                }
        }
        
        return;
}

void print_NCS_IFSV_INTF_REC(NCS_IFSV_INTF_REC v_intf_rec) {

        print_NCS_IFSV_IFINDEX(v_intf_rec.if_index);
        print_NCS_IFSV_SPT(v_intf_rec.spt_info);
        print_NCS_IFSV_INFO_TYPE(v_intf_rec.info_type);
        print_NCS_IFSV_INTF_INFO(v_intf_rec.if_info);
        print_NCS_IFSV_INTF_STATS(v_intf_rec.if_stats);

        return;
}

void print_NCS_IFSV_IFGET_RSP(NCS_IFSV_IFGET_RSP v_ifget_rsp) {

        print_NCS_IFSV_IFGET_RSP_ERR(v_ifget_rsp.error);
        print_NCS_IFSV_INTF_REC(v_ifget_rsp.if_rec);            

        return;
}

static uns32 ifsv_subscr_callback(struct ncs_ifsv_svc_rsp * cb_rsp) {

        printf("cb_rsp->rsp_type: %d\n",cb_rsp->rsp_type);

        switch(cb_rsp->rsp_type) {
                case NCS_IFSV_IFREC_GET_RSP: {
                        printf("NCS_IFSV_IFREC_GET_RSP\n");
                        print_NCS_IFSV_IFGET_RSP((cb_rsp->info).ifget_rsp);     
                        break;
                }
                case NCS_IFSV_IFREC_ADD_NTFY: {
                        printf("NCS_IFSV_IFREC_ADD_NTFY\n");
                        print_NCS_IFSV_INTF_REC((cb_rsp->info).ifadd_ntfy);
                        break;
                }
                case NCS_IFSV_IFREC_DEL_NTFY: {
                        printf("NCS_IFSV_IFREC_ADD_NTFY\n");
                        print_NCS_IFSV_IFINDEX((cb_rsp->info).ifdel_ntfy);
                        break;
                }
                case NCS_IFSV_IFREC_UPD_NTFY: {
                        printf("NCS_IFSV_IFREC_ADD_NTFY\n");
                        print_NCS_IFSV_INTF_REC((cb_rsp->info).ifupd_ntfy);
                        break;
                }
                default: {
                        printf("Unrecognized rsp_type\n");
                        break;
                }
        }
        
        printf("\nusrhdl == %ld\n\n",cb_rsp->usrhdl);
        
        return(0);
}

uns32 subscr_to_ifsv() {

        p_g_subscr_hdl = &g_subscr_hdl;
        
        NCS_IFSV_SVC_REQ req_info;
        memset(&req_info,0,sizeof(NCS_IFSV_SVC_REQ));

        req_info.i_req_type = NCS_IFSV_SVC_REQ_SUBSCR;
        req_info.info.i_subr.i_ifsv_cb = ifsv_subscr_callback;
        req_info.info.i_subr.subscr_scope = NCS_IFSV_SUBSCR_INT;
        req_info.info.i_subr.i_sevts = NCS_IFSV_ADD_IFACE;
        req_info.info.i_subr.i_smap = NCS_IFSV_IAM_OPRSTATE;
        req_info.info.i_subr.i_usrhdl = (NCSCONTEXT)p_g_subscr_hdl;

        int rc = ncs_ifsv_svc_req(&req_info);

        if (rc != NCSCC_RC_SUCCESS) {
                printf("\nSubscribe to interface service failed!\n\n");
                return(NCSCC_RC_FAILURE);
        }
        else {
                printf("\nSubscribe to interface service successfully!\n\n");
                g_subscr_hdl = req_info.info.i_subr.o_subr_hdl;
                printf("Subscribe handle: g_subscr_hdl == %d\n\n",g_subscr_hdl);
                
                return(NCSCC_RC_SUCCESS);
        }
}

uns32 unsubscr_to_ifsv() {

        NCS_IFSV_SVC_REQ req_info;
        memset(&req_info,0,sizeof(NCS_IFSV_SVC_REQ));

        req_info.i_req_type = NCS_IFSV_SVC_REQ_UNSUBSCR;
        req_info.info.i_unsubr.i_subr_hdl = g_subscr_hdl;
        printf("\n\nUnsubscribe handle: g_subscr_hdl == %d\n",g_subscr_hdl);

        int rc = ncs_ifsv_svc_req(&req_info);

        if (rc != NCSCC_RC_SUCCESS) {
                printf("\nUnsubscribe to interface service failed!\n\n");
                return(NCSCC_RC_FAILURE);
        }
        else {
                printf("\nUnsubscribe to interface service successfully!\n\n");
                return(NCSCC_RC_SUCCESS);
        }
}

uns32 install_vip() {
        
        NCS_IFSV_VIP_HANDLE v_vip_hdl;

        memcpy(v_vip_hdl.vipApplName,g_vip_app_name,sizeof(g_vip_app_name));
        v_vip_hdl.poolHdl = g_pool_hdl;

        print_NCS_IFSV_VIP_HANDLE(v_vip_hdl);

        NCS_IPPFX v_ip_addr;
        v_ip_addr.ipaddr.type = NCS_IP_ADDR_TYPE_IPV4;
        v_ip_addr.ipaddr.info.v4 = inet_addr(g_vip_addr);
        printf("virtual IP address: %s\n",g_vip_addr);
        printf("v_ip_addr.ipaddr.info.v4 == %d\n",v_ip_addr.ipaddr.info.v4);

        int vip_mask_len;
        m_NCS_IPV4_MASK_LEN_P(vip_mask_len,g_vip_mask);
        v_ip_addr.mask_len = vip_mask_len;
        printf("virtual IP address netmask: %s\n",g_vip_mask);
        printf("v_ip_addr.mask_len == %d\n",v_ip_addr.mask_len);
        
        NCS_IFSV_SVC_REQ req_info;
        memset(&req_info,0,sizeof(NCS_IFSV_SVC_REQ));

        req_info.i_req_type = NCS_IFSV_REQ_VIP_INSTALL;
        req_info.info.i_vip_install.i_handle = v_vip_hdl;

        
memcpy(req_info.info.i_vip_install.i_intf_name,g_intf_name,sizeof(g_intf_name));
        printf("req_info.info.i_vip_install.i_intf_name == 
%s\n",req_info.info.i_vip_install.i_intf_name);

        req_info.info.i_vip_install.i_ip_addr = v_ip_addr;
        req_info.info.i_vip_install.i_infraFlag = VIP_ADDR_NORMAL;

        int rc = ncs_ifsv_svc_req(&req_info);

        if (rc != NCSCC_RC_SUCCESS) {
                printf("\nInstall virtual IP address failed!\n\n");
                
print_NCS_IFSV_VIP_ERRORS((NCS_IFSV_VIP_ERRORS)(req_info.info.i_vip_install.o_err));
    
                return(NCSCC_RC_FAILURE);
        }
        else {
                printf("\nInstall virtual IP address successfully!\n\n");
                return(NCSCC_RC_SUCCESS);
        }
}

uns32 free_vip() {

        NCS_IFSV_VIP_HANDLE v_vip_hdl;

        memcpy(v_vip_hdl.vipApplName,g_vip_app_name,sizeof(g_vip_app_name));
        v_vip_hdl.poolHdl = g_pool_hdl;
        
        printf("\n");
        print_NCS_IFSV_VIP_HANDLE(v_vip_hdl);

        NCS_IFSV_SVC_REQ req_info;
        memset(&req_info,0,sizeof(NCS_IFSV_SVC_REQ));

        req_info.i_req_type = NCS_IFSV_REQ_VIP_FREE;
        req_info.info.i_vip_free.i_handle = v_vip_hdl;
        req_info.info.i_vip_free.i_infraFlag = VIP_ADDR_NORMAL;

        int rc = ncs_ifsv_svc_req(&req_info);

        if (rc != NCSCC_RC_SUCCESS) {
                printf("\nFree virtual IP address failed!\n\n");
                
print_NCS_IFSV_VIP_ERRORS((NCS_IFSV_VIP_ERRORS)(req_info.info.i_vip_free.o_err));
       
                return(NCSCC_RC_FAILURE);
        }
        else {
                printf("\nFree virtual IP address successfully!\n\n");
                return(NCSCC_RC_SUCCESS);
        }
}

int main() {

        /* Initilize the environment, this line is really important! */
        ncs_agents_startup(0,0);

        subscr_to_ifsv();
        install_vip();
        
        free_vip();
        unsubscr_to_ifsv();
        
        return(0);
}

_______________________________________________
Users mailing list
[email protected]
http://list.opensaf.org/maillist/listinfo/users

Reply via email to