| 
		| Source: ../../contrib/olsr/xrl_queue.hh |  
		|  |  
 |  | 
 
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
// vim:set sts=4 ts=8 sw=4:
// Copyright (c) 2001-2009 XORP, Inc.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License, Version 2, June
// 1991 as published by the Free Software Foundation. Redistribution
// and/or modification of this program under the terms of any other
// version of the GNU General Public License is not permitted.
// 
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details,
// see the GNU General Public License, Version 2, a copy of which can be
// found in the XORP LICENSE.gpl file.
// 
// XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA;
// http://xorp.net
// $XORP: xorp/contrib/olsr/xrl_queue.hh,v 1.4 2009/01/05 18:30:47 jtc Exp $
#ifndef __OLSR_XRL_QUEUE_HH__
#define __OLSR_XRL_QUEUE_HH__
class XrlIO;
/**
 * @short Helper class to queue route adds and deletes to the RIB.
 */
class XrlQueue {
public:
    XrlQueue(EventLoop& eventloop, XrlRouter& xrl_router);
    void set_io(XrlIO* io) { _io = io; }
    /**
     * Queue a route add to the RIB.
     *
     * @param ribname the name of the RIB XRL target to send to.
     * @param net the destination.
     * @param nexthop the next hop.
     * @param nexthop_id the libfeaclient ID of the outward interface.
     * @param metric the route metric.
     * @param policytags The policy tags for the route.
     */
    void queue_add_route(string ribname, const IPv4Net& net,
			 const IPv4& nexthop, uint32_t nexthop_id,
			 uint32_t metric, const PolicyTags& policytags);
    /**
     * Queue a route delete to the RIB.
     *
     * @param ribname the name of the RIB XRL target to send to.
     * @param net the destination.
     */
    void queue_delete_route(string ribname, const IPv4Net& net);
    /**
     * @return true if RIB commands are currently in flight.
     */
    bool busy();
private:
    struct Queued {
	bool add;
	string ribname;
	IPv4Net net;
	IPv4 nexthop;
	uint32_t nexthop_id;
	uint32_t metric;
	string comment;
	PolicyTags policytags;
    };
    static const size_t WINDOW = 100;
    EventLoop& eventloop() const;
    /**
     * @return true if the maximum number of XRLs flight has been exceeded.
     */
    inline bool maximum_number_inflight() const {
	return _flying >= WINDOW;
    }
    /**
     * Start the transmission of XRLs to tbe RIB.
     */
    void start();
    /**
     * The specialised method called by sendit to deal with IPv4/IPv6.
     *
     * @param q the queued command.
     * @param protocol "olsr"
     * @return True if the add/delete was queued.
     */
    bool sendit_spec(Queued& q, const char *protocol);
    /**
     * Callback method to: signal completion of a RIB command.
     *
     * @param error reference to an XrlError containing command status.
     * @param comment a textual description of the error.
     */
    void route_command_done(const XrlError& error, const string comment);
private:
    XrlIO*		_io;
    EventLoop&		_eventloop;
    XrlRouter&		_xrl_router;
    deque<Queued>	_xrl_queue;
    /**
     * Number of XRLs currently in flight.
     */
    size_t		_flying;
};
#endif // __OLSR_XRL_QUEUE_HH__
	
Generated by: pavlin on kobe.xorp.net on Wed Jan  7 19:11:15 2009, using kdoc 2.0a54+XORP.