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

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

?? mld6igmp_group_record.cc

?? MLDv2 support igmpv3 lite
?? CC
?? 第 1 頁 / 共 3 頁
字號:
   	return;    }    if (is_asm_mode()) {	//	// Router State: EXCLUDE (X, Y)	// Report Received: BLOCK (A)	// New Router State: EXCLUDE (X + (A - Y), Y)	// Actions: (A - X - Y) = Group Timer	//          Send Q(G, A - Y)	//	Mld6igmpSourceSet& a = _do_forward_sources;	TimeVal gt;	_group_timer.time_remaining(gt);	const set<IPvX>& b = sources;	Mld6igmpSourceSet a_and_b= a * b;	// Send Q(G, A - Y) with a_minus_y	_mld6igmp_vif.mld6igmp_group_source_query_send(	    group(),	    a_and_b.extract_source_addresses(),	    dummy_error_msg);	calculate_forwarding_changes(old_is_include_mode,				     old_do_forward_sources);	return;    }}/** * Lower the group timer. * * @param timeval the timeout interval the timer should be lowered to. */voidMld6igmpGroupRecord::lower_group_timer(const TimeVal& timeval){    TimeVal timeval_remaining;    //    // Lower the group timer    //    _group_timer.time_remaining(timeval_remaining);    if (timeval < timeval_remaining) {	_group_timer = eventloop().new_oneoff_after(	    timeval,	    callback(this, &Mld6igmpGroupRecord::group_timer_timeout));    }}/** * Lower the source timer for a set of sources. * * @param sources the source addresses. * @param timeval the timeout interval the timer should be lowered to. */voidMld6igmpGroupRecord::lower_source_timer(const set<IPvX>& sources,					 const TimeVal& timeval){    //    // Lower the source timer    //    _do_forward_sources.lower_source_timer(sources, timeval);}/** * Take the appropriate actions for a source that has expired. * * @param source_record the source record that has expired. */voidMld6igmpGroupRecord::source_expired(Mld6igmpSourceRecord* source_record){    Mld6igmpSourceSet::iterator iter;    // Erase the source record from the appropriate source set    iter = _do_forward_sources.find(source_record->source());    XLOG_ASSERT(iter != _do_forward_sources.end());    _do_forward_sources.erase(iter);    if (is_include_mode()) {	// notify routing (-)	mld6igmp_vif().join_prune_notify_routing(source_record->source(),						 group(),						 ACTION_PRUNE);	// Delete the source record	delete source_record;	// If no more source records, then delete the group record	if (_do_forward_sources.empty()) {	    mld6igmp_vif().group_records().erase(group());	    delete this;	}	return;    }    if (is_asm_mode()) {	// notify routing (-)	//	// XXX: Note that we send a PRUNE twice: the first one to remove the	// original JOIN for the source, and the second one to create	// PRUNE state for the source.	//	mld6igmp_vif().join_prune_notify_routing(source_record->source(),						 group(),						 ACTION_PRUNE);	delete source_record;	return;    }}/** * Get the number of seconds until the group timer expires. *  * @return the number of seconds until the group timer expires. */uint32_tMld6igmpGroupRecord::timeout_sec() const{    TimeVal tv;        _group_timer.time_remaining(tv);        return (tv.sec());}/** * Timeout: the group timer has expired. */voidMld6igmpGroupRecord::group_timer_timeout(){    if (is_include_mode()) {	// XXX: Nothing to do when in INCLUDE mode.	if (_do_forward_sources.empty()) {	    mld6igmp_vif().join_prune_notify_routing(IPvX::ZERO(family()),						     group(),						     ACTION_PRUNE);	    mld6igmp_vif().group_records().erase(group());	    delete this;	} else {	    mld6igmp_vif().join_prune_notify_routing(IPvX::ZERO(family()),						     group(),						     ACTION_PRUNE);	}	return;    }    if (is_asm_mode()) {	// notify routing (-)	mld6igmp_vif().join_prune_notify_routing(IPvX::ZERO(family()),						 group(),						 ACTION_PRUNE);	if (! _do_forward_sources.empty()) {	    // Transition to INCLUDE mode	    return;	}	//	// No sources with running source timers.	// Delete the group record and return immediately.	//	mld6igmp_vif().group_records().erase(group());	delete this;	return;    }}/** * Schedule periodic Group-Specific and Group-and-Source-Specific Query * retransmission. * * If the sources list is empty, we schedule Group-Specific Query, * otherwise we schedule Group-and-Source-Specific Query. * * @param sources the source addresses. */voidMld6igmpGroupRecord::schedule_periodic_group_query(const set<IPvX>& sources){    Mld6igmpSourceSet::iterator source_iter;    size_t count = _mld6igmp_vif.last_member_query_count() - 1;    if (_mld6igmp_vif.last_member_query_count() == 0)	return;    if (_mld6igmp_vif.query_last_member_interval().get() == TimeVal::ZERO())	return;    //    // Set the count for query retransmissions    //    if (sources.empty()) {	//	// Set the count for Group-Specific Query retransmission	//	_query_retransmission_count = count;    } else {	//	// Set the count for Group-and-Source-Specific Query retransmission	//	set<IPvX>::const_iterator ipvx_iter;	for (ipvx_iter = sources.begin();	     ipvx_iter != sources.end();	     ++ipvx_iter) {	    const IPvX& ipvx = *ipvx_iter;	    Mld6igmpSourceRecord* source_record = find_do_forward_source(ipvx);	    if (source_record == NULL)		continue;	    source_record->set_query_retransmission_count(count);	}    }    //    // Set the periodic timer for SSM Group-Specific and    // Group-and-Source-Specific Queries.    //    // Note that we set the timer only if it wasn't running already.    //    if (! _group_query_timer.scheduled()) {	_group_query_timer = eventloop().new_periodic(	    _mld6igmp_vif.query_last_member_interval().get(),	    callback(this, &Mld6igmpGroupRecord::group_query_periodic_timeout));    }}/** * Periodic timeout: time to send the next Group-Specific and * Group-and-Source-Specific Queries. * * @return true if the timer should be scheduled again, otherwise false. */boolMld6igmpGroupRecord::group_query_periodic_timeout(){    string dummy_error_msg;    bool s_flag = false;    set<IPvX> no_sources;		// XXX: empty set    set<IPvX> sources_with_s_flag;    set<IPvX> sources_without_s_flag;    Mld6igmpSourceSet::iterator source_iter;    TimeVal max_resp_time = mld6igmp_vif().query_last_member_interval().get();    bool do_send_group_query = true;    //    // XXX: Don't send Group-Specific or Group-and-Source-Specific Queries    // for entries that are in IGMPv1 mode.    //    if (is_igmpv1_mode())	return (false);    //    // XXX: The IGMPv3/MLDv2 spec doesn't say what to do here if we changed    // from a Querier to a non-Querier.    // However, the IGMPv2 spec says that Querier to non-Querier transitions    // are to be ignored (see the bottom part of Section 3 of RFC 2236).    // Hence, for this reason and for robustness purpose we send the Query    // messages without taking into account any Querier to non-Querier    // transitions.    //    //    // Send the Group-Specific Query message    //    if (_query_retransmission_count == 0) {	do_send_group_query = false;	// No more queries to send    } else {	_query_retransmission_count--;	//	// Calculate the group-specific "Suppress Router-Side Processing" bit	//	TimeVal timeval_remaining;	group_timer().time_remaining(timeval_remaining);	if (timeval_remaining > _mld6igmp_vif.last_member_query_time())	    s_flag = true;	_mld6igmp_vif.mld6igmp_query_send(mld6igmp_vif().primary_addr(),					  group(),					  max_resp_time,					  group(),					  no_sources,					  s_flag,					  dummy_error_msg);    }    //    // Select all the sources that should be queried, and add them to    // the appropriate set.    //    for (source_iter = _do_forward_sources.begin();	 source_iter != _do_forward_sources.end();	 ++source_iter) {	Mld6igmpSourceRecord* source_record = source_iter->second;	size_t count = source_record->query_retransmission_count();	bool s_flag = false;	if (count == 0)	    continue;	source_record->set_query_retransmission_count(count - 1);	//	// Calculate the "Suppress Router-Side Processing" bit	//	TimeVal timeval_remaining;	source_record->source_timer().time_remaining(timeval_remaining);	if (timeval_remaining > _mld6igmp_vif.last_member_query_time())	    s_flag = true;	if (s_flag)	    sources_with_s_flag.insert(source_record->source());	else	    sources_without_s_flag.insert(source_record->source());    }    //    // Send the Group-and-Source-Specific Query messages    //    if ((! sources_with_s_flag.empty()) && (! do_send_group_query)) {	//	// According to RFC 3376, Section 6.6.3.2:	// "If a group specific query is scheduled to be transmitted at the	// same time as a group and source specific query for the same group,	// then transmission of the group and source specific message with the	// "Suppress Router-Side Processing" bit set may be suppressed."	//	// The corresponding text from RFC 3810, Section 7.6.3.2 is similar.	//	_mld6igmp_vif.mld6igmp_query_send(mld6igmp_vif().primary_addr(),					  group(),					  max_resp_time,					  group(),					  sources_with_s_flag,					  true,		// XXX: set the s_flag					  dummy_error_msg);    }    if (! sources_without_s_flag.empty()) {	_mld6igmp_vif.mld6igmp_query_send(mld6igmp_vif().primary_addr(),					  group(),					  max_resp_time,					  group(),					  sources_without_s_flag,					  false,       // XXX: reset the s_flag					  dummy_error_msg);    }    if (sources_with_s_flag.empty()	&& sources_without_s_flag.empty()	&& (! do_send_group_query)) {	return (false);			// No more queries to send    }    return (true);		// Schedule the next timeout}/** * Record that an older Membership report message has been received. * * @param message_version the corresponding protocol version of the * received message. */voidMld6igmpGroupRecord::received_older_membership_report(int message_version){    TimeVal timeval = _mld6igmp_vif.older_version_host_present_interval();    if (_mld6igmp_vif.proto_is_igmp()) {	switch (message_version) {	case IGMP_V1:	    if (_mld6igmp_vif.is_igmpv2_mode()) {		//		// XXX: The value specified in RFC 2236 is different from		// the value specified in RFC 3376.		//		timeval = _mld6igmp_vif.group_membership_interval();	    }	    _igmpv1_host_present_timer = eventloop().new_oneoff_after(		timeval,		callback(this, &Mld6igmpGroupRecord::older_version_host_present_timer_timeout));	    break;	case IGMP_V2:	    _igmpv2_mldv1_host_present_timer = eventloop().new_oneoff_after(		timeval,		callback(this, &Mld6igmpGroupRecord::older_version_host_present_timer_timeout));	    break;	default:	    break;	}    }    if (_mld6igmp_vif.proto_is_mld6()) {	switch (message_version) {	case MLD_V1:	    _igmpv2_mldv1_host_present_timer = eventloop().new_oneoff_after(		timeval,		callback(this, &Mld6igmpGroupRecord::older_version_host_present_timer_timeout));	    break;	default:	    break;	}    }}voidMld6igmpGroupRecord::older_version_host_present_timer_timeout(){    // XXX: nothing to do}/** * Test if the group is running in IGMPv1 mode. * * @return true if the group is running in IGMPv1 mode, otherwise false. */boolMld6igmpGroupRecord::is_igmpv1_mode() const{    if (! _mld6igmp_vif.proto_is_igmp())	return (false);    if (_mld6igmp_vif.is_igmpv1_mode())	return (true);		// XXX: explicitly configured in IGMPv1 mode    return (_igmpv1_host_present_timer.scheduled());}/** * Test if the group is running in IGMPv2 mode. * * @return true if the group is running in IGMPv2 mode, otherwise false. */boolMld6igmpGroupRecord::is_igmpv2_mode() const{    if (! _mld6igmp_vif.proto_is_igmp())	return (false);    if (is_igmpv1_mode())	return (false);    return (_igmpv2_mldv1_host_present_timer.scheduled());}/** * Test if the group is running in IGMPv3 mode. * * @return true if the group is running in IGMPv3 mode, otherwise false. */boolMld6igmpGroupRecord::is_igmpv3_mode() const{    if (! _mld6igmp_vif.proto_is_igmp())	return (false);    if (is_igmpv1_mode() || is_igmpv2_mode())	return (false);    return (true);}/** * Test if the group is running in MLDv1 mode. * * @return true if the group is running in MLDv1 mode, otherwise false. */boolMld6igmpGroupRecord::is_mldv1_mode() const{    if (! _mld6igmp_vif.proto_is_mld6())	return (false);    if (_mld6igmp_vif.is_mldv1_mode())	return (true);		// XXX: explicitly configured in MLDv1 mode    return (_igmpv2_mldv1_host_present_timer.scheduled());}/** * Test if the group is running in MLDv2 mode. * * @return true if the group is running in MLDv2 mode, otherwise false. */boolMld6igmpGroupRecord::is_mldv2_mode() const{    if (! _mld6igmp_vif.proto_is_mld6())	return (false);    if (is_mldv1_mode())	return (false);    return (true);}/** * Calculate the forwarding changes and notify the interested parties. * * @param old_is_include mode if true, the old filter mode was INCLUDE, * otherwise was EXCLUDE. * @param old_do_forward_sources the old set of sources to forward. * @param old_dont_forward_sources the old set of sources not to forward. */voidMld6igmpGroupRecord::calculate_forwarding_changes(    bool old_is_include_mode,    const set<IPvX>& old_do_forward_sources) const{    bool new_is_include_mode = is_include_mode();    set<IPvX> new_do_forward_sources = _do_forward_sources.extract_source_addresses();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成年人影院| 中文字幕亚洲成人| 日本亚洲视频在线| 欧美一级电影网站| 国产在线观看一区二区 | 91久久线看在观草草青青| 亚洲美女偷拍久久| 欧美日韩极品在线观看一区| 亚洲第一成人在线| 日韩欧美精品在线视频| 国产中文一区二区三区| 亚洲特级片在线| 精品视频1区2区| 国产精品一品视频| 亚洲欧美日韩久久| 精品久久人人做人人爱| 国产综合色产在线精品| 国产精品成人免费| 欧美午夜一区二区三区| 看片网站欧美日韩| 国产精品色在线观看| 欧美亚洲愉拍一区二区| 经典三级一区二区| 一区二区三区在线观看视频| 亚洲欧美自拍偷拍| 91精品国产91久久综合桃花| 成人禁用看黄a在线| 亚洲午夜久久久久中文字幕久| 精品久久久久久久人人人人传媒 | 激情欧美一区二区| 中文字幕亚洲在| 91精品国产综合久久婷婷香蕉| 国产精品伊人色| 亚洲观看高清完整版在线观看| 久久综合九色欧美综合狠狠| 色婷婷综合视频在线观看| 精品一区二区免费视频| 亚洲精品久久久蜜桃| 久久综合九色综合97婷婷女人 | 国产精品久线在线观看| 69堂精品视频| 91麻豆文化传媒在线观看| 久久99日本精品| 亚洲不卡一区二区三区| 国产精品素人视频| 日韩精品一区二区三区视频在线观看 | 久久综合九色综合97婷婷 | www.亚洲国产| 麻豆91免费观看| 亚洲一二三区不卡| 中文字幕亚洲综合久久菠萝蜜| 精品欧美一区二区在线观看| 欧美私人免费视频| 97超碰欧美中文字幕| 国产乱码精品一品二品| 久久国内精品自在自线400部| 亚洲一区二区三区视频在线播放| 国产精品美日韩| 中文字幕av不卡| 国产日本亚洲高清| 久久久久久久久蜜桃| 精品日本一线二线三线不卡| 91精品久久久久久久久99蜜臂| 欧美午夜影院一区| 在线观看亚洲一区| 色婷婷国产精品| 91网站在线播放| 色婷婷综合激情| 91激情在线视频| 在线观看欧美日本| 欧美亚洲动漫精品| 欧美日韩三级视频| 欧美日韩视频不卡| 欧美高清视频在线高清观看mv色露露十八| 欧洲亚洲精品在线| 欧美美女一区二区在线观看| 欧美人伦禁忌dvd放荡欲情| 欧美日韩久久久久久| 欧美日韩中文精品| 欧美年轻男男videosbes| 欧美日韩精品一区二区天天拍小说| 欧美亚洲综合在线| 欧美日韩视频在线第一区| 欧美精品丝袜中出| 欧美一区二区日韩| 久久综合色鬼综合色| 中文字幕不卡三区| 亚洲手机成人高清视频| 亚洲国产视频a| 天堂久久久久va久久久久| 日本美女一区二区| 国产成人免费9x9x人网站视频| 成人丝袜高跟foot| 91久久精品国产91性色tv| 884aa四虎影成人精品一区| 日韩欧美的一区| 久久久99免费| 中文字幕一区二区三区av| 亚洲精品久久久蜜桃| 三级亚洲高清视频| 国产盗摄视频一区二区三区| k8久久久一区二区三区| 欧美亚洲动漫精品| 精品国产免费人成电影在线观看四季| 国产欧美日韩久久| 亚洲国产视频网站| 极品少妇xxxx偷拍精品少妇| 99在线精品视频| 欧美一区二区美女| 中文字幕一区二区三区在线不卡| 亚洲综合丁香婷婷六月香| 激情欧美一区二区| 一本大道久久精品懂色aⅴ| 日韩精品一区二区三区中文精品| 日本一区二区视频在线观看| 亚洲国产成人91porn| 精品一二三四在线| 91福利资源站| 国产日韩在线不卡| 亚洲va欧美va天堂v国产综合| 国产精品自拍在线| 欧美日韩亚洲丝袜制服| 国产精品网曝门| 日韩中文字幕1| 99久久国产综合精品色伊 | 色婷婷av一区二区三区之一色屋| 欧美一级黄色录像| 亚洲男女毛片无遮挡| 久久99热国产| 欧美日韩一二区| 成人免费小视频| 久久电影网电视剧免费观看| 日本韩国欧美一区二区三区| 日韩欧美国产小视频| 日本视频在线一区| 国产乱子伦视频一区二区三区 | 欧美成人一区二区三区| 欧美三级中文字| 91国产精品成人| 国产精品欧美极品| 麻豆国产一区二区| 欧洲精品一区二区| 国产精品看片你懂得| 国产乱子伦视频一区二区三区 | 亚洲靠逼com| 国产99精品视频| 26uuu色噜噜精品一区| 偷拍与自拍一区| 欧美日韩专区在线| 亚洲美女电影在线| 99久久婷婷国产综合精品电影| 久久午夜色播影院免费高清| 日本不卡不码高清免费观看| 欧美日韩国产成人在线免费| 亚洲精品乱码久久久久久| 成人不卡免费av| 国产视频一区在线播放| 国产毛片精品视频| 久久综合九色综合97婷婷女人| 久久精品99久久久| 日韩精品专区在线影院观看| 日韩激情视频在线观看| 777午夜精品免费视频| 丝袜亚洲另类丝袜在线| 欧美一区二区视频观看视频| 亚洲高清免费观看| 在线播放欧美女士性生活| 日产国产高清一区二区三区| 欧美色精品天天在线观看视频| 亚洲高清免费在线| 欧美久久高跟鞋激| 麻豆成人综合网| 国产亚洲1区2区3区| 粉嫩13p一区二区三区| 中文字幕在线观看一区| 国产一区二区三区高清播放| 久久久久国产精品人| aaa欧美色吧激情视频| 有码一区二区三区| 欧美天堂亚洲电影院在线播放| 手机精品视频在线观看| 日韩欧美综合在线| 国产大陆亚洲精品国产| 1024精品合集| 色呦呦一区二区三区| 久久免费看少妇高潮| 国产精品99久久久久久宅男| 亚洲精品一区二区在线观看| 久久成人免费电影| 精品国产百合女同互慰| 狠狠色2019综合网| 久久一二三国产| 国产露脸91国语对白| 欧美国产亚洲另类动漫| 99国产精品视频免费观看| 中文字幕综合网| 在线播放日韩导航| 国产成人综合在线观看| 亚洲激情图片一区| 精品理论电影在线|