亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ice_strans.c

?? 一個開源的sip源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
    comp = ice_st->comp[comp_id-1];
    return add_cand(ice_st, comp, comp_id, type, local_pref, addr, 
		    set_default);
}


PJ_DEF(pj_status_t) pj_ice_strans_get_comps_status(pj_ice_strans *ice_st)
{
    unsigned i;
    pj_status_t worst = PJ_SUCCESS;

    for (i=0; i<ice_st->comp_cnt; ++i) {
	pj_ice_strans_comp *comp = ice_st->comp[i];

	if (comp->last_status == PJ_SUCCESS) {
	    /* okay */
	} else if (comp->pending_cnt && worst==PJ_SUCCESS) {
	    worst = PJ_EPENDING;
	    break;
	} else if (comp->last_status != PJ_SUCCESS) {
	    worst = comp->last_status;
	    break;
	}

	if (worst != PJ_SUCCESS)
	    break;
    }

    return worst;
}

/*
 * Create ICE!
 */
PJ_DEF(pj_status_t) pj_ice_strans_init_ice(pj_ice_strans *ice_st,
					   pj_ice_sess_role role,
					   const pj_str_t *local_ufrag,
					   const pj_str_t *local_passwd)
{
    pj_status_t status;
    unsigned i;
    pj_ice_sess_cb ice_cb;
    const pj_uint8_t srflx_prio[4] = { 100, 126, 110, 0 };

    /* Check arguments */
    PJ_ASSERT_RETURN(ice_st, PJ_EINVAL);
    /* Must not have ICE */
    PJ_ASSERT_RETURN(ice_st->ice == NULL, PJ_EINVALIDOP);
    /* Components must have been created */
    PJ_ASSERT_RETURN(ice_st->comp[0] != NULL, PJ_EINVALIDOP);

    /* Init callback */
    pj_bzero(&ice_cb, sizeof(ice_cb));
    ice_cb.on_ice_complete = &on_ice_complete;
    ice_cb.on_rx_data = &ice_rx_data;
    ice_cb.on_tx_pkt = &ice_tx_pkt;

    /* Create! */
    status = pj_ice_sess_create(&ice_st->stun_cfg, ice_st->obj_name, role,
			        ice_st->comp_cnt, &ice_cb, 
			        local_ufrag, local_passwd, &ice_st->ice);
    if (status != PJ_SUCCESS)
	return status;

    /* Associate user data */
    ice_st->ice->user_data = (void*)ice_st;

    /* If default candidate for components are SRFLX one, upload a custom
     * type priority to ICE session so that SRFLX candidates will get
     * checked first.
     */
    if (ice_st->comp[0]->default_cand >= 0 &&
	ice_st->comp[0]->cand_list[ice_st->comp[0]->default_cand].type 
	    == PJ_ICE_CAND_TYPE_SRFLX)
    {
	pj_ice_sess_set_prefs(ice_st->ice, srflx_prio);
    }


    /* Add candidates */
    for (i=0; i<ice_st->comp_cnt; ++i) {
	unsigned j;
	pj_ice_strans_comp *comp= ice_st->comp[i];

	for (j=0; j<comp->cand_cnt; ++j) {
	    pj_ice_strans_cand *cand = &comp->cand_list[j];

	    /* Skip if candidate is not ready */
	    if (cand->status != PJ_SUCCESS) {
		PJ_LOG(5,(ice_st->obj_name, 
			  "Candidate %d in component %d is not added",
			  j, i));
		continue;
	    }

	    status = pj_ice_sess_add_cand(ice_st->ice, comp->comp_id, 
					  cand->type, cand->local_pref, 
					  &cand->foundation, &cand->addr, 
					  &comp->local_addr, NULL, 
					  sizeof(pj_sockaddr_in), 
					  (unsigned*)&cand->ice_cand_id);
	    if (status != PJ_SUCCESS)
		goto on_error;
	}
    }

    return PJ_SUCCESS;

on_error:
    pj_ice_strans_stop_ice(ice_st);
    return status;
}

/*
 * Enum candidates
 */
