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

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

?? mld6igmp_proto.cc

?? MLDv2 support igmpv3 lite
?? CC
?? 第 1 頁 / 共 2 頁
字號:
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-// Copyright (c) 2001-2008 XORP, Inc.//// Permission is hereby granted, free of charge, to any person obtaining a// copy of this software and associated documentation files (the "Software")// to deal in the Software without restriction, subject to the conditions// listed in the XORP LICENSE file. These conditions include: you must// preserve this copyright notice, and you cannot mention the copyright// holders in advertising related to the Software without their permission.// The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This// notice is a summary of the XORP LICENSE file; the license in that file is// legally binding.#ident "$XORP: xorp/contrib/mld6igmp_lite/mld6igmp_proto.cc,v 1.3 2008/07/23 05:09:49 pavlin Exp $"//// Internet Group Management Protocol implementation.// IGMPv1, IGMPv2 (RFC 2236), and IGMPv3 (RFC 3376).//// AND//// Multicast Listener Discovery protocol implementation.// MLDv1 (RFC 2710) and MLDv2 (RFC 3810).//#include "mld6igmp_module.h"#include "libxorp/xorp.h"#include "libxorp/xlog.h"#include "libxorp/debug.h"#include "libxorp/ipvx.hh"#include <set>#include "mld6igmp_vif.hh"//// Exported variables////// Local constants definitions////// Local structures/classes, typedefs and macros////// Local variables////// Local functions prototypes///** * Mld6igmpVif::mld6igmp_membership_query_recv: * @src: The message source address. * @dst: The message destination address. * @message_type: The message type. * @max_resp_code: The Maximum Response Code from the MLD/IGMP header. * @group_address: The Group Address from the MLD/IGMP message. * @buffer: The buffer with the rest of the message. *  * Receive and process IGMP_MEMBERSHIP_QUERY/MLD_LISTENER_QUERY message * from another router. *  * Return value: %XORP_OK on success, otherwise %XORP_ERROR. **/intMld6igmpVif::mld6igmp_membership_query_recv(const IPvX& src,					    const IPvX& dst,					    uint8_t message_type,					    uint16_t max_resp_code,					    const IPvX& group_address,					    buffer_t *buffer){    int message_version = 0;    // Ignore my own queries    if (mld6igmp_node().is_my_addr(src))	return (XORP_ERROR);    //    // Determine the protocol version of the Query message    //    if (proto_is_igmp()) {	//	// The IGMP version of a Membership Query message is:	// - IGMPv1 Query: length = 8 AND Max Resp Code field is zero	// - IGMPv2 Query: length = 8 AND Max Resp Code field is non-zero	// - IGMPv3 Query: length >= 12	//	do {	    //	    // Note that the Query processing so far has decoded the message	    // up to the group address included (i.e., 8 octets), hence	    // we add-back the size of the decoded portion.	    //	    size_t data_size = BUFFER_DATA_SIZE(buffer) + IGMP_MINLEN;	    if ((data_size == IGMP_MINLEN) && (max_resp_code == 0)) {		message_version = IGMP_V1;		break;	    }	    if ((data_size == IGMP_MINLEN) && (max_resp_code != 0)) {		message_version = IGMP_V2;		break;	    }	    if (data_size >= IGMP_V3_QUERY_MINLEN) {		message_version = IGMP_V3;		break;	    }	    //	    // Silently ignore all other Query messages that don't match	    // any of the above conditions.	    //	    return (XORP_ERROR);	} while (false);	XLOG_ASSERT(message_version > 0);	//	// Query version consistency check.	// If there is mismatch, then drop the message.	// See RFC 3376 Section 7.3.1, and RFC 3810 Section 8.3.1.	//	if (mld6igmp_query_version_consistency_check(src, dst, message_type,						     message_version)	    != XORP_OK) {	    return (XORP_ERROR);	}    }    if (proto_is_mld6()) {	//	// The MLD version of a Membership Query message is:	// - MLDv1 Query: length = 24	// - MLDv2 Query: length >= 28	//	do {	    //	    // Note that the Query processing so far has decoded the message	    // up to the group address included (i.e., 24 octets), hence	    // we add-back the size of the decoded portion.	    //	    size_t data_size = BUFFER_DATA_SIZE(buffer) + MLD_MINLEN;	    if (data_size == MLD_MINLEN) {		message_version = MLD_V1;		break;	    }	    if (data_size >= MLD_V2_QUERY_MINLEN) {		message_version = MLD_V2;		break;	    }	    //	    // Silently ignore all other Query messages that don't match	    // any of the above conditions.	    //	    return (XORP_ERROR);	} while (false);	XLOG_ASSERT(message_version > 0);	//	// Query version consistency check.	// If there is mismatch, then drop the message.	// See RFC 3376 Section 7.3.1, and RFC 3810 Section 8.3.1.	//	if (mld6igmp_query_version_consistency_check(src, dst, message_type,						     message_version)	    != XORP_OK) {	    return (XORP_ERROR);	}    }    XLOG_ASSERT(message_version > 0);        //    // Compare this querier address with my address.    // XXX: Here we should compare the old and new querier    // addresses, but we don't really care.    //    XLOG_ASSERT(primary_addr() != IPvX::ZERO(family()));    if (src < primary_addr()) {	// Eventually a new querier	_query_timer.unschedule();	set_querier_addr(src);	set_i_am_querier(false);	TimeVal other_querier_present_interval =	    effective_query_interval() * effective_robustness_variable()	    + query_response_interval().get() / 2;	_other_querier_timer =	    mld6igmp_node().eventloop().new_oneoff_after(		other_querier_present_interval,		callback(this, &Mld6igmpVif::other_querier_timer_timeout));    }    //    // XXX: if this is IGMPv3 or MLDv2 Query, then process separately    // the rest the message.    //    if ((proto_is_igmp() && (message_version >= IGMP_V3))	|| (proto_is_mld6() && (message_version >= MLD_V2))) {	mld6igmp_ssm_membership_query_recv(src, dst, message_type,					   max_resp_code, group_address,					   buffer);	return (XORP_OK);    }    //    // From RFC 2236:    // "When a non-Querier receives a Group-Specific Query message, if its    // existing group membership timer is greater than [Last Member Query    // Count] times the Max Response Time specified in the message, it sets    // its group membership timer to that value."    //    //    // From RFC 2710:    // "When a router in Non-Querier state receives a Multicast-Address-    // Specific Query, if its timer value for the identified multicast    // address is greater than [Last Listener Query Count] times the Maximum    // Response Delay specified in the message, it sets the address's timer    // to that latter value."    //    if ( (! group_address.is_zero())	 && (max_resp_code != 0)	 && (! i_am_querier())) {	    uint32_t timer_scale = mld6igmp_constant_timer_scale();	    TimeVal received_resp_tv;	    // "Last Member Query Count" / "Last Listener Query Count"	    received_resp_tv = TimeVal(effective_robustness_variable() * max_resp_code, 0);	    received_resp_tv = received_resp_tv / timer_scale;	    _group_records.lower_group_timer(group_address, received_resp_tv);    }    return (XORP_OK);}/** * Mld6igmpVif::mld6igmp_ssm_membership_query_recv: * @src: The message source address. * @dst: The message destination address. * @message_type: The message type. * @max_resp_code: The Maximum Response Code from the MLD/IGMP header. * @group_address: The Group Address from the MLD/IGMP message. * @buffer: The buffer with the rest of the message. *  * Receive and process IGMPv3/MLDv2 IGMP_MEMBERSHIP_QUERY/MLD_LISTENER_QUERY * message from another router. *  * Return value: %XORP_OK on success, otherwise %XORP_ERROR. **/intMld6igmpVif::mld6igmp_ssm_membership_query_recv(const IPvX& src,						const IPvX& dst,						uint8_t message_type,						uint16_t max_resp_code,						const IPvX& group_address,						buffer_t *buffer){    bool s_flag = false;    uint8_t qrv = 0;    uint8_t qqic = 0;    uint16_t sources_n = 0;    TimeVal max_resp_time, qqi;    set<IPvX> sources;    string error_msg;    //    // Decode the Max Resp Code    //    if (proto_is_igmp()) {	decode_exp_time_code8(max_resp_code, max_resp_time,			      mld6igmp_constant_timer_scale());    }    if (proto_is_mld6()) {	decode_exp_time_code16(max_resp_code, max_resp_time,			       mld6igmp_constant_timer_scale());    }    //    // Decode the rest of the message header    //    BUFFER_GET_OCTET(qrv, buffer);    BUFFER_GET_OCTET(qqic, buffer);    BUFFER_GET_HOST_16(sources_n, buffer);    if (proto_is_igmp()) {	s_flag = IGMP_SFLAG(qrv);	qrv = IGMP_QRV(qrv);    }    if (proto_is_mld6()) {	s_flag = MLD_SFLAG(qrv);	qrv = MLD_QRV(qrv);    }    decode_exp_time_code8(qqic, qqi, 1);    //    // Check the remaining size of the message    //    if (BUFFER_DATA_SIZE(buffer) < sources_n * IPvX::addr_bytelen(family())) {	error_msg = c_format("RX %s from %s to %s on vif %s: "			     "source addresses array size too short"			     "(received %u expected at least %u)",			     proto_message_type2ascii(message_type),			     cstring(src), cstring(dst),			     name().c_str(),			     XORP_UINT_CAST(BUFFER_DATA_SIZE(buffer)),			     XORP_UINT_CAST(sources_n * IPvX::addr_bytelen(family())));	XLOG_WARNING("%s", error_msg.c_str());	return (XORP_ERROR);    }    //    // Decode the array of source addresses    //    while (sources_n != 0) {	IPvX ipvx(family());	BUFFER_GET_IPVX(family(), ipvx, buffer);	sources.insert(ipvx);	sources_n--;    }    //    // Adopt the Querier's Robustness Variable and Query Interval    //    if (! i_am_querier()) {	if (qrv != 0) {	    set_effective_robustness_variable(qrv);	} else {	    set_effective_robustness_variable(configured_robust_count().get());	}	if (qqi != TimeVal::ZERO()) {	    set_effective_query_interval(qqi);	} else {	    set_effective_query_interval(configured_query_interval().get());	}    }    //    // Lower the group and source timers    //    if (! s_flag) {	if (sources.empty()) {	    // XXX: Q(G) Query	    _group_records.lower_group_timer(group_address,					     last_member_query_time());	} else {	    // XXX: Q(G, A) Query	    _group_records.lower_source_timer(group_address, sources,					      last_member_query_time());	}    }    return (XORP_OK); rcvlen_error:    XLOG_UNREACHABLE();    error_msg = c_format("RX %s from %s to %s on vif %s: "			 "some fields are too short",			 proto_message_type2ascii(message_type),			 cstring(src), cstring(dst),			 name().c_str());    XLOG_WARNING("%s", error_msg.c_str());    return (XORP_ERROR);}/** * Mld6igmpVif::mld6igmp_membership_report_recv: * @src: The message source address. * @dst: The message destination address. * @message_type: The message type. * @max_resp_code: The Maximum Response Code from the MLD/IGMP header. * @group_address: The Group Address from the MLD/IGMP message. * @buffer: The buffer with the rest of the message. *  * Receive and process * (IGMP_V1_MEMBERSHIP_REPORT or IGMP_V2_MEMBERSHIP_REPORT)/MLD_LISTENER_REPORT * message from a host. *  * Return value: %XORP_OK on success, otherwise %XORP_ERROR. **/intMld6igmpVif::mld6igmp_membership_report_recv(const IPvX& src,					     const IPvX& dst,					     uint8_t message_type,					     uint16_t max_resp_code,					     const IPvX& group_address,					     buffer_t *buffer){    Mld6igmpGroupRecord *group_record = NULL;        // The group address must be a valid multicast address    if (! group_address.is_multicast()) {	XLOG_WARNING("RX %s from %s to %s on vif %s: "		     "the group address %s is not "		     "valid multicast address",		     proto_message_type2ascii(message_type),		     cstring(src), cstring(dst),		     name().c_str(),		     cstring(group_address));	return (XORP_ERROR);    }    set<IPvX> no_sources;		// XXX: empty set    group_records().process_mode_is_exclude(group_address, no_sources, src);    //    // Check whether an older Membership report has been received    //    int message_version = 0;    if (proto_is_igmp()) {	switch (message_type) {	case IGMP_V1_MEMBERSHIP_REPORT:	    message_version = IGMP_V1;	    break;	case IGMP_V2_MEMBERSHIP_REPORT:	    message_version = IGMP_V2;	    break;	case IGMP_V3_MEMBERSHIP_REPORT:	    message_version = IGMP_V3;	    break;	default:	    message_version = IGMP_V2;	    break;	}    }    if (proto_is_mld6()) {	switch (message_type) {	case MLD_LISTENER_REPORT:	    message_version = MLD_V1;	    break;	case MLDV2_LISTENER_REPORT:	    message_version = MLD_V2;	    break;	default:	    message_version = MLD_V1;	    break;	}    }    XLOG_ASSERT(message_version > 0);    group_record = _group_records.find_group_record(group_address);    XLOG_ASSERT(group_record != NULL);    group_record->received_older_membership_report(message_version);    UNUSED(max_resp_code);    UNUSED(buffer);    return (XORP_OK);}/** * Mld6igmpVif::mld6igmp_leave_group_recv: * @src: The message source address. * @dst: The message destination address. * @message_type: The message type. * @max_resp_code: The Maximum Response Code from the MLD/IGMP header. * @group_address: The Group Address from the MLD/IGMP message. * @buffer: The buffer with the rest of the message. *  * Receive and process IGMP_V2_LEAVE_GROUP/MLD_LISTENER_DONE message * from a host. *  * Return value: %XORP_OK on success, otherwise %XORP_ERROR. **/intMld6igmpVif::mld6igmp_leave_group_recv(const IPvX& src,				       const IPvX& dst,				       uint8_t message_type,				       uint16_t max_resp_code,				       const IPvX& group_address,				       buffer_t *buffer){    Mld6igmpGroupRecord *group_record = NULL;    string dummy_error_msg;    // The group address must be a valid multicast address    if (! group_address.is_multicast()) {	XLOG_WARNING("RX %s from %s to %s on vif %s: "		     "the group address %s is not "		     "valid multicast address",		     proto_message_type2ascii(message_type),		     cstring(src), cstring(dst),		     name().c_str(),		     cstring(group_address));	return (XORP_ERROR);    }    //    // Find if we already have an entry for this group    //    group_record = _group_records.find_group_record(group_address);    if (group_record == NULL) {	// Nothing found. Ignore.	return (XORP_OK);    }    //    // Group found    //    if (is_igmpv1_mode(group_record)) {	//	// Ignore this 'Leave Group' message because this	// group has IGMPv1 hosts members.	//	return (XORP_OK);    }    set<IPvX> no_sources;		// XXX: empty set    group_records().process_change_to_include_mode(group_address, no_sources,						   src);    return (XORP_OK);    UNUSED(max_resp_code);    UNUSED(buffer);        return (XORP_OK);}/** * Mld6igmpVif::mld6igmp_ssm_membership_report_recv: * @src: The message source address. * @dst: The message destination address. * @message_type: The message type. * @buffer: The buffer with the rest of the message. *  * Receive and process IGMP_V3_MEMBERSHIP_REPORT/MLDV2_LISTENER_REPORT * message from a host. *  * Return value: %XORP_OK on success, otherwise %XORP_ERROR. **/int

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产美女浴室洗澡无遮挡| 色综合久久综合网欧美综合网 | 日本午夜精品视频在线观看| 欧美亚洲丝袜传媒另类| 亚洲国产wwwccc36天堂| 911精品产国品一二三产区| 日韩成人免费看| 欧美大胆一级视频| 国产乱码精品一区二区三| 国产欧美一区二区精品性| 91网站最新地址| 日韩av在线播放中文字幕| 精品人在线二区三区| 国产不卡在线一区| 亚洲视频中文字幕| 欧美精品在欧美一区二区少妇| 日本人妖一区二区| 国产精品久久久久三级| 欧美在线短视频| 久久99精品久久只有精品| 国产精品水嫩水嫩| 在线不卡中文字幕播放| 国产福利91精品| 一区二区不卡在线播放| 亚洲精品一区二区三区99| 成人免费视频一区| 日本在线不卡一区| 国产色91在线| 欧美日韩美女一区二区| 国产99精品在线观看| 亚洲h动漫在线| 欧美激情综合五月色丁香小说| 色激情天天射综合网| 国内成+人亚洲+欧美+综合在线 | 色久综合一二码| 久久99久久99精品免视看婷婷 | 精品美女一区二区| 欧美亚洲另类激情小说| 国产aⅴ综合色| 免费一级片91| 亚洲国产wwwccc36天堂| 国产精品色眯眯| 日韩免费视频一区二区| 在线观看日韩电影| 国产白丝精品91爽爽久久 | 日本欧美一区二区三区| 1000部国产精品成人观看| 日韩欧美一级在线播放| 在线观看日韩精品| 成人国产亚洲欧美成人综合网| 午夜精品影院在线观看| 成人免费在线播放视频| 欧美videos大乳护士334| 日本二三区不卡| 成年人国产精品| 国产伦精一区二区三区| 日本不卡中文字幕| 亚洲综合色丁香婷婷六月图片| 欧美国产欧美综合| 26uuu亚洲综合色| 91麻豆精品国产自产在线| 日本韩国欧美在线| 91在线观看地址| av欧美精品.com| 成人综合婷婷国产精品久久蜜臀 | 亚洲国产裸拍裸体视频在线观看乱了| 中文字幕欧美国产| 国产情人综合久久777777| 精品国产一区二区亚洲人成毛片| 欧美精品高清视频| 欧美福利电影网| 欧美一区二区免费观在线| 欧美电影一区二区| 4438亚洲最大| 91精品国产乱码久久蜜臀| 欧美喷潮久久久xxxxx| 欧美日韩精品欧美日韩精品一| 色婷婷久久久亚洲一区二区三区| caoporn国产一区二区| www.成人网.com| 91老师片黄在线观看| 99国产欧美久久久精品| 91婷婷韩国欧美一区二区| 日本精品一区二区三区四区的功能| 色综合久久综合网97色综合| 色先锋aa成人| 欧美日韩精品二区第二页| 日韩欧美亚洲国产精品字幕久久久| 日韩欧美国产精品| 国产女主播视频一区二区| 国产精品国产成人国产三级 | 欧美激情一区不卡| 亚洲欧美日韩在线不卡| 亚洲一区二区成人在线观看| 午夜精品久久久久| 国产原创一区二区三区| 丁香网亚洲国际| 91蝌蚪国产九色| 91精品国产欧美一区二区18| 久久一夜天堂av一区二区三区| 国产三级精品在线| 一二三四社区欧美黄| 麻豆精品视频在线观看| 成人一级黄色片| 欧美日韩中文另类| 国产亚洲欧美日韩日本| 自拍偷拍亚洲激情| 全国精品久久少妇| 成人亚洲一区二区一| 欧美日韩在线三级| 欧美精品一区二区久久婷婷| 国产精品美女久久久久久久网站| 亚洲精品视频免费观看| 九九国产精品视频| 97成人超碰视| 欧美一卡2卡3卡4卡| 国产精品网站在线观看| 视频在线观看国产精品| 成人av电影在线| 日韩一区二区在线免费观看| 国产精品福利在线播放| 蜜桃视频在线观看一区二区| av在线免费不卡| 26uuu欧美| 亚洲午夜免费视频| 波多野结衣中文字幕一区二区三区 | 国产精品久久久久久亚洲毛片| 午夜电影网一区| 99国产精品一区| 久久综合久久久久88| 亚洲国产视频直播| 成人av在线网| 久久中文字幕电影| 视频在线观看91| 色哦色哦哦色天天综合| 久久综合久久99| 美女视频一区在线观看| 91久久精品一区二区二区| 中文乱码免费一区二区| 蜜桃视频在线一区| 在线成人午夜影院| 一区二区三区中文字幕精品精品 | 国产91丝袜在线18| 欧美成人性福生活免费看| 亚洲狠狠爱一区二区三区| 99精品久久只有精品| 国产丝袜在线精品| 久久电影国产免费久久电影| 欧美日韩一区精品| 亚洲久本草在线中文字幕| 不卡的电影网站| 欧美国产精品专区| 福利电影一区二区三区| 精品久久久影院| 久久99精品网久久| 欧美一级专区免费大片| 五月天中文字幕一区二区| 欧美体内she精视频| 亚洲精品国产高清久久伦理二区| 成人午夜视频免费看| 久久久久久久久免费| 韩日av一区二区| 欧美哺乳videos| 精品一区二区三区免费| 欧美xxxxxxxx| 国产福利一区在线| 国产亚洲一区字幕| 高清国产午夜精品久久久久久| 久久久久国产精品免费免费搜索| 韩国在线一区二区| 欧美极品xxx| 91亚洲精华国产精华精华液| 最新日韩在线视频| 色狠狠av一区二区三区| 一区二区三区视频在线看| 91免费观看国产| 亚洲综合男人的天堂| 欧美三级中文字幕| 日韩专区欧美专区| 日韩一级大片在线| 国产成人精品免费视频网站| 一色桃子久久精品亚洲| 91久久免费观看| 午夜av电影一区| 久久日韩精品一区二区五区| 国产精品亚洲一区二区三区妖精| 日本一区二区动态图| 99久精品国产| 三级欧美在线一区| 国产亚洲婷婷免费| 一本大道久久a久久综合| 午夜久久久久久电影| 精品欧美一区二区久久 | 亚洲精品第1页| 欧美一级免费观看| 国产成人精品免费看| 一区二区三区在线观看欧美| 日韩欧美一级精品久久| 粉嫩一区二区三区在线看| 亚洲与欧洲av电影|