Source: ../../rip/xrl_port_manager.hh


 
LOGO
 Annotated List  Files  Globals  Hierarchy  Index  Top
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-

// Copyright (c) 2001-2005 International Computer Science Institute
//
// 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.

// $XORP: xorp/rip/xrl_port_manager.hh,v 1.12 2005/08/31 16:53:59 zec Exp $

#ifndef __RIP_XRL_PORT_MANAGER_HH__
#define __RIP_XRL_PORT_MANAGER_HH__

#include "libxorp/service.hh"
#include "libfeaclient/ifmgr_xrl_mirror.hh"
#include "port_manager.hh"

#include "port.hh"

class XrlRouter;

/**
 * @short Class for managing RIP Ports and their transport systems.
 *
 * The XrlPortManager class instantiates RIP Port instances and their
 * transport system.  The methods add_rip_address and
 * remove_rip_address cause @ref Port objects and @ref XrlPortIO
 * objects to be instantiated and destructed.
 *
 * The deliver_packet method forwards an arriving packet to the
 * appropriate @ref XrlPortIO object.
 */
template <typename A>
class XrlPortManager
    : public PortManagerBase<A>,
      public IfMgrHintObserver,
      public ServiceBase,
      public ServiceChangeObserverBase
{
public:
    inline XrlPortManager(System<A>& 		system,
			  XrlRouter& 		xr,
			  IfMgrXrlMirror& 	ifm)
	: PortManagerBase<A>(system, ifm.iftree()),
	  ServiceBase("RIP Port Manager"),
	  _xr(xr), _ifm(ifm)
    {
	_ifm.attach_hint_observer(this);
    }

    ~XrlPortManager();

    /**
     * Request start up of instance.
     *
     * @return true on success, false on failure.
     */
    bool startup();

    /**
     * Request shutdown of instance.
     *
     * @return true on success, false on failure.
     */
    bool shutdown();

    /**
     * Request the addition of an address to run RIP on.  If the
     * address is known to exist on the specified interface and vif, a
     * request is sent to the FEA to create an appropriately
     * bound RIP socket.
     *
     * @param interface to run RIP on.
     * @param vif virtual interface to run RIP on.
     * @param addr address to run RIP on.
     *
     * @return true on success or if address is already running RIP,
     * false on failure.
     */
    bool add_rip_address(const string&	ifname,
			 const string&	vifname,
			 const A&	addr);

    /**
     * Remove an address running RIP.
     *
     * @param interface to run RIP on.
     * @param vif virtual interface to run RIP on.
     * @param addr address to run RIP on.
     *
     * @return true on success or if address is not running RIP, false on
     * otherwise.
     */
    bool remove_rip_address(const string&	ifname,
			    const string&	vifname,
			    const A&		addr);

    /**
     * Deliver packet to RIP port associated with socket id that
     * received the packet.
     *
     * @param sockid unique socket identifier.
     * @param src_addr source address of packet.
     * @param src_port source port of packet.
     * @param pdata packet data.
     *
     * @return true if packet delivered, false if the owner of the
     * sockid can not be found.
     */
    bool deliver_packet(const string& 		sockid,
			const A& 		src_addr,
			uint16_t 		src_port,
			const vector<uint8_t>& 	pdata);

    /**
     * Find RIP port associated with interface, vif, address tuple.
     *
     * @return pointer to port on success, 0 if port could not be found.
     */
    Port<A>* find_port(const string&	ifname,
		       const string&	vifname,
		       const A&		addr);
    /**
     * Find RIP port associated with interface, vif, address tuple.
     *
     * @return pointer to port on success, 0 if port could not be found.
     */
    const Port<A>* find_port(const string&	ifname,
			     const string&	vifname,
			     const A&		addr) const;

    /**
     * Determine if rip address is up.  The result is based on the current
     * state of information from the FEA.
     *
     * @return true if the address is up, false if the address is not up
     * or does not exist.
     */
    bool underlying_rip_address_up(const string&	ifname,
				   const string&	vifname,
				   const A&		addr) const;

    /**
     * Determine if rip address exists.  The result is based on the
     * current state of information from the FEA.
     *
     * @return true if the address is up, false if the address is not up
     * or does not exist.
     */
    bool underlying_rip_address_exists(const string&	ifname,
				       const string&	vifname,
				       const A&		addr) const;

protected:
    //
    // IfMgrHintObserver methods
    //
    void tree_complete();
    void updates_made();

    //
    // ServiceChangeObserverBase methods
    // - used for observing status changes of XrlPortIO objects instantiated
    //   by XrlPortManager instance.
    //
    void status_change(ServiceBase*	service,
		       ServiceStatus	old_status,
		       ServiceStatus 	new_status);

    //
    // Attempt to start next io handler.  Walk list of ports, check
    // none are in state SERVICE_STARTING and call start on first found to be
    // in state SERVICE_READY.
    //
    // We start 1 at a time to avoid races trying to create
    // sockets with the fea.
    //
    void try_start_next_io_handler();

private:
    XrlPortManager(const XrlPortManager&);		// not implemented
    XrlPortManager& operator=(const XrlPortManager&);	// not implemented

protected:
    XrlRouter& 				_xr;	// XrlRouter
    IfMgrXrlMirror& 			_ifm;	// Interface Mirror
    map<ServiceBase*, Port<A>*>	_dead_ports; // Ports awaiting io shutdown
};

#endif // __RIP_XRL_PORT_MANAGER_HH__

Generated by: pavlin on possum.icir.org on Thu Mar 9 04:43:53 2006, using kdoc $.