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
50typedef unsigned int uint32_t;
51typedef unsigned short uint16_t;
56static const char * type_wvaddr =
"WvAddr";
57static const char * type_wvipaddr =
"WvIPAddr";
58static const char * type_wvipnet =
"WvIPNet";
59static 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); }
154unsigned 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;
An ARCnet address is made up of a single hex number.
Base class for different address types, each of which will have the ability to convert itself to/from...
Common packet encapsulation types, with the ability to convert a Linux ARPHRD_* value or (struct sock...
An ethernet address is made up of a string of hex numbers, in the form AA:BB:CC:DD:EE:FF.
A WvFastString acts exactly like a WvString, but can take (const char *) strings without needing to a...
An IP address is made up of a "dotted quad" – four decimal numbers in the form www....
An IP network comprises two WvIPAddr structures: an address and a netmask.
bool includes(const WvIPNet &addr) const
determine whether the given address is already included in this net
void include(const WvIPNet &addr)
adjust the netmask so that 'addr' would be included in this network
WvIPNet()
construct an empty IPNet for later copying (probably by operator=)
int bits() const
weird netmasks such as 255.0.255.0 (easy example) are almost never used – they have '0' bits in the m...
virtual unsigned WvHash() const
Override the hash and comparison functions.
WvIPAddr base() const
Get the 'base IP address' component, netmask, network, and broadcast.
bool is_default() const
is this net the default gateway? (0.0.0.0/0)
bool is_host() const
is it a plain host? (x.x.x.x/32)
An IP+Port address also includes a port number, with the resulting form www.xxx.yyy....
A WvAddr that simply contains a printable string with a user-defined encapsulation type.
WvString is an implementation of a simple and efficient printable-string class.
A Unix domain socket address is really just a filename.