00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef _PETHSOCKET
00035 #define _PETHSOCKET
00036
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040
00041 #include <ptlib/socket.h>
00042
00043 #ifdef _WIN32
00044 class PWin32PacketDriver;
00045 class PWin32SnmpLibrary;
00046 class PWin32PacketBuffer;
00047
00048 PARRAY(PWin32PackBufArray, PWin32PacketBuffer);
00049 #endif
00050
00054 class PEthSocket : public PSocket
00055 {
00056 PCLASSINFO(PEthSocket, PSocket);
00057
00058 public:
00064 PEthSocket(
00065 PINDEX nReadBuffers = 8,
00066 PINDEX nWriteBuffers = 1,
00067 PINDEX size = 1514
00068 );
00069
00071 ~PEthSocket();
00073
00074
00075 public:
00076 #pragma pack(1)
00077
00079 union Address {
00080 BYTE b[6];
00081 WORD w[3];
00082 struct {
00083 DWORD l;
00084 WORD s;
00085 } ls;
00086
00087 Address();
00088 Address(const BYTE * addr);
00089 Address(const Address & addr);
00090 Address(const PString & str);
00091 Address & operator=(const Address & addr);
00092 Address & operator=(const PString & str);
00093
00094 bool operator==(const BYTE * eth) const;
00095 bool operator!=(const BYTE * eth) const;
00096 bool operator==(const Address & eth) const { return ls.l == eth.ls.l && ls.s == eth.ls.s; }
00097 bool operator!=(const Address & eth) const { return ls.l != eth.ls.l || ls.s != eth.ls.s; }
00098
00099 operator PString() const;
00100
00101 friend ostream & operator<<(ostream & s, const Address & a)
00102 { return s << (PString)a; }
00103 };
00104
00107 struct Frame {
00108 Address dst_addr;
00109 Address src_addr;
00110 union {
00111 struct {
00112 WORD type;
00113 BYTE payload[1500];
00114 } ether;
00115 struct {
00116 WORD length;
00117 BYTE dsap;
00118 BYTE ssap;
00119 BYTE ctrl;
00120 BYTE oui[3];
00121 WORD type;
00122 BYTE payload[1492];
00123 } snap;
00124 };
00125
00130 void Parse(
00131 WORD & type,
00132 BYTE * & payload,
00133 PINDEX & length
00134 );
00135 };
00136 #pragma pack()
00137
00145 virtual PBoolean Close();
00146
00159 virtual PBoolean Read(
00160 void * buf,
00161 PINDEX len
00162 );
00163
00175 virtual PBoolean Write(
00176 const void * buf,
00177 PINDEX len
00178 );
00180
00190 virtual PBoolean Connect(
00191 const PString & address
00192 );
00193
00200 virtual PBoolean Listen(
00201 unsigned queueSize = 5,
00202 WORD port = 0,
00203 Reusability reuse = AddressIsExclusive
00204 );
00206
00207
00220 PBoolean EnumInterfaces(
00221 PINDEX idx,
00222 PString & name
00223 );
00224
00225
00231 PBoolean GetAddress(
00232 Address & addr
00233 );
00234
00240 PBoolean GetIpAddress(
00241 PIPSocket::Address & addr
00242 );
00243
00250 PBoolean GetIpAddress(
00251 PIPSocket::Address & addr,
00252 PIPSocket::Address & netMask
00253 );
00254
00264 PBoolean EnumIpAddress(
00265 PINDEX idx,
00266 PIPSocket::Address & addr,
00267 PIPSocket::Address & netMask
00268 );
00269
00270
00272 enum MediumTypes {
00274 MediumLoop,
00276 Medium802_3,
00278 MediumWan,
00280 MediumUnknown,
00281 NumMediumTypes
00282 };
00288 MediumTypes GetMedium();
00290
00291
00294
00295 enum EthTypes {
00297 TypeAll = 3,
00299 TypeIP = 0x800,
00301 TypeX25 = 0x805,
00303 TypeARP = 0x806,
00305 TypeAtalk = 0x809B,
00307 TypeAARP = 0x80F3,
00309 TypeIPX = 0x8137,
00311 TypeIPv6 = 0x86DD
00312 };
00313
00315 enum FilterMask {
00317 FilterDirected = 0x01,
00319 FilterMulticast = 0x02,
00321 FilterAllMulticast = 0x04,
00323 FilterBroadcast = 0x08,
00325 FilterPromiscuous = 0x10
00326 };
00327
00339 PBoolean GetFilter(
00340 unsigned & mask,
00341 WORD & type
00342 );
00343
00356 PBoolean SetFilter(
00357 unsigned mask,
00358 WORD type = TypeAll
00359 );
00361
00362
00367 PBoolean ResetAdaptor();
00368
00376 PBoolean ReadPacket(
00377 PBYTEArray & buffer,
00378 Address & dest,
00379 Address & src,
00380 WORD & type,
00381 PINDEX & len,
00382 BYTE * & payload
00383 );
00385
00386 protected:
00387 virtual PBoolean OpenSocket();
00388 virtual const char * GetProtocolName() const;
00389
00390
00391 WORD filterType;
00392
00393
00394
00395 #ifdef _WIN32
00396 #include "msos/ptlib/ethsock.h"
00397 #else
00398 #include "unix/ptlib/ethsock.h"
00399 #endif
00400 };
00401
00402 #endif
00403
00404