static void print_get_dscp(pcp_flow_t* f) { size_t cnt=0; pcp_flow_info_t *info_buf = NULL; pcp_flow_info_t *ret = pcp_flow_get_info(f, &cnt); info_buf=ret; printf("%-20s %5s %3s %5s %s\n", "Int. IP", "DSCP", "Res", "State","Ends"); for (; cnt>0; cnt--, ret++) { char ntop_buff[INET6_ADDRSTRLEN]; char timebuf[32]; printf("%-20s %5d %3d %5s %s", inet_ntop(AF_INET6, &ret->int_ip, ntop_buff, sizeof(ntop_buff)), (int)ret->learned_dscp, (int)ret->pcp_result_code, decode_fresult(ret->result), ret->recv_lifetime_end == 0 ? " -\n" : ctime_r(&ret->recv_lifetime_end, timebuf)); //LCOV_EXCL_LINE } if (info_buf) { free(info_buf); } }
static int check_flow_info(pcp_flow_t* f) { size_t cnt=0; pcp_flow_info_t *info_buf = NULL; pcp_flow_info_t *ret = pcp_flow_get_info(f,&cnt); int ret_val = 2; info_buf=ret; for (; cnt>0; cnt--, ret++) { switch(ret->result) { case pcp_state_succeeded: printf("\nFlow signaling succeeded.\n"); ret_val = 0; break; case pcp_state_short_lifetime_error: printf("\nFlow signaling failed. Short lifetime error received.\n"); ret_val = 3; break; case pcp_state_failed: printf("\nFlow signaling failed.\n"); ret_val = 4; break; default: continue; } break; } if (info_buf) { free(info_buf); } return ret_val; }
static void print_ext_addr(pcp_flow_t* f) { size_t cnt=0; pcp_flow_info_t *info_buf = NULL; pcp_flow_info_t *ret = pcp_flow_get_info(f,&cnt); info_buf=ret; printf("%-20s %-4s %-20s %5s %-20s %5s %-20s %5s %3s %5s %s\n", "PCP Server IP", "Prot", "Int. IP", "port", "Dst. IP", "port", "Ext. IP", "port", "Res", "State","Ends"); for (; cnt>0; cnt--, ret++) { char ntop_buffs[4][INET6_ADDRSTRLEN]; char timebuf[32]; printf("%-20s %-4s %-20s %5hu %-20s %5hu %-20s %5hu %3d %5s %s", inet_ntop(AF_INET6, &ret->pcp_server_ip, ntop_buffs[0], sizeof(ntop_buffs[0])), ret->protocol == IPPROTO_TCP ? "TCP" : ( ret->protocol == IPPROTO_UDP ? "UDP" : "UNK"), inet_ntop(AF_INET6, &ret->int_ip, ntop_buffs[1], sizeof(ntop_buffs[1])), ntohs(ret->int_port), inet_ntop(AF_INET6, &ret->dst_ip, ntop_buffs[2], sizeof(ntop_buffs[2])), ntohs(ret->dst_port), inet_ntop(AF_INET6, &ret->ext_ip, ntop_buffs[3], sizeof(ntop_buffs[3])), ntohs(ret->ext_port), ret->pcp_result_code, decode_fresult(ret->result), ret->recv_lifetime_end == 0 ? " -\n" : ctime_r(&ret->recv_lifetime_end, timebuf)); } if (info_buf) { free(info_buf); } }
int main(void) { pcp_flow_t *f1, *f2; pcp_ctx_t *ctx; pcp_log_level = PCP_DEBUG_NONE; PD_SOCKET_STARTUP(); //test pcp_init & terminate ctx = pcp_init(DISABLE_AUTODISCOVERY, NULL); TEST(get_pcp_server(ctx, 0)==NULL); pcp_terminate(ctx, 1); ctx = pcp_init(ENABLE_AUTODISCOVERY, NULL); TEST(get_pcp_server(ctx, 0)!=NULL); pcp_terminate(ctx, 1); TEST(get_pcp_server(ctx, 0)==NULL); ctx = pcp_init(DISABLE_AUTODISCOVERY, NULL); TEST(pcp_add_server(ctx, Sock_pton("127.0.0.1:5351"), 2)==0); #ifdef PCP_USE_IPV6_SOCKET TEST(pcp_add_server(ctx, Sock_pton("[::1]:5351"), 1)==1); #endif pcp_terminate(ctx, 1); #ifdef PCP_SADSCP //TEST learn DSCP { pcp_flow_t* l1; ctx = pcp_init(DISABLE_AUTODISCOVERY, NULL); TEST((l1=pcp_learn_dscp(ctx, 1,1,1,NULL))==NULL); //NO PCP server to send req TEST(pcp_add_server(ctx, Sock_pton("127.0.0.1:5351"), 2)==0); TEST((l1=pcp_learn_dscp(ctx, 1,1,1,NULL))!=NULL); TEST(l1->kd.operation==PCP_OPCODE_SADSCP); TEST(l1->sadscp_app_name==NULL); TEST(l1->sadscp.app_name_length==0); TEST(l1->sadscp.toler_fields==84); pcp_close_flow(l1); pcp_delete_flow(l1); TEST((l1=pcp_learn_dscp(ctx, 2,2,2,"test"))!=NULL); TEST(l1->sadscp.app_name_length==4); TEST(strncmp(l1->sadscp_app_name,"test",l1->sadscp.app_name_length)==0); TEST(l1->sadscp.toler_fields==168); pcp_terminate(ctx, 1); } #endif ctx = pcp_init(DISABLE_AUTODISCOVERY, NULL); TEST(pcp_add_server(ctx, Sock_pton("127.0.0.1:5351"), 2)==0); TEST((pcp_new_flow(ctx, Sock_pton("[::1]:1234"), Sock_pton("[::1]"), NULL, IPPROTO_TCP, 100, NULL))==NULL); pcp_pulse(NULL, NULL); pcp_pulse(ctx, NULL); pcp_flow_get_info(NULL, NULL, NULL); //PCP PEER/MAP tests TEST(pcp_new_flow(NULL, NULL, NULL, NULL, 0, 0, NULL)==NULL); TEST(pcp_new_flow(ctx, NULL, NULL, NULL, 0, 0, NULL)==NULL); TEST((f1=pcp_new_flow(ctx, Sock_pton("127.0.0.1:1234"), Sock_pton("127.0.0.1"), NULL, IPPROTO_TCP, 100, NULL))!=NULL); TEST((f2=pcp_new_flow(ctx, Sock_pton("127.0.0.1:1234"), NULL, NULL, IPPROTO_TCP, 100, NULL))!=NULL); pcp_flow_set_prefer_failure_opt(f2); pcp_flow_set_prefer_failure_opt(f2); pcp_flow_set_lifetime(f1, 1000); TEST((f1->lifetime)>=99); TEST((f1->timeout.tv_sec>0)||(f1->timeout.tv_usec>0)); f1->timeout.tv_sec=0; f1->timeout.tv_usec=0; pcp_flow_set_lifetime(f1, 0); TEST(f1->lifetime==0); TEST((f1->timeout.tv_sec>0)||(f1->timeout.tv_usec>0)); pcp_set_3rd_party_opt(f1,NULL); printf("Tests succeeded.\n\n"); PD_SOCKET_CLEANUP(); return 0; }