[MERGED] osmo-bsc[master]: libcommon: eliminate socket.c

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Wed Feb 14 18:53:14 UTC 2018


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 <laforge at 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 <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder



More information about the gerrit-log mailing list