PJ_DEF(pj_status_t) pj_ice_strans_enum_cands(pj_ice_strans *ice_st,
					 unsigned *count,
					 pj_ice_sess_cand cand[])
{
    unsigned i, cnt;
    pj_ice_sess_cand *pcand;

    PJ_ASSERT_RETURN(ice_st && count && cand, PJ_EINVAL);
    PJ_ASSERT_RETURN(ice_st->ice, PJ_EINVALIDOP);

    cnt = ice_st->ice->lcand_cnt;
    cnt = (cnt > *count) ? *count : cnt;
    *count = 0;

    for (i=0; i<cnt; ++i) {
	pcand = &ice_st->ice->lcand[i];
	pj_memcpy(&cand[i], pcand, sizeof(pj_ice_sess_cand));
    }

    *count = cnt;
    return PJ_SUCCESS;
}

/*
 * Start ICE processing !
 */
PJ_DEF(pj_status_t) pj_ice_strans_start_ice( pj_ice_strans *ice_st,
					     const pj_str_t *rem_ufrag,
					     const pj_str_t *rem_passwd,
					     unsigned rem_cand_cnt,
					     const pj_ice_sess_cand rem_cand[])
{
    pj_status_t status;

    status = pj_ice_sess_create_check_list(ice_st->ice, rem_ufrag, rem_passwd,
					   rem_cand_cnt, rem_cand);
    if (status != PJ_SUCCESS)
	return status;

    status = pj_ice_sess_start_check(ice_st->ice);
    if (status != PJ_SUCCESS) {
	pj_ice_strans_stop_ice(ice_st);
    }

    return status;
}

/*
 * Stop ICE!
 */
PJ_DECL(pj_status_t) pj_ice_strans_stop_ice(pj_ice_strans *ice_st)
{
    unsigned i;

    if (ice_st->ice) {
	pj_ice_sess_destroy(ice_st->ice);
	ice_st->ice = NULL;
    }

    /* Invalidate all candidate Ids */
    for (i=0; i<ice_st->comp_cnt; ++i) {
	unsigned j;
	for (j=0; j<ice_st->comp[i]->cand_cnt; ++j) {
	    ice_st->comp[i]->cand_list[j].ice_cand_id = -1;
	}
    }

    return PJ_SUCCESS;
}

/*
 * Send packet using non-ICE means (e.g. when ICE was not negotiated).
 */
PJ_DEF(pj_status_t) pj_ice_strans_sendto( pj_ice_strans *ice_st,
					  unsigned comp_id,
					  const void *data,
					  pj_size_t data_len,
					  const pj_sockaddr_t *dst_addr,
					  int dst_addr_len)
{
    pj_ssize_t pkt_size;
    pj_ice_strans_comp *comp;
    pj_status_t status;

    PJ_ASSERT_RETURN(ice_st && comp_id && comp_id <= ice_st->comp_cnt &&
		     dst_addr && dst_addr_len, PJ_EINVAL);

    comp = ice_st->comp[comp_id-1];

    /* If ICE is available, send data with ICE */
    if (ice_st->ice) {
	return pj_ice_sess_send_data(ice_st->ice, comp_id, data, data_len);
    }

    /* Otherwise send direcly with the socket. This is for compatibility
     * with remote that doesn't support ICE.
     */
    pkt_size = data_len;
    status = pj_ioqueue_sendto(comp->key, &comp->write_op, 
			       data, &pkt_size, 0,
			       dst_addr, dst_addr_len);
    
    return (status==PJ_SUCCESS||status==PJ_EPENDING) ? PJ_SUCCESS : status;
}

/*
 * Callback called by ICE session when ICE processing is complete, either
 * successfully or with failure.
 */
static void on_ice_complete(pj_ice_sess *ice, pj_status_t status)
{
    pj_ice_strans *ice_st = (pj_ice_strans*)ice->user_data;
    if (ice_st->cb.on_ice_complete) {
	(*ice_st->cb.on_ice_complete)(ice_st, status);
    }
}

/*
 * Callback called by ICE session when it wants to send outgoing packet.
 */
