4 #include <netinet/ether.h>
15 Address::Address(uint32_t a):
20 for(unsigned i=0; i<4; ++i)
21 data[i] = a>>(24-i*8);
24 Address::Address(unsigned short t, const unsigned char *d, unsigned char l):
31 void Address::set_mask(const Address &mask)
33 if(mask.length!=length)
34 throw invalid_argument("Address::set_mask");
37 for(unsigned i=0; (i<length && mask.data[i]); ++i)
40 if(mask.data[i]!=0xFF)
42 for(unsigned d=mask.data[i]; !(d&1); d>>=1)
49 string Address::str() const
53 char buf[INET_ADDRSTRLEN];
54 return inet_ntop(AF_INET, data, buf, INET_ADDRSTRLEN);
60 unsigned Address::common_prefix_length(const Address &other) const
62 if(length!=other.length)
66 for(unsigned i=0; i<length; ++i)
69 if(data[i]!=other.data[i])
71 unsigned mismatch = data[i]^other.data[i];
72 for(; mismatch; mismatch>>=1)
81 bool Address::masked_match(const Address &other) const
83 unsigned prefix = common_prefix_length(other);
84 unsigned mask = min(mask_bits, other.mask_bits);
88 void Address::to_sockaddr(sockaddr_storage &sa) const
92 sockaddr_in &sa_in = reinterpret_cast<sockaddr_in &>(sa);
93 sa_in.sin_family = AF_INET;
95 sa_in.sin_addr.s_addr = *(uint32_t *)data;
98 throw runtime_error("Unknown type");
101 bool Address::operator<(const Address &other) const
103 if(length!=other.length)
104 return length<other.length;
105 for(unsigned i=0; i<length; ++i)
106 if(data[i]!=other.data[i])
107 return data[i]<other.data[i];