1 /**********
2 This library is free software; you can redistribute it and/or modify it under
3 the terms of the GNU Lesser General Public License as published by the
4 Free Software Foundation; either version 3 of the License, or (at your
5 option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
6 
7 This library is distributed in the hope that it will be useful, but WITHOUT
8 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9 FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
10 more details.
11 
12 You should have received a copy of the GNU Lesser General Public License
13 along with this library; if not, write to the Free Software Foundation, Inc.,
14 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
15 **********/
16 // "mTunnel" multicast access service
17 // Copyright (c) 1996-2020 Live Networks, Inc.  All rights reserved.
18 // Network Interfaces
19 // C++ header
20 
21 #ifndef _NET_INTERFACE_HH
22 #define _NET_INTERFACE_HH
23 
24 #ifndef _NET_ADDRESS_HH
25 #include "NetAddress.hh"
26 #endif
27 
28 class NetInterface {
29 public:
30   virtual ~NetInterface();
31 
32   static UsageEnvironment* DefaultUsageEnvironment;
33       // if non-NULL, used for each new interfaces
34 
35 protected:
36   NetInterface(); // virtual base class
37 };
38 
39 class DirectedNetInterface: public NetInterface {
40 public:
41   virtual ~DirectedNetInterface();
42 
43   virtual Boolean write(unsigned char* data, unsigned numBytes) = 0;
44 
45   virtual Boolean SourceAddrOKForRelaying(UsageEnvironment& env,
46 					  unsigned addr) = 0;
47 
48 protected:
49   DirectedNetInterface(); // virtual base class
50 };
51 
52 class DirectedNetInterfaceSet {
53 public:
54   DirectedNetInterfaceSet();
55   virtual ~DirectedNetInterfaceSet();
56 
57   DirectedNetInterface* Add(DirectedNetInterface const* interf);
58       // Returns the old value if different, otherwise 0
59   Boolean Remove(DirectedNetInterface const* interf);
60 
IsEmpty()61   Boolean IsEmpty() { return fTable->IsEmpty(); }
62 
63   // Used to iterate through the interfaces in the set
64   class Iterator {
65   public:
66     Iterator(DirectedNetInterfaceSet& interfaces);
67     virtual ~Iterator();
68 
69     DirectedNetInterface* next(); // NULL iff none
70 
71   private:
72     HashTable::Iterator* fIter;
73   };
74 
75 private:
76   friend class Iterator;
77   HashTable* fTable;
78 };
79 
80 class Socket: public NetInterface {
81 public:
82   virtual ~Socket();
83   void reset(); // closes the socket, and sets "fSocketNum" to -1
84 
85   virtual Boolean handleRead(unsigned char* buffer, unsigned bufferMaxSize,
86 			     unsigned& bytesRead,
87 			     struct sockaddr_storage& fromAddress) = 0;
88       // Returns False on error; resultData == NULL if data ignored
89 
socketNum() const90   int socketNum() const { return fSocketNum; }
91 
port() const92   Port port() const {
93     return fPort;
94   }
95 
env() const96   UsageEnvironment& env() const { return fEnv; }
97 
98   static int DebugLevel;
99 
100 protected:
101   Socket(UsageEnvironment& env, Port port); // virtual base class
102 
103   Boolean changePort(Port newPort); // will also cause socketNum() to change
104 
105 private:
106   int fSocketNum;
107   UsageEnvironment& fEnv;
108   Port fPort;
109 };
110 
111 UsageEnvironment& operator<<(UsageEnvironment& s, const Socket& sock);
112 
113 // A data structure for looking up a Socket by port:
114 
115 class SocketLookupTable {
116 public:
117   virtual ~SocketLookupTable();
118 
119   Socket* Fetch(UsageEnvironment& env, Port port, Boolean& isNew);
120   // Creates a new Socket if none already exists
121   Boolean Remove(Socket const* sock);
122 
123 protected:
124   SocketLookupTable(); // abstract base class
125   virtual Socket* CreateNew(UsageEnvironment& env, Port port) = 0;
126 
127 private:
128   HashTable* fTable;
129 };
130 
131 // A data structure for counting traffic:
132 
133 class NetInterfaceTrafficStats {
134 public:
135   NetInterfaceTrafficStats();
136 
137   void countPacket(unsigned packetSize);
138 
totNumPackets() const139   float totNumPackets() const {return fTotNumPackets;}
totNumBytes() const140   float totNumBytes() const {return fTotNumBytes;}
141 
142   Boolean haveSeenTraffic() const;
143 
144 private:
145   float fTotNumPackets;
146   float fTotNumBytes;
147 };
148 
149 #endif
150