Skip to content

Commit 92f31b5

Browse files
committed
switch: properly handle GTP-C split while masquarading F-TEID IP Address
1 parent 58cf09f commit 92f31b5

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

src/gtp_switch_hdl_v1.c

+12-1
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,15 @@ gtp1_create_teid(uint8_t type, int direction, gtp_server_worker_t *w, gtp_htab_t
4747
gtp_teid_t *teid;
4848
gtp_server_t *srv = w->srv;
4949
gtp_switch_t *ctx = srv->ctx;
50+
gtp_server_t *srv_gtpc_ingress = &ctx->gtpc;
51+
gtp_server_t *srv_gtpc_egress = &ctx->gtpc_egress;
52+
gtp_server_t *srv_gtpu = &ctx->gtpu;
5053

5154
/* Determine if this is related to an existing VTEID.
5255
* If so need to restore original TEID related, otherwise
5356
* create a new VTEID */
54-
if (*f_teid->ipv4 == ((struct sockaddr_in *) &srv->addr)->sin_addr.s_addr) {
57+
if ((*f_teid->ipv4 == ((struct sockaddr_in *) &srv_gtpc_ingress->addr)->sin_addr.s_addr) ||
58+
(*f_teid->ipv4 == ((struct sockaddr_in *) &srv_gtpc_egress->addr)->sin_addr.s_addr)) {
5559
teid = gtp_vteid_get(&ctx->vteid_tab, ntohl(*f_teid->teid_grekey));
5660
if (!teid)
5761
return NULL;
@@ -82,6 +86,13 @@ gtp1_create_teid(uint8_t type, int direction, gtp_server_worker_t *w, gtp_htab_t
8286
gtp_sqn_update(w, teid);
8387

8488
/* TEID masquarade */
89+
srv = srv_gtpu;
90+
if (type == GTP_TEID_C) {
91+
srv = srv_gtpc_ingress;
92+
if (__test_bit(GTP_FL_CTL_BIT, &srv_gtpc_egress->flags) &&
93+
__test_bit(GTP_TEID_FL_INGRESS, &teid->flags))
94+
srv = srv_gtpc_egress;
95+
}
8596
gtp_teid_masq(f_teid, &srv->addr, teid->vid);
8697

8798
return teid;

src/gtp_switch_hdl_v2.c

+12-1
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,15 @@ gtp_create_teid(uint8_t type, int direction, gtp_server_worker_t *w, gtp_htab_t
6161
gtp_teid_t *teid;
6262
gtp_server_t *srv = w->srv;
6363
gtp_switch_t *ctx = srv->ctx;
64+
gtp_server_t *srv_gtpc_ingress = &ctx->gtpc;
65+
gtp_server_t *srv_gtpc_egress = &ctx->gtpc_egress;
66+
gtp_server_t *srv_gtpu = &ctx->gtpu;
6467

6568
/* Determine if this is related to an existing VTEID.
6669
* If so need to restore original TEID related, otherwise
6770
* create a new VTEID */
68-
if (*f_teid->ipv4 == ((struct sockaddr_in *) &srv->addr)->sin_addr.s_addr) {
71+
if ((*f_teid->ipv4 == ((struct sockaddr_in *) &srv_gtpc_ingress->addr)->sin_addr.s_addr) ||
72+
(*f_teid->ipv4 == ((struct sockaddr_in *) &srv_gtpc_egress->addr)->sin_addr.s_addr)) {
6973
teid = gtp_vteid_get(&ctx->vteid_tab, ntohl(*f_teid->teid_grekey));
7074
if (!teid)
7175
return NULL;
@@ -101,6 +105,13 @@ gtp_create_teid(uint8_t type, int direction, gtp_server_worker_t *w, gtp_htab_t
101105
gtp_update_bearer_id(teid, bearer_id);
102106

103107
/* TEID masquarade */
108+
srv = srv_gtpu;
109+
if (type == GTP_TEID_C) {
110+
srv = srv_gtpc_ingress;
111+
if (__test_bit(GTP_FL_CTL_BIT, &srv_gtpc_egress->flags) &&
112+
__test_bit(GTP_TEID_FL_INGRESS, &teid->flags))
113+
srv = srv_gtpc_egress;
114+
}
104115
gtp_teid_masq(f_teid, &srv->addr, teid->vid);
105116

106117
return teid;

0 commit comments

Comments
 (0)