static pj_status_t ice_tx_pkt(pj_ice_sess *ice, 
			      unsigned comp_id, 
			      const void *pkt, pj_size_t size,
			      const pj_sockaddr_t *dst_addr,
			      unsigned dst_addr_len)
{
    pj_ice_strans *ice_st = (pj_ice_strans*)ice->user_data;
    pj_ice_strans_comp *comp = NULL;
    pj_ssize_t pkt_size;
    pj_status_t status;

    PJ_TODO(TX_TO_RELAY);

    PJ_ASSERT_RETURN(comp_id && comp_id <= ice_st->comp_cnt, PJ_EINVAL);
    comp = ice_st->comp[comp_id-1];

    TRACE_PKT((comp->ice_st->obj_name, 
	      "Component %d TX packet to %s:%d",
	      comp_id,
	      pj_inet_ntoa(((pj_sockaddr_in*)dst_addr)->sin_addr),
	      (int)pj_ntohs(((pj_sockaddr_in*)dst_addr)->sin_port)));

    pkt_size = size;
    status = pj_ioqueue_sendto(comp->key, &comp->write_op, 
			       pkt, &pkt_size, 0,
			       dst_addr, dst_addr_len);
    
    return (status==PJ_SUCCESS||status==PJ_EPENDING) ? PJ_SUCCESS : status;
}

/*
 * Callback called by ICE session when it receives application data.
 */
static void ice_rx_data(pj_ice_sess *ice, 
		        unsigned comp_id, 
		        void *pkt, pj_size_t size,
		        const pj_sockaddr_t *src_addr,
		        unsigned src_addr_len)
{
    pj_ice_strans *ice_st = (pj_ice_strans*)ice->user_data;

    if (ice_st->cb.on_rx_data) {
	(*ice_st->cb.on_rx_data)(ice_st, comp_id, pkt, size, 
				 src_addr, src_addr_len);
    }
}

/*
 * Callback called by STUN session to send outgoing packet.
 */
static pj_status_t stun_on_send_msg(pj_stun_session *sess,
				    const void *pkt,
				    pj_size_t size,
				    const pj_sockaddr_t *dst_addr,
				    unsigned dst_addr_len)
{
    pj_ice_strans_comp *comp;
    pj_ssize_t pkt_size;
    pj_status_t status;

    comp = (pj_ice_strans_comp*) pj_stun_session_get_user_data(sess);
    pkt_size = size;
    status = pj_ioqueue_sendto(comp->key, &comp->write_op, 
			       pkt, &pkt_size, 0,
			       dst_addr, dst_addr_len);
    
    return (status==PJ_SUCCESS||status==PJ_EPENDING) ? PJ_SUCCESS : status;
}

/*
 * Callback sent by STUN session when outgoing STUN request has
 * completed.
 */
