// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*- // Copyright (c) 2001-2007 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/tools/common.hh,v 1.5 2007/02/16 22:47:20 pavlin Exp $ #ifndef __RIP_TOOLS_COMMON_HH__ #define __RIP_TOOLS_COMMON_HH__ #include #include "libxorp/xorp.h" #include "libxorp/ipv4.hh" #include "libxorp/ipv6.hh" #include "libxorp/service.hh" class EventLoop; class XrlJobBase; // ---------------------------------------------------------------------------- // Utility funtions /** * Utility function to return the default RIP XRL target according to * the IP version number. * * @param ip_version IP version number. * @return pointer to character string containing XRL target name on * success, NULL if an invalid IP version number. */ const char* default_xrl_target(uint32_t ip_version); /** * Utility function to return IP version from named rip description string. * * @param rip_name string that is expected to be "rip" or "ripng". * * @return on success either of 4 or 6, on failure 0. */ uint32_t rip_name_to_ip_version(const char* rip_name); /** * Utility function to break a colon separated host name and port into * separate variables. * * @param host_colon_port string containing colon separated host and port. * @param host string assigned with host name. * @param port unsigned integer assigned with port number. * @return true on success, false if host_colon_port is invalid. */ bool parse_finder_args(const string& host_colon_port, string& host, uint16_t& port); // ---------------------------------------------------------------------------- // Class declarations /** * Class for buffering and dispatching XRLs. */ class XrlJobQueue : public ServiceBase { public: typedef ref_ptr Job; public: XrlJobQueue(EventLoop& e, const string& finder_host, uint16_t finder_port, const string& tgtname); ~XrlJobQueue(); bool startup(); bool shutdown(); void dispatch_complete(const XrlError& xe, const XrlJobBase* cmd); inline XrlSender* sender() { return _rtr; } inline const string& target() const { return _tgt; } inline void enqueue(const Job& cmd) { _jobs.push_back(cmd); } protected: bool xrl_router_ready_poll(); void process_next_job(); protected: EventLoop& _e; string _fhost; // Finder host uint16_t _fport; // Finder port string _tgt; // Xrl target to for jobs list _jobs; XrlStdRouter* _rtr; XorpTimer _rtr_poll; // Timer used to poll XrlRouter::ready uint32_t _rtr_poll_cnt; // Number of timer XrlRouter polled. }; /** * Base class for Xrl Jobs that are invoked by classes derived * from XrlJobQueue. */ class XrlJobBase : public CallbackSafeObject { public: XrlJobBase(XrlJobQueue& q) : _q(q) {} virtual ~XrlJobBase() {} virtual bool dispatch() = 0; protected: XrlJobQueue& queue() { return _q; } private: XrlJobBase(const XrlJobBase&); // Not implemented XrlJobBase& operator=(const XrlJobBase&); // Not implemented private: XrlJobQueue& _q; }; #endif // __RIP_TOOLS_COMMON_HH__