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;
}
尽力而为还不够,得竭尽全力才行。
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
