⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 output_table.cc

📁 RIP 协议实现
💻 CC
字号:
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-// vim:set sts=4 ts=8: // 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/rip/output_table.cc,v 1.19 2008/07/23 05:11:35 pavlin Exp $"#include "libxorp/xorp.h"#include "output_table.hh"#include "packet_assembly.hh"#include "packet_queue.hh"#include "route_db.hh"template <typename A>voidOutputTable<A>::output_packet(){    if (_rw_valid == false) {	_rw.reset();	_rw_valid = true;    }    _rw.resume();    ResponsePacketAssembler<A> rpa(this->_port);    RipPacket<A>* pkt = new RipPacket<A>(this->ip_addr(), this->ip_port());    rpa.packet_start(pkt);    uint32_t done = 0;    const RouteEntry<A>* r = 0;    for (r = _rw.current_route(); r != 0; r = _rw.next_route()) {	//	// We may either "drop the packet..."	// or set cost to infinity...	// or depending on poison-reverse / horizon settings	//	if (r->filtered()) {	    continue;	}    	pair<A,uint16_t> p = this->_port.route_policy(*r);	if (p.second > RIP_INFINITY) {	    continue;	}	RouteEntryOrigin<A>* origin = NULL;	// XXX	string ifname, vifname;		// XXX: not set, because not needed	RouteEntry<A>* copy = new RouteEntry<A>(r->net(), p.first,						ifname, vifname,						p.second,					        origin, r->tag(),						r->policytags());		bool accepted = do_filtering(copy);	if (!accepted) {	    delete copy;	    continue;	}	rpa.packet_add_route(copy->net(), copy->nexthop(), copy->cost(), copy->tag());	// XXX: packet_add_route stores args	delete copy;		done++;	if (rpa.packet_full()) {	    _rw.next_route();	    break;	}    }    list<RipPacket<A>*> auth_packets;    if (done == 0 || rpa.packet_finish(auth_packets) == false) {	// No routes added to packet or error finishing packet off.    } else {	typename list<RipPacket<A>*>::iterator iter;	for (iter = auth_packets.begin(); iter != auth_packets.end(); ++iter) {	    RipPacket<A>* auth_pkt = *iter;	    this->_pkt_queue.enqueue_packet(auth_pkt);	    if (this->ip_port() == RIP_AF_CONSTANTS<A>::IP_PORT) {		this->_port.counters().incr_unsolicited_updates();	    } else {		this->_port.counters().incr_non_rip_updates_sent();	    }	    this->incr_packets_sent();	}	this->_port.push_packets();    }    delete pkt;    if (r == 0) {	// Reached null route so note route walker is now invalid.	_rw_valid = false;    } else {	// Not finished so set time to reschedule self and pause	// route walker.	this->_op_timer 	    = this->_e.new_oneoff_after_ms(this->interpacket_gap_ms(),                          callback(this, &OutputTable<A>::output_packet));	_rw.pause(this->interpacket_gap_ms());    }}template <typename A>voidOutputTable<A>::start_output_processing(){    output_packet();		// starts timer}template <typename A>voidOutputTable<A>::stop_output_processing(){    this->_op_timer.unschedule();	// stop timer}// ----------------------------------------------------------------------------// Instantiations#ifdef INSTANTIATE_IPV4template class OutputTable<IPv4>;#endif#ifdef INSTANTIATE_IPV6template class OutputTable<IPv6>;#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -