static void ice_on_ice_complete(pj_ice_strans *ice_st, pj_ice_strans_op op, pj_status_t status) { struct ice_ept *ept; ept = (struct ice_ept*) pj_ice_strans_get_user_data(ice_st); switch (op) { case PJ_ICE_STRANS_OP_INIT: ept->result.init_status = status; if (status != PJ_SUCCESS && (ept->cfg.client_flag & DEL_ON_ERR)) { pj_ice_strans_destroy(ice_st); ept->ice = NULL; } break; case PJ_ICE_STRANS_OP_NEGOTIATION: ept->result.nego_status = status; break; case PJ_ICE_STRANS_OP_KEEP_ALIVE: /* keep alive failed? */ break; default: pj_assert(!"Unknown op"); } }
static void ice_on_ice_complete(pj_ice_strans *ice_st, pj_ice_strans_op op, pj_status_t result) { struct transport_ice *tp_ice; tp_ice = (struct transport_ice*) pj_ice_strans_get_user_data(ice_st); /* Notify application */ if (tp_ice->cb.on_ice_complete) (*tp_ice->cb.on_ice_complete)(&tp_ice->base, op, result); }
static void krx_ice_on_complete(pj_ice_strans* icest, pj_ice_strans_op op, pj_status_t status) { printf("----------------- ice complete -------------------------- \n"); krx_ice* k = (krx_ice*)pj_ice_strans_get_user_data(icest); if(!k) { printf("Error: complete but no krx_ice* user data found.\n"); return; } krx_ice_start_session(k); }
static void ice_on_rx_data(pj_ice_strans *ice_st, unsigned comp_id, void *pkt, pj_size_t size, const pj_sockaddr_t *src_addr, unsigned src_addr_len) { struct ice_ept *ept; PJ_UNUSED_ARG(pkt); PJ_UNUSED_ARG(size); PJ_UNUSED_ARG(src_addr); PJ_UNUSED_ARG(src_addr_len); ept = (struct ice_ept*) pj_ice_strans_get_user_data(ice_st); ept->result.rx_cnt[comp_id]++; }
static void ice_on_rx_data(pj_ice_strans *ice_st, unsigned comp_id, void *pkt, pj_size_t size, const pj_sockaddr_t *src_addr, unsigned src_addr_len) { struct transport_ice *tp_ice; tp_ice = (struct transport_ice*) pj_ice_strans_get_user_data(ice_st); if (comp_id==1 && tp_ice->rtp_cb) { /* Simulate packet lost on RX direction */ if (tp_ice->rx_drop_pct) { if ((pj_rand() % 100) <= (int)tp_ice->rx_drop_pct) { PJ_LOG(5,(tp_ice->base.name, "RX RTP packet dropped because of pkt lost " "simulation")); return; } } (*tp_ice->rtp_cb)(tp_ice->stream, pkt, size); /* See if source address of RTP packet is different than the * configured address, and switch RTP remote address to * source packet address after several consecutive packets * have been received. */ if (!tp_ice->use_ice) { /* Increment counter and avoid zero */ if (++tp_ice->rtp_src_cnt == 0) tp_ice->rtp_src_cnt = 1; if (pj_sockaddr_cmp(&tp_ice->remote_rtp, src_addr) != 0) { /* Check if the source address is recognized. */ if (pj_sockaddr_cmp(src_addr, &tp_ice->rtp_src_addr) != 0) { /* Remember the new source address. */ pj_sockaddr_cp(&tp_ice->rtp_src_addr, src_addr); /* Reset counter */ tp_ice->rtp_src_cnt = 0; } if ((tp_ice->options & PJMEDIA_ICE_NO_SRC_ADDR_CHECKING)==0 && tp_ice->rtp_src_cnt >= PJMEDIA_RTP_NAT_PROBATION_CNT) { char addr_text[80]; /* Set remote RTP address to source address */ pj_sockaddr_cp(&tp_ice->remote_rtp, &tp_ice->rtp_src_addr); tp_ice->addr_len = pj_sockaddr_get_len(&tp_ice->remote_rtp); /* Reset counter */ tp_ice->rtp_src_cnt = 0; PJ_LOG(4,(tp_ice->base.name, "Remote RTP address switched to %s", pj_sockaddr_print(&tp_ice->remote_rtp, addr_text, sizeof(addr_text), 3))); /* Also update remote RTCP address if actual RTCP source * address is not heard yet. */ if (!pj_sockaddr_has_addr(&tp_ice->rtcp_src_addr)) { pj_uint16_t port; pj_sockaddr_cp(&tp_ice->remote_rtcp, &tp_ice->remote_rtp); port = (pj_uint16_t) (pj_sockaddr_get_port(&tp_ice->remote_rtp)+1); pj_sockaddr_set_port(&tp_ice->remote_rtcp, port); PJ_LOG(4,(tp_ice->base.name, "Remote RTCP address switched to %s", pj_sockaddr_print(&tp_ice->remote_rtcp, addr_text, sizeof(addr_text), 3))); } } } } } else if (comp_id==2 && tp_ice->rtcp_cb) { (*tp_ice->rtcp_cb)(tp_ice->stream, pkt, size); /* Check if RTCP source address is the same as the configured * remote address, and switch the address when they are * different. */ if (!tp_ice->use_ice && pj_sockaddr_cmp(&tp_ice->remote_rtcp, src_addr) != 0) { pj_sockaddr_cp(&tp_ice->rtcp_src_addr, src_addr); if ((tp_ice->options & PJMEDIA_ICE_NO_SRC_ADDR_CHECKING)==0) { char addr_text[80]; pj_sockaddr_cp(&tp_ice->remote_rtcp, src_addr); pj_assert(tp_ice->addr_len == pj_sockaddr_get_len(src_addr)); PJ_LOG(4,(tp_ice->base.name, "Remote RTCP address switched to %s", pj_sockaddr_print(&tp_ice->remote_rtcp, addr_text, sizeof(addr_text), 3))); } } } PJ_UNUSED_ARG(src_addr_len); }