From 280110cff5df874e141b389f1d613eb4dab5b396 Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Sat, 12 Mar 2016 22:29:25 +0000 Subject: [PATCH] Initial commit. FossilOrigin-Name: 485328d348afe5c99c0186785890dd51d5c4c9be1f2ec4efc66282ac99e1d462 --- src/cw/cw_out_wtp_ip_address.c | 102 +++++++++++++++++++++++++++++++ src/cw/cw_put_local_ip_address.c | 51 ++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 src/cw/cw_out_wtp_ip_address.c create mode 100644 src/cw/cw_put_local_ip_address.c diff --git a/src/cw/cw_out_wtp_ip_address.c b/src/cw/cw_out_wtp_ip_address.c new file mode 100644 index 00000000..069852ea --- /dev/null +++ b/src/cw/cw_out_wtp_ip_address.c @@ -0,0 +1,102 @@ +/* + 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 . + +*/ + +/** + * @file + * @brief Implementation output handler of capwap cw_out_local_ip_address + */ + +#include +#include +#include +#include + +#include +#include "cw.h" +#include "capwap_items.h" + +#include "dbg.h" +#include "log.h" +#include "conn.h" + + +/** + * Output handler for Capwap Local IP Address message element. + * + * @param conn Connection object + * @param action Pointer to action which called this handler + * @param dst Destination buffer + * + * This handler determines the IP address from #conn->sock. + * It can deal both with IPv4 and IPv6 sockets. + * + */ +int cw_out_capwap_local_ip_address(struct conn *conn, struct cw_action_out *action, + uint8_t * dst) +{ + return cw_put_local_ip_address(conn->sock,dst,CW_ELEM_CAPWAP_LOCAL_IPV4_ADDRESS,CW_ELEM_CAPWAP_LOCAL_IPV6_ADDRESS); + + + struct sockaddr_storage a; + socklen_t alen = sizeof(struct sockaddr_storage); + int rc = getsockname(conn->sock, (struct sockaddr *) &a, &alen); + + if (rc != 0){ + cw_log(LOG_ERR,"Can't determine sock IP address - %s\n",strerror(errno)); + return 0; + } + + + int id; + + switch (((struct sockaddr *) &a)->sa_family) { + case AF_INET: + { + struct sockaddr_in *sain = (struct sockaddr_in *) &a; + + id = CW_ELEM_CAPWAP_LOCAL_IPV4_ADDRESS; + +/* 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: + { + id = CW_ELEM_CAPWAP_LOCAL_IPV6_ADDRESS; + +/* 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 + 4, (uint8_t *) & sain->sin6_addr, 16); + return 16 + cw_put_elem_hdr(dst, id, 16); + + } + } + + cw_log(DBG_MSG_ERR, "Can't determine CAPWAP Local IP Adress"); + return 0; +} diff --git a/src/cw/cw_put_local_ip_address.c b/src/cw/cw_put_local_ip_address.c new file mode 100644 index 00000000..0bb39b1f --- /dev/null +++ b/src/cw/cw_put_local_ip_address.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include + +#include "log.h" +#include "dbg.h" +#include "cw.h" + +int cw_put_local_ip_adress(int sock, uint8_t *dst, int ipv4elem_id, int ipv6elem_id) +{ + struct sockaddr_storage a; + socklen_t alen = sizeof(struct sockaddr_storage); + int rc = getsockname(sock, (struct sockaddr *) &a, &alen); + + if (rc != 0){ + cw_log(LOG_ERR,"Can't determine sock IP address - %s\n",strerror(errno)); + return 0; + } + + + int id; + + switch (((struct sockaddr *) &a)->sa_family) { + case AF_INET: + { + struct sockaddr_in *sain = (struct sockaddr_in *) &a; + id = ipv4elem_id; + cw_put_data(dst + 4, (uint8_t *) & sain->sin_addr, 4); + return 4 + cw_put_elem_hdr(dst, id, 4); + } + + case AF_INET6: + { + id = ipv6elem_id; + struct sockaddr_in6 *sain = (struct sockaddr_in6 *) &a; + cw_put_data(dst + 4, (uint8_t *) & sain->sin6_addr, 16); + return 16 + cw_put_elem_hdr(dst, id, 16); + + } + } + + cw_log(DBG_MSG_ERR, "Can't determine CAPWAP Local IP Adress"); + return 0; + +} + + + + +