static void stun_on_request_complete(pj_stun_session *sess,
				     pj_status_t status,
				     pj_stun_tx_data *tdata,
				     const pj_stun_msg *response,
				     const pj_sockaddr_t *src_addr,
				     unsigned src_addr_len)
{
    pj_ice_strans_comp *comp;
    pj_ice_strans_cand *cand = NULL;
    pj_stun_xor_mapped_addr_attr *xa;
    pj_stun_mapped_addr_attr *ma;
    pj_sockaddr *mapped_addr;

    comp = (pj_ice_strans_comp*) pj_stun_session_get_user_data(sess);
    cand = (pj_ice_strans_cand*) tdata->user_data;

    PJ_UNUSED_ARG(src_addr);
    PJ_UNUSED_ARG(src_addr_len);

    if (cand == NULL) {
	/* This is keep-alive */
	if (status != PJ_SUCCESS) {
	    ice_st_perror(comp->ice_st, "STUN keep-alive request failed",
			  status);
	}
	return;
    }

    /* Decrement pending count for this component */
    pj_assert(comp->pending_cnt > 0);
    comp->pending_cnt--;

    if (status != PJ_SUCCESS) {
	comp->last_status = cand->status = status;
	ice_st_perror(comp->ice_st, "STUN Binding request failed", 
		      cand->status);
	return;
    }

    xa = (pj_stun_xor_mapped_addr_attr*)
	 pj_stun_msg_find_attr(response, PJ_STUN_ATTR_XOR_MAPPED_ADDR, 0);
    ma = (pj_stun_mapped_addr_attr*)
	 pj_stun_msg_find_attr(response, PJ_STUN_ATTR_MAPPED_ADDR, 0);

    if (xa)
	mapped_addr = &xa->sockaddr;
    else if (ma)
	mapped_addr = &ma->sockaddr;
    else {
	cand->status = PJNATH_ESTUNNOMAPPEDADDR;
	ice_st_perror(comp->ice_st, "STUN Binding request failed", 
		      cand->status);
	return;
    }

    PJ_LOG(4,(comp->ice_st->obj_name, 
	      "STUN mapped address: %s:%d",
	      pj_inet_ntoa(mapped_addr->ipv4.sin_addr),
	      (int)pj_ntohs(mapped_addr->ipv4.sin_port)));
    pj_memcpy(&cand->addr, mapped_addr, sizeof(pj_sockaddr_in));
    cand->status = PJ_SUCCESS;

    /* Set this candidate as the default candidate */
    comp->default_cand = (cand - comp->cand_list);
    comp->last_status = PJ_SUCCESS;

    /* We have STUN, so we must start the keep-alive timer */
    start_ka_timer(comp->ice_st);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av在线播放网址| 2019国产精品| 国产欧美视频一区二区| 天天射综合影视| 99久久精品国产一区| 精品日韩欧美在线| 五月综合激情婷婷六月色窝| 97se狠狠狠综合亚洲狠狠| 日韩一区二区三区在线视频| 亚洲亚洲人成综合网络| gogogo免费视频观看亚洲一| 精品少妇一区二区三区日产乱码| 怡红院av一区二区三区| 不卡的av中国片| 久久久国产一区二区三区四区小说| 亚洲国产成人porn| 欧美在线影院一区二区| 亚洲欧美日韩一区二区| www.欧美精品一二区| 国产三级三级三级精品8ⅰ区| 日韩不卡在线观看日韩不卡视频| 欧美系列一区二区| 一区二区三区四区不卡在线| 99久久久久免费精品国产| 久久日一线二线三线suv| 日本91福利区| 777午夜精品视频在线播放| 亚洲国产成人av| 欧美老年两性高潮| 午夜精品久久久久久| 精品视频999| 亚洲第一久久影院| 欧美精三区欧美精三区| 秋霞成人午夜伦在线观看| 91精品国产综合久久国产大片| 亚洲线精品一区二区三区| 欧美三电影在线| 日本系列欧美系列| 欧美xxxxxxxx| 国产成人亚洲综合a∨猫咪| 国产人成亚洲第一网站在线播放| 国产精品自拍三区| 国产精品久久久久久亚洲毛片| 成a人片亚洲日本久久| 亚洲欧美在线aaa| 色老头久久综合| 亚洲gay无套男同| 欧美一二区视频| 国产综合色产在线精品 | 成人精品一区二区三区四区| 国产免费成人在线视频| 成人国产亚洲欧美成人综合网| 亚洲欧美另类图片小说| 欧美精品在线一区二区三区| 国内精品免费**视频| 国产精品久久久99| 欧美色图片你懂的| 国内精品伊人久久久久影院对白| 久久久久9999亚洲精品| 一本在线高清不卡dvd| 亚洲成a人v欧美综合天堂下载| 精品久久久久久久人人人人传媒| 成人福利视频网站| 亚洲综合视频在线观看| 26uuu亚洲婷婷狠狠天堂| 99国产精品久久| 全国精品久久少妇| 亚洲人精品午夜| 日韩欧美一级特黄在线播放| 成人av一区二区三区| 天堂成人免费av电影一区| 国产女主播一区| 7777精品伊人久久久大香线蕉 | 欧美影片第一页| 国产一区欧美日韩| 亚洲综合色自拍一区| 久久久久久久久久久久久夜| 在线免费不卡电影| 成人小视频在线| 免费看日韩精品| 亚洲乱码中文字幕| 国产丝袜美腿一区二区三区| 欧美日韩黄色一区二区| 成人av片在线观看| 国产一区二区三区国产| 午夜激情一区二区| 亚洲激情中文1区| 国产精品无遮挡| 精品国产91亚洲一区二区三区婷婷| 91亚洲国产成人精品一区二区三| 另类欧美日韩国产在线| 亚洲中国最大av网站| 亚洲视频中文字幕| 日本一区二区三区视频视频| 欧美电视剧在线看免费| 欧美色成人综合| 日本高清不卡视频| 99国产欧美另类久久久精品 | 三级在线观看一区二区 | 在线观看亚洲成人| 99视频在线精品| 高清国产一区二区三区| 国内不卡的二区三区中文字幕 | 在线观看免费亚洲| 91免费版在线| 91天堂素人约啪| www.欧美日韩| 91亚洲精品久久久蜜桃| a4yy欧美一区二区三区| 99久久久无码国产精品| 不卡一区二区在线| 99久久99久久综合| 91影院在线观看| 91免费国产在线观看| 91亚洲国产成人精品一区二区三 | 日韩欧美资源站| 日韩精品一区二区三区中文不卡| 在线不卡a资源高清| 欧美伦理电影网| 日韩欧美成人一区二区| 久久综合av免费| 国产欧美中文在线| 亚洲色图丝袜美腿| 一区二区三区国产豹纹内裤在线| 亚洲欧美日韩系列| 亚洲不卡一区二区三区| 麻豆一区二区99久久久久| 国内精品伊人久久久久av一坑| 国产精品一区久久久久| 成人性生交大合| 欧美主播一区二区三区| 日韩一区二区在线看片| 2020国产精品| 亚洲乱码日产精品bd| 午夜精品久久久久| 国产精品一品视频| 在线亚洲精品福利网址导航| 制服丝袜国产精品| 日本一区免费视频| 亚洲大片免费看| 久久97超碰色| 一本色道综合亚洲| 日韩一级高清毛片| 国产精品毛片高清在线完整版| 一区二区三区欧美激情| 久久精品99久久久| 色综合久久88色综合天天6| 91精品国产入口在线| 91亚洲精华国产精华精华液| 欧美日韩国产一区二区三区地区| www国产成人免费观看视频 深夜成人网| 亚洲乱码中文字幕综合| 国产成人aaa| 中文字幕精品—区二区四季| 成人免费毛片片v| 久久久久久久综合狠狠综合| 日日欢夜夜爽一区| 欧美成人福利视频| 亚洲成a天堂v人片| 国产九色sp调教91| 欧美在线观看一区| 久久综合丝袜日本网| 亚洲一区影音先锋| 风间由美一区二区av101| 欧美日韩1234| 国产精品伦一区二区三级视频| 午夜视频一区二区| av不卡一区二区三区| 精品国产伦一区二区三区观看方式| 日韩理论片中文av| 国产最新精品精品你懂的| 欧美日韩三级在线| 中文字幕电影一区| 美国精品在线观看| 欧美日韩夫妻久久| 一区二区三区在线观看国产| 国产精品一区一区| 亚洲一二三区不卡| 国产欧美一区二区三区在线老狼| 日韩亚洲国产中文字幕欧美| 亚洲综合视频在线观看| 成人av网站在线观看免费| 精品国内二区三区| 日本免费在线视频不卡一不卡二 | 亚洲成人自拍一区| 99久久国产免费看| 国产视频一区二区三区在线观看| 日本女人一区二区三区| 欧美日韩高清影院| 亚洲午夜av在线| 91蜜桃视频在线| 亚洲欧洲性图库| 99久久国产综合色|国产精品| 国产偷国产偷精品高清尤物| 国内外精品视频| 久久亚洲捆绑美女| 风间由美一区二区三区在线观看| 国产视频一区二区在线观看| 国产伦精一区二区三区| 久久久久久一二三区|