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
108 operator WvString ()
const
109 {
return strings[cap]; }
121 virtual WvString printable()
const = 0;
125 virtual ~WvAddr() {};
126 static WvAddr *gen(
struct sockaddr *addr);
128 virtual WvEncap encap()
const = 0;
129 operator WvString()
const
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);
167 virtual WvString printable()
const;
170 WvStringAddr(WvStringParm s,
const WvEncap &_cap);
171 WvStringAddr(
const struct sockaddr *_addr);
172 virtual ~WvStringAddr();
173 virtual WvEncap encap()
const;
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];
191 virtual WvString printable()
const;
194 WvEtherAddr(
const unsigned char _binaddr[ETHER_ADDR_LEN] = NULL)
195 {
if (_binaddr) memcpy(binaddr, _binaddr, ETHER_ADDR_LEN); }
196 WvEtherAddr(
const char string[])
197 { string_init(
string); }
198 WvEtherAddr(WvStringParm
string)
199 { string_init(
string); }
200 void string_init(
const char string[]);
201 WvEtherAddr(
const struct sockaddr *addr)
202 { memcpy(binaddr, (
void *)addr->sa_data, ETHER_ADDR_LEN); }
203 virtual ~WvEtherAddr();
205 virtual WvEncap encap()
const;
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;
220 virtual WvString printable()
const;
223 WvARCnetAddr(
const unsigned char _binaddr[1] = NULL)
224 {
if (_binaddr) binaddr = _binaddr[0]; }
225 WvARCnetAddr(
const char string[])
226 { binaddr = strtoul(
string, NULL, 16); }
227 WvARCnetAddr(WvStringParm
string)
228 { binaddr = strtoul(
string, NULL, 16); }
229 WvARCnetAddr(
const struct sockaddr *addr)
230 { binaddr = ((
unsigned char *)addr->sa_data)[0]; }
231 virtual ~WvARCnetAddr();
233 virtual WvEncap encap()
const;
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;
252 virtual WvString printable()
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); }
260 WvIPAddr(
const char string[])
261 { string_init(
string); }
262 WvIPAddr(WvStringParm
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); }
268 WvIPAddr(
const WvIPAddr &_addr)
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; };
276 WvIPAddr operator& (
const WvIPAddr &a2)
const;
277 WvIPAddr operator| (
const WvIPAddr &a2)
const;
278 WvIPAddr operator^ (
const WvIPAddr &a2)
const;
279 WvIPAddr operator~ ()
const;
280 WvIPAddr operator+ (
int n)
const;
281 WvIPAddr operator- (
int n)
const;
283 uint32_t addr()
const
284 {
return *(uint32_t *)binaddr; }
287 {
return addr() == 0; }
289 virtual WvEncap encap()
const;
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;
316 virtual WvString printable()
const;
320 WvIPNet(
const char string[]) : WvIPAddr(string)
321 { string_init(
string); }
322 WvIPNet(WvStringParm
string) : WvIPAddr(string)
323 { string_init(
string); }
324 void string_init(
const char string[]);
325 WvIPNet(
const WvIPAddr &
base,
const WvIPAddr &_mask);
327 virtual bool comparator(
const WvAddr *a2,
bool first_pass =
true)
const;
328 virtual const char *type()
const
351 WvIPAddr network()
const
352 {
return *
this & mask; }
353 WvIPAddr broadcast()
const
354 {
return *
this | ~mask; }
377 {
return mask.binaddr[0] == 0; }
381 {
return mask.binaddr[3] == 255; }
396 virtual WvString printable()
const;
402 WvIPPortAddr(
const unsigned char _ipaddr[4], uint16_t _port = 0)
403 : WvIPAddr(_ipaddr), port(_port) { };
404 WvIPPortAddr(
const WvIPAddr &_ipaddr, uint16_t _port = 0);
405 WvIPPortAddr(
const char string[]) : WvIPAddr(string)
406 { string_init(
string); }
407 WvIPPortAddr(WvStringParm
string) : WvIPAddr(string)
408 { string_init(
string); }
409 void string_init(
const char string[]);
410 WvIPPortAddr(uint16_t _port);
411 WvIPPortAddr(
const char string[], uint16_t _port);
413 WvIPPortAddr(
struct sockaddr_in *sin) : WvIPAddr(sin->sin_addr.s_addr)
414 { port = ntohs(sin->sin_port); }
415 virtual ~WvIPPortAddr();
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;
433 virtual WvString printable()
const;
436 WvUnixAddr(
const char *_sockname);
437 WvUnixAddr(WvStringParm _sockname);
438 WvUnixAddr(
const WvUnixAddr &_addr);
439 virtual ~WvUnixAddr();
441 virtual WvEncap encap()
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.
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=)
WvIPNet(const WvIPAddr &base, int bits=32)
construct an IPNet from a base address and a number of bits in the netmask.
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?
bool is_host() const
is it a plain host?
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.
A Unix domain socket address is really just a filename.