static pcp_fstate_e test_wait(pcp_flow_t* flow, int timeout) { fd_set read_fds; int fdmax; struct timeval tout_end; struct timeval tout_select; int nflow_exit_states = pcp_eval_flow_state(flow, NULL); pcp_ctx_t *ctx = flow->ctx; gettimeofday(&tout_end, NULL); tout_end.tv_usec += (timeout * 1000) % 1000000; tout_end.tv_sec += tout_end.tv_usec / 1000000; tout_end.tv_usec = tout_end.tv_usec % 1000000; tout_end.tv_sec += timeout / 1000; fdmax = 0; FD_ZERO(&read_fds); // main loop for (;;) { pcp_fstate_e ret_state; // check expiration of wait timeout struct timeval ctv; gettimeofday(&ctv, NULL); if ((timeval_subtract(&tout_select, &tout_end, &ctv)) || ((tout_select.tv_sec == 0) && (tout_select.tv_usec == 0)) || (tout_select.tv_sec < 0)) { return pcp_state_processing; } //process all events and get timeout value for next select pcp_pulse(ctx, &tout_select); // check flow for reaching one of exit from wait states // (also handles case when flow is MAP for 0.0.0.0) if (pcp_eval_flow_state(flow, &ret_state) > nflow_exit_states) { return ret_state; } FD_ZERO(&read_fds); fdmax = pcp_get_socket(ctx); FD_SET(fdmax, &read_fds); fdmax++; select(fdmax, &read_fds, NULL, NULL, &tout_select); } return pcp_state_succeeded; }
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; }