rework socket and discovery handling

Swtich sockets to connected when talking to a specific AC. Use
unconnected UDP sockets only during DISCOVERY.

In JOIN, we need send our local address. The old, routing table
based local address discovery is broken for many reasons (VRF,
policy routing, ...). With a connected socket, we can the same
information with a simple getsockname.

During DISCOVERY we are talking to all potential AC's at once.
So using an unconnected socket makes still sense.
This commit is contained in:
Andreas Schultz
2016-03-02 15:13:56 +01:00
parent 067eb8d11a
commit 8dc30ae3c4
5 changed files with 121 additions and 46 deletions

View File

@ -143,6 +143,15 @@ int capwap_bind_sockets(struct capwap_network* net) {
return result;
}
/* */
int capwap_connect_socket(struct capwap_network* net, union sockaddr_capwap *peeraddr)
{
if (net->socket < 0)
return -1;
return connect(net->socket, &peeraddr->sa, sizeof(peeraddr->ss));
}
/* Close socket */
void capwap_close_sockets(struct capwap_network* net) {
ASSERT(net != NULL);
@ -154,6 +163,17 @@ void capwap_close_sockets(struct capwap_network* net) {
}
}
/* */
int capwap_getsockname(struct capwap_network* net, union sockaddr_capwap *addr)
{
socklen_t addrlen = sizeof(addr->ss);
if (net->socket < 0)
return -1;
return getsockname(net->socket, &addr->sa, &addrlen);
}
/* */
int capwap_ipv4_mapped_ipv6(union sockaddr_capwap* addr) {
uint32_t inetaddr;

View File

@ -56,8 +56,11 @@ int capwap_get_macaddress_from_interface(const char* interface, char* macaddress
int capwap_network_get_localaddress(union sockaddr_capwap* localaddr, union sockaddr_capwap* peeraddr, char* iface);
int capwap_bind_sockets(struct capwap_network* net);
int capwap_connect_socket(struct capwap_network* net, union sockaddr_capwap *peeraddr);
void capwap_close_sockets(struct capwap_network* net);
int capwap_getsockname(struct capwap_network* net, union sockaddr_capwap *addr);
int capwap_ipv4_mapped_ipv6(union sockaddr_capwap* addr);
int capwap_compare_ip(union sockaddr_capwap* addr1, union sockaddr_capwap* addr2);