/usr/include/groupsock/Groupsock.hh is in liblivemedia-dev 2016.02.09-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 | /**********
This library is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2.1 of the License, or (at your
option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
This library 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. See the GNU Lesser General Public License for
more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
**********/
// "mTunnel" multicast access service
// Copyright (c) 1996-2016 Live Networks, Inc. All rights reserved.
// 'Group sockets'
// C++ header
#ifndef _GROUPSOCK_HH
#define _GROUPSOCK_HH
#ifndef _GROUPSOCK_VERSION_HH
#include "groupsock_version.hh"
#endif
#ifndef _NET_INTERFACE_HH
#include "NetInterface.hh"
#endif
#ifndef _GROUPEID_HH
#include "GroupEId.hh"
#endif
// An "OutputSocket" is (by default) used only to send packets.
// No packets are received on it (unless a subclass arranges this)
class OutputSocket: public Socket {
public:
OutputSocket(UsageEnvironment& env);
virtual ~OutputSocket();
virtual Boolean write(netAddressBits address, portNumBits portNum/*in network order*/, u_int8_t ttl,
unsigned char* buffer, unsigned bufferSize);
Boolean write(struct sockaddr_in& addressAndPort, u_int8_t ttl,
unsigned char* buffer, unsigned bufferSize) {
return write(addressAndPort.sin_addr.s_addr, addressAndPort.sin_port, ttl, buffer, bufferSize);
}
protected:
OutputSocket(UsageEnvironment& env, Port port);
portNumBits sourcePortNum() const {return fSourcePort.num();}
private: // redefined virtual function
virtual Boolean handleRead(unsigned char* buffer, unsigned bufferMaxSize,
unsigned& bytesRead,
struct sockaddr_in& fromAddressAndPort);
private:
Port fSourcePort;
unsigned fLastSentTTL;
};
class destRecord {
public:
destRecord(struct in_addr const& addr, Port const& port, u_int8_t ttl, unsigned sessionId,
destRecord* next);
virtual ~destRecord();
public:
destRecord* fNext;
GroupEId fGroupEId;
unsigned fSessionId;
};
// A "Groupsock" is used to both send and receive packets.
// As the name suggests, it was originally designed to send/receive
// multicast, but it can send/receive unicast as well.
class Groupsock: public OutputSocket {
public:
Groupsock(UsageEnvironment& env, struct in_addr const& groupAddr,
Port port, u_int8_t ttl);
// used for a 'source-independent multicast' group
Groupsock(UsageEnvironment& env, struct in_addr const& groupAddr,
struct in_addr const& sourceFilterAddr,
Port port);
// used for a 'source-specific multicast' group
virtual ~Groupsock();
virtual destRecord* createNewDestRecord(struct in_addr const& addr, Port const& port, u_int8_t ttl, unsigned sessionId, destRecord* next);
// Can be redefined by subclasses that also subclass "destRecord"
void changeDestinationParameters(struct in_addr const& newDestAddr,
Port newDestPort, int newDestTTL,
unsigned sessionId = 0);
// By default, the destination address, port and ttl for
// outgoing packets are those that were specified in
// the constructor. This works OK for multicast sockets,
// but for unicast we usually want the destination port
// number, at least, to be different from the source port.
// (If a parameter is 0 (or ~0 for ttl), then no change is made to that parameter.)
// (If no existing "destRecord" exists with this "sessionId", then we add a new "destRecord".)
unsigned lookupSessionIdFromDestination(struct sockaddr_in const& destAddrAndPort) const;
// returns 0 if not found
// As a special case, we also allow multiple destinations (addresses & ports)
// (This can be used to implement multi-unicast.)
virtual void addDestination(struct in_addr const& addr, Port const& port, unsigned sessionId);
virtual void removeDestination(unsigned sessionId);
void removeAllDestinations();
Boolean hasMultipleDestinations() const { return fDests != NULL && fDests->fNext != NULL; }
struct in_addr const& groupAddress() const {
return fIncomingGroupEId.groupAddress();
}
struct in_addr const& sourceFilterAddress() const {
return fIncomingGroupEId.sourceFilterAddress();
}
Boolean isSSM() const {
return fIncomingGroupEId.isSSM();
}
u_int8_t ttl() const { return fIncomingGroupEId.ttl(); }
void multicastSendOnly(); // send, but don't receive any multicast packets
virtual Boolean output(UsageEnvironment& env, unsigned char* buffer, unsigned bufferSize,
DirectedNetInterface* interfaceNotToFwdBackTo = NULL);
DirectedNetInterfaceSet& members() { return fMembers; }
Boolean deleteIfNoMembers;
Boolean isSlave; // for tunneling
static NetInterfaceTrafficStats statsIncoming;
static NetInterfaceTrafficStats statsOutgoing;
static NetInterfaceTrafficStats statsRelayedIncoming;
static NetInterfaceTrafficStats statsRelayedOutgoing;
NetInterfaceTrafficStats statsGroupIncoming; // *not* static
NetInterfaceTrafficStats statsGroupOutgoing; // *not* static
NetInterfaceTrafficStats statsGroupRelayedIncoming; // *not* static
NetInterfaceTrafficStats statsGroupRelayedOutgoing; // *not* static
Boolean wasLoopedBackFromUs(UsageEnvironment& env, struct sockaddr_in& fromAddressAndPort);
public: // redefined virtual functions
virtual Boolean handleRead(unsigned char* buffer, unsigned bufferMaxSize,
unsigned& bytesRead,
struct sockaddr_in& fromAddressAndPort);
protected:
destRecord* lookupDestRecordFromDestination(struct sockaddr_in const& destAddrAndPort) const;
private:
void removeDestinationFrom(destRecord*& dests, unsigned sessionId);
// used to implement (the public) "removeDestination()", and "changeDestinationParameters()"
int outputToAllMembersExcept(DirectedNetInterface* exceptInterface,
u_int8_t ttlToFwd,
unsigned char* data, unsigned size,
netAddressBits sourceAddr);
protected:
destRecord* fDests;
private:
GroupEId fIncomingGroupEId;
DirectedNetInterfaceSet fMembers;
};
UsageEnvironment& operator<<(UsageEnvironment& s, const Groupsock& g);
// A data structure for looking up a 'groupsock'
// by (multicast address, port), or by socket number
class GroupsockLookupTable {
public:
Groupsock* Fetch(UsageEnvironment& env, netAddressBits groupAddress,
Port port, u_int8_t ttl, Boolean& isNew);
// Creates a new Groupsock if none already exists
Groupsock* Fetch(UsageEnvironment& env, netAddressBits groupAddress,
netAddressBits sourceFilterAddr,
Port port, Boolean& isNew);
// Creates a new Groupsock if none already exists
Groupsock* Lookup(netAddressBits groupAddress, Port port);
// Returns NULL if none already exists
Groupsock* Lookup(netAddressBits groupAddress,
netAddressBits sourceFilterAddr,
Port port);
// Returns NULL if none already exists
Groupsock* Lookup(UsageEnvironment& env, int sock);
// Returns NULL if none already exists
Boolean Remove(Groupsock const* groupsock);
// Used to iterate through the groupsocks in the table
class Iterator {
public:
Iterator(GroupsockLookupTable& groupsocks);
Groupsock* next(); // NULL iff none
private:
AddressPortLookupTable::Iterator fIter;
};
private:
Groupsock* AddNew(UsageEnvironment& env,
netAddressBits groupAddress,
netAddressBits sourceFilterAddress,
Port port, u_int8_t ttl);
private:
friend class Iterator;
AddressPortLookupTable fTable;
};
#endif
|