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(const in6_addr &a):
29 copy(a.s6_addr, a.s6_addr+16, data);
32 Address::Address(unsigned short t, const unsigned char *d, unsigned char l):
39 void Address::set_mask(const Address &mask)
41 if(mask.length!=length)
42 throw invalid_argument("Address::set_mask");
45 for(unsigned i=0; (i<length && mask.data[i]); ++i)
48 if(mask.data[i]!=0xFF)
50 for(unsigned d=mask.data[i]; !(d&1); d>>=1)
57 string Address::str() const
61 char buf[INET_ADDRSTRLEN];
62 return inet_ntop(AF_INET, data, buf, INET_ADDRSTRLEN);
64 else if(type==ETH_P_IPV6)
66 char buf[INET6_ADDRSTRLEN];
67 return inet_ntop(AF_INET6, data, buf, INET6_ADDRSTRLEN);
73 unsigned Address::common_prefix_length(const Address &other) const
75 if(length!=other.length)
79 for(unsigned i=0; i<length; ++i)
82 if(data[i]!=other.data[i])
84 unsigned mismatch = data[i]^other.data[i];
85 for(; mismatch; mismatch>>=1)
94 bool Address::masked_match(const Address &other) const
96 unsigned prefix = common_prefix_length(other);
97 unsigned mask = min(mask_bits, other.mask_bits);
101 void Address::to_sockaddr(sockaddr_storage &sa) const
105 sockaddr_in &sa_in = reinterpret_cast<sockaddr_in &>(sa);
106 sa_in.sin_family = AF_INET;
108 sa_in.sin_addr.s_addr = *(uint32_t *)data;
110 else if(type==ETH_P_IPV6)
112 sockaddr_in6 &sa_in6 = reinterpret_cast<sockaddr_in6 &>(sa);
113 sa_in6.sin6_family = AF_INET6;
114 sa_in6.sin6_port = 0;
115 sa_in6.sin6_flowinfo = 0;
116 copy(data, data+16, sa_in6.sin6_addr.s6_addr);
117 sa_in6.sin6_scope_id = 0;
120 throw runtime_error("Unknown type");
123 bool Address::operator<(const Address &other) const
125 if(length!=other.length)
126 return length<other.length;
127 for(unsigned i=0; i<length; ++i)
128 if(data[i]!=other.data[i])
129 return data[i]<other.data[i];