aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/gprs/gtphub.c
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2015-11-30 14:17:21 +0100
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2015-12-03 11:44:28 +0100
commit3fdba2ed5ab7ad6e0814aac37f440ea1e72c906b (patch)
treed73d0e05f79b70076c2cb56410db4f3e81bff516 /openbsc/src/gprs/gtphub.c
parent7559910e8ced14f718820d8bfeb419878185d153 (diff)
gtphub: cosmetic
Move the SGSN read callback next to the GGSN read callback. Comments. Tweak an initialization to NULL. Sponsored-by: On-Waves ehi
Diffstat (limited to 'openbsc/src/gprs/gtphub.c')
-rw-r--r--openbsc/src/gprs/gtphub.c100
1 files changed, 50 insertions, 50 deletions
diff --git a/openbsc/src/gprs/gtphub.c b/openbsc/src/gprs/gtphub.c
index dcfa823fa..971603a08 100644
--- a/openbsc/src/gprs/gtphub.c
+++ b/openbsc/src/gprs/gtphub.c
@@ -1378,7 +1378,6 @@ static void gtphub_map_restart_counter(struct gtphub *hub,
struct gtphub_peer_port *from,
struct gtphub_peer_port *to)
{
- /* Always send gtphub's own restart counter */
if (p->rc != GTP_RC_PDU_C)
return;
@@ -1387,6 +1386,7 @@ static void gtphub_map_restart_counter(struct gtphub *hub,
if (ie_idx < 0)
return;
+ /* Always send gtphub's own restart counter */
p->ie[ie_idx]->tv1.v = hton8(hub->restart_counter);
}
@@ -1764,6 +1764,38 @@ static int gtphub_write(const struct osmo_fd *to,
return 0;
}
+static int from_sgsns_read_cb(struct osmo_fd *from_sgsns_ofd, unsigned int what)
+{
+ unsigned int plane_idx = from_sgsns_ofd->priv_nr;
+ OSMO_ASSERT(plane_idx < GTPH_PLANE_N);
+ LOG(LOGL_DEBUG, "\n\n=== reading from SGSN (%s)\n",
+ gtphub_plane_idx_names[plane_idx]);
+
+ if (!(what & BSC_FD_READ))
+ return 0;
+
+ struct gtphub *hub = from_sgsns_ofd->data;
+
+ static uint8_t buf[4096];
+ struct osmo_sockaddr from_addr;
+ struct osmo_sockaddr to_addr;
+ struct osmo_fd *to_ofd;
+ int len;
+ uint8_t *reply_buf;
+
+ len = gtphub_read(from_sgsns_ofd, &from_addr, buf, sizeof(buf));
+ if (len < 1)
+ return 0;
+
+ len = gtphub_handle_buf(hub, GTPH_SIDE_SGSN, plane_idx, &from_addr,
+ buf, len, gtphub_now(),
+ &reply_buf, &to_ofd, &to_addr);
+ if (len < 1)
+ return 0;
+
+ return gtphub_write(to_ofd, &to_addr, reply_buf, len);
+}
+
static int from_ggsns_read_cb(struct osmo_fd *from_ggsns_ofd, unsigned int what)
{
unsigned int plane_idx = from_ggsns_ofd->priv_nr;
@@ -1807,18 +1839,18 @@ static int gtphub_unmap(struct gtphub *hub,
* replaced in the packet. Either way, give precedence to the proxy, if
* configured. */
+ if (unmapped_from_seq)
+ *unmapped_from_seq = NULL;
+ if (unmapped_from_tun)
+ *unmapped_from_tun = NULL;
+ if (final_unmapped)
+ *final_unmapped = NULL;
+
struct gtphub_peer_port *from_seq = NULL;
struct gtphub_peer_port *from_tei = NULL;
struct gtphub_peer_port *unmapped = NULL;
struct gtphub_tunnel *tun = NULL;
- if (unmapped_from_seq)
- *unmapped_from_seq = from_seq;
- if (unmapped_from_tun)
- *unmapped_from_tun = tun;
- if (final_unmapped)
- *final_unmapped = unmapped;
-
from_seq = gtphub_unmap_seq(p, from);
if (gtphub_unmap_header_tei(&from_tei, &tun, hub, p, from) < 0)
@@ -1875,21 +1907,21 @@ static int gsn_addr_to_sockaddr(struct gsn_addr *src,
/* If p is an Echo request, replace p's data with the matching response and
* return 1. If p is no Echo request, return 0, or -1 if an invalid packet is
* detected. */
-static int gtphub_handle_echo(struct gtphub *hub, struct gtp_packet_desc *p,
- uint8_t **reply_buf)
+static int gtphub_handle_echo_req(struct gtphub *hub, struct gtp_packet_desc *p,
+ uint8_t **reply_buf)
{
if (p->type != GTP_ECHO_REQ)
return 0;
static uint8_t echo_response_data[14] = {
- 0x32, /* flags */
+ 0x32, /* GTP v1 flags */
GTP_ECHO_RSP,
0x00, 14 - 8, /* Length in network byte order */
0x00, 0x00, 0x00, 0x00, /* Zero TEI */
0, 0, /* Seq, to be replaced */
0, 0, /* no extensions */
0x0e, /* Recovery IE */
- 0 /* Recovery counter, to be replaced */
+ 0 /* Restart counter, to be replaced */
};
uint16_t *seq = (uint16_t*)&echo_response_data[8];
uint8_t *recovery = &echo_response_data[13];
@@ -1945,7 +1977,7 @@ int gtphub_handle_buf(struct gtphub *hub,
rate_ctr_inc(&from_bind->counters_io->ctr[GTPH_CTR_PKTS_IN]);
int reply_len;
- reply_len = gtphub_handle_echo(hub, &p, reply_buf);
+ reply_len = gtphub_handle_echo_req(hub, &p, reply_buf);
if (reply_len > 0) {
/* It was an echo. Nothing left to do. */
osmo_sockaddr_copy(to_addr, from_addr);
@@ -1965,9 +1997,9 @@ int gtphub_handle_buf(struct gtphub *hub,
*to_ofd = &to_bind->ofd;
- /* If a GGSN proxy is configured, check that it's indeed that proxy
- * talking to us. A proxy is a forced 1:1 connection, e.g. to another
- * gtphub, so no-one else is allowed to talk to us from that side. */
+ /* If a proxy is configured, check that it's indeed that proxy talking
+ * to us. A proxy is a forced 1:1 connection, e.g. to another gtphub,
+ * so no-one else is allowed to talk to us from that side. */
struct gtphub_peer_port *from_peer = hub->proxy[side_idx][plane_idx];
if (from_peer) {
if (osmo_sockaddr_cmp(&from_peer->sa, from_addr) != 0) {
@@ -1990,8 +2022,8 @@ int gtphub_handle_buf(struct gtphub *hub,
}
/* If any PDP context has been created, we already have an entry for
- * this GGSN. If we don't have an entry, the GGSN has nothing to tell
- * us about. */
+ * this GSN. If we don't have an entry, a GGSN has nothing to tell us
+ * about, while an SGSN may initiate a PDP context. */
if (!from_peer) {
if (side_idx == GTPH_SIDE_GGSN) {
LOG(LOGL_ERROR, "Dropping packet: unknown GGSN peer: %s\n",
@@ -2086,38 +2118,6 @@ int gtphub_handle_buf(struct gtphub *hub,
return received;
}
-static int from_sgsns_read_cb(struct osmo_fd *from_sgsns_ofd, unsigned int what)
-{
- unsigned int plane_idx = from_sgsns_ofd->priv_nr;
- OSMO_ASSERT(plane_idx < GTPH_PLANE_N);
- LOG(LOGL_DEBUG, "\n\n=== reading from SGSN (%s)\n",
- gtphub_plane_idx_names[plane_idx]);
-
- if (!(what & BSC_FD_READ))
- return 0;
-
- struct gtphub *hub = from_sgsns_ofd->data;
-
- static uint8_t buf[4096];
- struct osmo_sockaddr from_addr;
- struct osmo_sockaddr to_addr;
- struct osmo_fd *to_ofd;
- int len;
- uint8_t *reply_buf;
-
- len = gtphub_read(from_sgsns_ofd, &from_addr, buf, sizeof(buf));
- if (len < 1)
- return 0;
-
- len = gtphub_handle_buf(hub, GTPH_SIDE_SGSN, plane_idx, &from_addr,
- buf, len, gtphub_now(),
- &reply_buf, &to_ofd, &to_addr);
- if (len < 1)
- return 0;
-
- return gtphub_write(to_ofd, &to_addr, reply_buf, len);
-}
-
static void resolved_gssn_del_cb(struct expiring_item *expi)
{
struct gtphub_resolved_ggsn *ggsn;