From 99c0b8c510fb03e8f7d4bfb80cdf6569f8b0757f Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Sun, 26 Apr 2015 14:50:44 +0000 Subject: [PATCH] Neededn. FossilOrigin-Name: efab70167a08a6d19d3c1e6092155444f6f5d4327d5505aa70fec4136269e1d2 --- src/capwap/cw_out_capwap_local_ip_address.c | 71 +++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/capwap/cw_out_capwap_local_ip_address.c diff --git a/src/capwap/cw_out_capwap_local_ip_address.c b/src/capwap/cw_out_capwap_local_ip_address.c new file mode 100644 index 00000000..92e5b448 --- /dev/null +++ b/src/capwap/cw_out_capwap_local_ip_address.c @@ -0,0 +1,71 @@ +/* + This file is part of libcapwap. + + libcapwap is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + libcapwap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Foobar. If not, see . + +*/ + +#include +#include +#include + +#include +#include "capwap.h" +#include "capwap_items.h" + +#include "dbg.h" +#include "log.h" +#include "capwap.h" +#include "conn.h" + +int cw_out_capwap_local_ip_address(struct conn *conn, struct cw_action_out *action, uint8_t * dst) +{ + struct sockaddr_storage a; + socklen_t alen = sizeof(struct sockaddr_storage); + getsockname (conn->sock,(struct sockaddr *)&a,&alen); + + + switch (((struct sockaddr*)&a)->sa_family){ + case AF_INET: + { + struct sockaddr_in * sain = (struct sockaddr_in*)&a; + int id; + if (conn->capwap_mode == CW_MODE_CISCO) + id = CW_ELEM_WTP_IPV4_IP_ADDRESS; + else + id = CW_ELEM_CAPWAP_LOCAL_IPV4_ADDRESS; + + cw_put_data(dst+4,(uint8_t*)&sain->sin_addr,4); + return 4+cw_put_elem_hdr(dst,id,4); + } + + case AF_INET6: + { + int id; + if (conn->capwap_mode == CW_MODE_CISCO) + id = CW_ELEM_WTP_IPV6_IP_ADDRESS; + else + id = CW_ELEM_CAPWAP_LOCAL_IPV6_ADDRESS; + struct sockaddr_in6 * sain = (struct sockaddr_in6*)&a; + cw_put_data(dst,(uint8_t*)&sain->sin6_addr,16); + return 16+cw_put_elem_hdr(dst,id,16); + + } + } + + + return 0; +} + +