Harald Welte has submitted this change and it was merged. Change subject: libcommon: eliminate socket.c ......................................................................
libcommon: eliminate socket.c Replace calls to make_sock() with osmo_sock_init_ofd(). Shame on me for not testing every single one in practice, I hope for peer review to confirm that this should be correct... Read closely please! The IPPROTO_GRE define seems to be unused (at least in osmo-bsc.git), drop it completely. Change-Id: Ia6e4e0e1eed3328fa25b3b90be376d532ad0e56b --- M include/osmocom/bsc/Makefile.am D include/osmocom/bsc/socket.h M src/ipaccess/ipaccess-proxy.c M src/libcommon/Makefile.am D src/libcommon/socket.c M src/osmo-bsc_nat/bsc_nat.c M src/osmo-bsc_nat/bsc_ussd.c 7 files changed, 37 insertions(+), 158 deletions(-) Approvals: Harald Welte: Looks good to me, approved Jenkins Builder: Verified diff --git a/include/osmocom/bsc/Makefile.am b/include/osmocom/bsc/Makefile.am index 699aeb3..1a43be4 100644 --- a/include/osmocom/bsc/Makefile.am +++ b/include/osmocom/bsc/Makefile.am @@ -48,7 +48,6 @@ rest_octets.h \ rs232.h \ signal.h \ - socket.h \ system_information.h \ ussd.h \ vty.h \ diff --git a/include/osmocom/bsc/socket.h b/include/osmocom/bsc/socket.h deleted file mode 100644 index 0fd85f1..0000000 --- a/include/osmocom/bsc/socket.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _BSC_SOCKET_H -#define _BSC_SOCKET_H - -#include <osmocom/core/select.h> - -#ifndef IPPROTO_GRE -#define IPPROTO_GRE 47 -#endif - -int make_sock(struct osmo_fd *bfd, int proto, - uint32_t ip, uint16_t port, int priv_nr, - int (*cb)(struct osmo_fd *fd, unsigned int what), void *data); - -#endif /* _BSC_SOCKET_H */ diff --git a/src/ipaccess/ipaccess-proxy.c b/src/ipaccess/ipaccess-proxy.c index 40749ee..5cf6d6d 100644 --- a/src/ipaccess/ipaccess-proxy.c +++ b/src/ipaccess/ipaccess-proxy.c @@ -47,7 +47,7 @@ #include <osmocom/abis/ipaccess.h> #include <osmocom/bsc/debug.h> #include <osmocom/bsc/ipaccess.h> -#include <osmocom/bsc/socket.h> +#include <osmocom/core/socket.h> #include <osmocom/core/talloc.h> /* one instance of an ip.access protocol proxy */ @@ -369,8 +369,11 @@ /* Create UDP socket for BTS packet injection */ udp_port = 10000 + (site_id % 1000)*100 + (bts_id % 100); - ret = make_sock(&ipbc->udp_bts_fd, IPPROTO_UDP, INADDR_ANY, udp_port, - UDP_TO_BTS, udp_fd_cb, ipbc); + ipbc->udp_bts_fd.priv_nr = UDP_TO_BTS; + ipbc->udp_bts_fd.cb = udp_fd_cb; + ipbc->udp_bts_fd.data = ipbc; + ret = osmo_sock_init_ofd(&ipbc->udp_bts_fd, AF_INET, SOCK_DGRAM, IPPROTO_UDP, + NULL, udp_port, OSMO_SOCK_F_BIND); if (ret < 0) goto err_udp_bts; DEBUGP(DLINP, "(%u/%u/%u) Created UDP socket for injection " @@ -378,8 +381,11 @@ /* Create UDP socket for BSC packet injection */ udp_port = 20000 + (site_id % 1000)*100 + (bts_id % 100); - ret = make_sock(&ipbc->udp_bsc_fd, IPPROTO_UDP, INADDR_ANY, udp_port, - UDP_TO_BSC, udp_fd_cb, ipbc); + ipbc->udp_bsc_fd.priv_nr = UDP_TO_BSC; + ipbc->udp_bsc_fd.cb = udp_fd_cb; + ipbc->udp_bsc_fd.data = ipbc; + ret = osmo_sock_init_ofd(&ipbc->udp_bsc_fd, AF_INET, SOCK_DGRAM, IPPROTO_UDP, + NULL, udp_port, OSMO_SOCK_F_BIND); if (ret < 0) goto err_udp_bsc; DEBUGP(DLINP, "(%u/%u/%u) Created UDP socket for injection " @@ -390,13 +396,12 @@ if (gprs_ns_ipaddr) { struct sockaddr_in sock; socklen_t len = sizeof(sock); - struct in_addr addr; - uint32_t ip; - inet_aton(listen_ipaddr, &addr); - ip = ntohl(addr.s_addr); /* make_sock() needs host byte order */ - ret = make_sock(&ipbc->gprs_ns_fd, IPPROTO_UDP, ip, 0, 0, - gprs_ns_cb, ipbc); + ipbc->gprs_ns_fd.priv_nr = 0; + ipbc->gprs_ns_fd.cb = gprs_ns_cb; + ipbc->gprs_ns_fd.data = ipbc; + ret = osmo_sock_init_ofd(&ipbc->gprs_ns_fd, AF_INET, SOCK_DGRAM, IPPROTO_UDP, + listen_ipaddr, 0, OSMO_SOCK_F_BIND); if (ret < 0) { LOGP(DLINP, LOGL_ERROR, "Creating the GPRS socket failed.\n"); goto err_udp_bsc; @@ -1062,15 +1067,18 @@ osmo_timer_setup(&ipp->reconn_timer, reconn_tmr_cb, ipp); /* Listen for OML connections */ - ret = make_sock(&ipp->oml_listen_fd, IPPROTO_TCP, INADDR_ANY, - IPA_TCP_PORT_OML, OML_FROM_BTS, listen_fd_cb, NULL); + ipp->oml_listen_fd.priv_nr = OML_FROM_BTS; + ipp->oml_listen_fd.cb = listen_fd_cb; + ret = osmo_sock_init_ofd(&ipp->oml_listen_fd, AF_INET, SOCK_STREAM, IPPROTO_TCP, + NULL, IPA_TCP_PORT_OML, OSMO_SOCK_F_BIND); if (ret < 0) return ret; /* Listen for RSL connections */ - ret = make_sock(&ipp->rsl_listen_fd, IPPROTO_TCP, INADDR_ANY, - IPA_TCP_PORT_RSL, RSL_FROM_BTS, listen_fd_cb, NULL); - + ipp->rsl_listen_fd.priv_nr = RSL_FROM_BTS; + ipp->rsl_listen_fd.cb = listen_fd_cb; + ret = osmo_sock_init_ofd(&ipp->rsl_listen_fd, AF_INET, SOCK_STREAM, IPPROTO_TCP, + NULL, IPA_TCP_PORT_RSL, OSMO_SOCK_F_BIND); if (ret < 0) return ret; diff --git a/src/libcommon/Makefile.am b/src/libcommon/Makefile.am index 1f7f5c4..a6ef44e 100644 --- a/src/libcommon/Makefile.am +++ b/src/libcommon/Makefile.am @@ -22,7 +22,6 @@ libcommon_a_SOURCES = \ gsm_data.c \ gsm_data_shared.c \ - socket.c \ talloc_ctx.c \ handover_cfg.c \ $(NULL) diff --git a/src/libcommon/socket.c b/src/libcommon/socket.c deleted file mode 100644 index 78aacdb..0000000 --- a/src/libcommon/socket.c +++ /dev/null @@ -1,111 +0,0 @@ -/* OpenBSC sokcet code, taken from Abis input driver for ip.access */ - -/* (C) 2009 by Harald Welte <lafo...@gnumonks.org> - * (C) 2010 by Holger Hans Peter Freyther - * (C) 2010 by On-Waves - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <unistd.h> -#include <stdlib.h> -#include <errno.h> -#include <string.h> -#include <time.h> -#include <sys/fcntl.h> -#include <sys/socket.h> -#include <sys/ioctl.h> -#include <arpa/inet.h> - -#include <osmocom/core/select.h> -#include <osmocom/gsm/tlv.h> -#include <osmocom/core/msgb.h> -#include <osmocom/bsc/debug.h> -#include <osmocom/bsc/gsm_data.h> -#include <osmocom/core/talloc.h> - -int make_sock(struct osmo_fd *bfd, int proto, - uint32_t ip, uint16_t port, int priv_nr, - int (*cb)(struct osmo_fd *fd, unsigned int what), void *data) -{ - struct sockaddr_in addr; - int ret, on = 1; - int type = SOCK_STREAM; - - switch (proto) { - case IPPROTO_TCP: - type = SOCK_STREAM; - break; - case IPPROTO_UDP: - type = SOCK_DGRAM; - break; -#ifdef IPPROTO_GRE - case IPPROTO_GRE: - type = SOCK_RAW; - break; -#endif - default: - return -EINVAL; - } - - bfd->fd = socket(AF_INET, type, proto); - bfd->cb = cb; - bfd->when = BSC_FD_READ; - bfd->data = data; - bfd->priv_nr = priv_nr; - - if (bfd->fd < 0) { - LOGP(DLINP, LOGL_ERROR, "could not create socket.\n"); - return -EIO; - } - - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - if (ip != INADDR_ANY) - addr.sin_addr.s_addr = htonl(ip); - else - addr.sin_addr.s_addr = INADDR_ANY; - - setsockopt(bfd->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); - - ret = bind(bfd->fd, (struct sockaddr *) &addr, sizeof(addr)); - if (ret < 0) { - LOGP(DLINP, LOGL_ERROR, "could not bind socket %s\n", - strerror(errno)); - close(bfd->fd); - return -EIO; - } - - if (proto == IPPROTO_TCP) { - ret = listen(bfd->fd, 1); - if (ret < 0) { - perror("listen"); - close(bfd->fd); - return ret; - } - } - - ret = osmo_fd_register(bfd); - if (ret < 0) { - perror("register_listen_fd"); - close(bfd->fd); - return ret; - } - return 0; -} diff --git a/src/osmo-bsc_nat/bsc_nat.c b/src/osmo-bsc_nat/bsc_nat.c index c1c7913..2f8d325 100644 --- a/src/osmo-bsc_nat/bsc_nat.c +++ b/src/osmo-bsc_nat/bsc_nat.c @@ -46,7 +46,6 @@ #include <osmocom/bsc/bsc_msg_filter.h> #include <osmocom/bsc/ipaccess.h> #include <osmocom/bsc/abis_nm.h> -#include <osmocom/bsc/socket.h> #include <osmocom/bsc/vty.h> #include <osmocom/ctrl/control_cmd.h> @@ -59,6 +58,7 @@ #include <osmocom/core/application.h> #include <osmocom/core/talloc.h> #include <osmocom/core/stats.h> +#include <osmocom/core/socket.h> #include <osmocom/gsm/tlv.h> #include <osmocom/gsm/gsm0808.h> @@ -80,7 +80,7 @@ #define SCCP_CLOSE_TIME_TIMEOUT 19 static const char *config_file = "bsc-nat.cfg"; -static struct in_addr local_addr; +static const char *local_addr; static struct osmo_fd bsc_listen; static const char *msc_ip = NULL; static struct osmo_timer_list sccp_close; @@ -1507,7 +1507,7 @@ msc_ip = optarg; break; case 'l': - inet_aton(optarg, &local_addr); + local_addr = optarg; break; default: /* ignore */ @@ -1693,7 +1693,7 @@ /* parse options */ - local_addr.s_addr = INADDR_ANY; + local_addr = NULL; handle_options(argc, argv); nat->include_base = dirname(talloc_strdup(tall_bsc_ctx, config_file)); @@ -1757,8 +1757,10 @@ bsc_msc_connect(nat->msc_con); /* wait for the BSC */ - rc = make_sock(&bsc_listen, IPPROTO_TCP, ntohl(local_addr.s_addr), - 5000, 0, ipaccess_listen_bsc_cb, nat); + bsc_listen.cb = ipaccess_listen_bsc_cb; + bsc_listen.data = nat; + rc = osmo_sock_init_ofd(&bsc_listen, AF_INET, SOCK_STREAM, IPPROTO_TCP, + local_addr, 5000, OSMO_SOCK_F_BIND); if (rc != 0) { fprintf(stderr, "Failed to listen for BSC.\n"); exit(1); diff --git a/src/osmo-bsc_nat/bsc_ussd.c b/src/osmo-bsc_nat/bsc_ussd.c index 20df8d1..985a558 100644 --- a/src/osmo-bsc_nat/bsc_ussd.c +++ b/src/osmo-bsc_nat/bsc_ussd.c @@ -20,11 +20,12 @@ * */ +#include <osmocom/core/socket.h> + #include <osmocom/bsc/bsc_nat.h> #include <osmocom/bsc/bsc_nat_sccp.h> #include <osmocom/bsc/bsc_msg_filter.h> #include <osmocom/bsc/ipaccess.h> -#include <osmocom/bsc/socket.h> #include <osmocom/bsc/debug.h> #include <osmocom/gsm/protocol/gsm_08_08.h> @@ -282,15 +283,10 @@ int bsc_ussd_init(struct bsc_nat *nat) { - struct in_addr addr; - - addr.s_addr = INADDR_ANY; - if (nat->ussd_local) - inet_aton(nat->ussd_local, &addr); - + nat->ussd_listen.cb = ussd_listen_cb; nat->ussd_listen.data = nat; - return make_sock(&nat->ussd_listen, IPPROTO_TCP, - ntohl(addr.s_addr), 5001, 0, ussd_listen_cb, nat); + return osmo_sock_init_ofd(&nat->ussd_listen, AF_INET, SOCK_STREAM, IPPROTO_TCP, + nat->ussd_local, 5001, OSMO_SOCK_F_BIND); } static int forward_ussd_simple(struct nat_sccp_connection *con, struct msgb *input) -- To view, visit https://gerrit.osmocom.org/6431 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ia6e4e0e1eed3328fa25b3b90be376d532ad0e56b Gerrit-PatchSet: 3 Gerrit-Project: osmo-bsc Gerrit-Branch: master Gerrit-Owner: Neels Hofmeyr <nhofm...@sysmocom.de> Gerrit-Reviewer: Harald Welte <lafo...@gnumonks.org> Gerrit-Reviewer: Jenkins Builder