xorp

windows_rtm_pipe.hh

00001 // -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
00002 // vim:set sts=4 ts=8:
00003 
00004 // Copyright (c) 2001-2011 XORP, Inc and Others
00005 //
00006 // This program is free software; you can redistribute it and/or modify
00007 // it under the terms of the GNU General Public License, Version 2, June
00008 // 1991 as published by the Free Software Foundation. Redistribution
00009 // and/or modification of this program under the terms of any other
00010 // version of the GNU General Public License is not permitted.
00011 // 
00012 // This program is distributed in the hope that it will be useful, but
00013 // WITHOUT ANY WARRANTY; without even the implied warranty of
00014 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details,
00015 // see the GNU General Public License, Version 2, a copy of which can be
00016 // found in the XORP LICENSE.gpl file.
00017 // 
00018 // XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA;
00019 // http://xorp.net
00020 
00021 // $XORP: xorp/fea/data_plane/control_socket/windows_rtm_pipe.hh,v 1.7 2008/10/02 21:56:54 bms Exp $
00022 
00023 #ifndef __FEA_DATA_PLANE_CONTROL_SOCKET_WINDOWS_RTM_PIPE_HH__
00024 #define __FEA_DATA_PLANE_CONTROL_SOCKET_WINDOWS_RTM_PIPE_HH__
00025 
00026 #include <list>
00027 
00028 #include "libxorp/eventloop.hh"
00029 #include "libxorp/exceptions.hh"
00030 
00031 class WinRtmPipeObserver;
00032 struct WinRtmPipePlumber;
00033 
00039 class WinRtmPipe {
00040 public:
00041     WinRtmPipe(EventLoop& eventloop);
00042     ~WinRtmPipe();
00043 
00051     int start(int af, string& error_msg);
00052 
00059     int stop(string& error_msg);
00060 
00069     bool is_open() const { return _fd.is_valid(); }
00070 
00079     ssize_t write(const void* data, size_t nbytes);
00080 
00090     uint32_t seqno() const { return (_instance_no << 16 | _seqno); }
00091 
00097     pid_t pid() const { return _pid; }
00098 
00109     int force_read(string& error_msg);
00110 
00111 private:
00112     typedef list<WinRtmPipeObserver*> ObserverList;
00113 
00119     void io_event(XorpFd fd, IoEventType type);
00120 
00121     WinRtmPipe& operator=(const WinRtmPipe&);   // Not implemented
00122     WinRtmPipe(const WinRtmPipe&);      // Not implemented
00123 
00124 private:
00125     static const size_t ROUTING_SOCKET_BYTES = 8*1024; // Initial guess at msg size
00126 
00127 private:
00128     EventLoop&   _eventloop;
00129     XorpFd   _fd;
00130     ObserverList _ol;
00131 
00132     uint16_t     _seqno;    // Seqno of next write()
00133     uint16_t     _instance_no;  // Instance number of this routing socket
00134 
00135     static uint16_t _instance_cnt;
00136     static pid_t    _pid;
00137 
00138     friend class WinRtmPipePlumber; // class that hooks observers in and out
00139 };
00140 
00141 class WinRtmPipeObserver {
00142 public:
00143     WinRtmPipeObserver(WinRtmPipe& rs);
00144 
00145     virtual ~WinRtmPipeObserver();
00146 
00156     virtual void routing_socket_data(const vector<uint8_t>& buffer) = 0;
00157 
00161     WinRtmPipe& routing_socket();
00162 
00163 private:
00164     WinRtmPipe& _rs;
00165 };
00166 
00167 #endif // __FEA_DATA_PLANE_CONTROL_SOCKET_WINDOWS_RTM_PIPE_HH__
 All Classes Namespaces Functions Variables Typedefs Enumerations