12 #include "wvautoconf.h"
18 # include <sys/types.h>
29 # include <sys/socket.h>
31 #if HAVE_NET_ETHERNET_H
32 # include <net/ethernet.h>
37 #if HAVE_NETINET_IF_ETHER_H
38 # include <netinet/if_ether.h>
41 # include <netinet/in.h>
46 #define ETHER_ADDR_LEN 6
50 typedef unsigned int uint32_t;
51 typedef unsigned short uint16_t;
56 static const char * type_wvaddr =
"WvAddr";
57 static const char * type_wvipaddr =
"WvIPAddr";
58 static const char * type_wvipnet =
"WvIPNet";
59 static const char * type_wvipportaddr =
"WvIPPortAddr";
61 #define WVADDR type_wvaddr
62 #define WVIPADDR type_wvipaddr
63 #define WVIPNET type_wvipnet
64 #define WVIPPORTADDR type_wvipportaddr
74 static const char strings[][20];
100 WvEncap(CapType _cap = Unknown)
105 operator CapType ()
const
109 {
return strings[cap]; }
121 virtual WvString printable()
const = 0;
126 static WvAddr *gen(
struct sockaddr *addr);
128 virtual WvEncap encap()
const = 0;
130 {
return printable(); }
132 virtual bool comparator(
const WvAddr *a2,
bool first_pass =
true)
const;
134 virtual const char *type()
const
137 virtual bool isbroadcast()
const;
139 virtual struct sockaddr *sockaddr()
const = 0;
140 virtual size_t sockaddr_len()
const = 0;
141 virtual const unsigned char *rawdata()
const;
142 virtual size_t rawdata_len()
const;
144 virtual unsigned WvHash()
const;
146 bool operator== (
const WvAddr &a2)
const
147 {
return comparator(&a2); }
148 bool operator!= (
const WvAddr &a2)
const
149 {
return ! (*
this == a2); }
154 unsigned WvHash(
const WvAddr &addr);
174 virtual struct sockaddr *sockaddr()
const;
175 virtual size_t sockaddr_len()
const;
176 virtual const unsigned char *rawdata()
const;
177 virtual size_t rawdata_len()
const;
188 unsigned char binaddr[ETHER_ADDR_LEN];
194 WvEtherAddr(
const unsigned char _binaddr[ETHER_ADDR_LEN] = NULL)
195 {
if (_binaddr) memcpy(binaddr, _binaddr, ETHER_ADDR_LEN); }
197 { string_init(
string); }
199 { string_init(
string); }
200 void string_init(
const char string[]);
202 { memcpy(binaddr, (
void *)addr->sa_data, ETHER_ADDR_LEN); }
206 virtual bool isbroadcast()
const;
207 virtual struct sockaddr *sockaddr()
const;
208 virtual size_t sockaddr_len()
const;
209 virtual const unsigned char *rawdata()
const;
210 virtual size_t rawdata_len()
const;
217 unsigned char binaddr;
224 {
if (_binaddr) binaddr = _binaddr[0]; }
226 { binaddr = strtoul(
string, NULL, 16); }
228 { binaddr = strtoul(
string, NULL, 16); }
230 { binaddr = ((
unsigned char *)addr->sa_data)[0]; }
234 virtual struct sockaddr *sockaddr()
const;
235 virtual size_t sockaddr_len()
const;
236 virtual const unsigned char *rawdata()
const;
237 virtual size_t rawdata_len()
const;
254 unsigned char binaddr[4];
256 WvIPAddr(
const unsigned char *_binaddr)
257 {
if (_binaddr) memcpy(binaddr, _binaddr, 4); }
258 WvIPAddr(
const uint32_t _binaddr = 0)
259 { memcpy(binaddr, &_binaddr, 4); }
261 { string_init(
string); }
263 { string_init(
string); }
264 void string_init(
const char string[]);
265 WvIPAddr(
const struct sockaddr *addr)
267 (
void *)&((
struct sockaddr_in *)addr)->sin_addr.s_addr, 4); }
269 { memcpy(binaddr, _addr.binaddr, 4); }
272 virtual bool comparator(
const WvAddr *a2,
bool first_pass =
true)
const;
273 virtual const char *type()
const
274 {
return WVIPADDR; };
283 uint32_t addr()
const
284 {
return *(uint32_t *)binaddr; }
287 {
return addr() == 0; }
291 virtual struct sockaddr *sockaddr()
const;
292 virtual size_t sockaddr_len()
const;
293 virtual const unsigned char *rawdata()
const;
294 virtual size_t rawdata_len()
const;
321 { string_init(
string); }
323 { string_init(
string); }
324 void string_init(
const char string[]);
327 virtual bool comparator(
const WvAddr *a2,
bool first_pass =
true)
const;
328 virtual const char *type()
const
344 virtual unsigned WvHash()
const;
352 {
return *
this & mask; }
354 {
return *
this | ~mask; }
377 {
return mask.binaddr[0] == 0; }
381 {
return mask.binaddr[3] == 255; }
402 WvIPPortAddr(
const unsigned char _ipaddr[4], uint16_t _port = 0)
403 :
WvIPAddr(_ipaddr), port(_port) { };
406 { string_init(
string); }
408 { string_init(
string); }
409 void string_init(
const char string[]);
414 { port = ntohs(sin->sin_port); }
417 virtual bool comparator(
const WvAddr *a2,
bool first_pass =
true)
const;
418 virtual const char *type()
const
419 {
return WVIPPORTADDR; };
421 virtual struct sockaddr *sockaddr()
const;
424 virtual unsigned WvHash()
const;
443 virtual struct sockaddr *sockaddr()
const;
444 virtual size_t sockaddr_len()
const;
445 virtual const unsigned char *rawdata()
const;
446 virtual size_t rawdata_len()
const;
WvIPNet()
construct an empty IPNet for later copying (probably by operator=)
An IP network comprises two WvIPAddr structures: an address and a netmask.
WvIPAddr base() const
Get the 'base IP address' component, netmask, network, and broadcast.
virtual unsigned WvHash() const
Override the hash and comparison functions.
A WvAddr that simply contains a printable string with a user-defined encapsulation type.
An ethernet address is made up of a string of hex numbers, in the form AA:BB:CC:DD:EE:FF.
bool is_default() const
is this net the default gateway? (0.0.0.0/0)
An ARCnet address is made up of a single hex number.
WvString is an implementation of a simple and efficient printable-string class.
void include(const WvIPNet &addr)
adjust the netmask so that 'addr' would be included in this network
int bits() const
weird netmasks such as 255.0.255.0 (easy example) are almost never used – they have '0' bits in the m...
Common packet encapsulation types, with the ability to convert a Linux ARPHRD_* value or (struct sock...
bool includes(const WvIPNet &addr) const
determine whether the given address is already included in this net
An IP+Port address also includes a port number, with the resulting form www.xxx.yyy....
Base class for different address types, each of which will have the ability to convert itself to/from...
An IP address is made up of a "dotted quad" – four decimal numbers in the form www....
A Unix domain socket address is really just a filename.
bool is_host() const
is it a plain host? (x.x.x.x/32)