Skip to content

Commit 1634a89

Browse files
authored
Merge pull request #38 from vjardin/vj_misclogs
KPI: update logs, add show some show workers, add GTPu/c stats
2 parents 84efd92 + ebf18e1 commit 1634a89

15 files changed

+687
-19
lines changed

src/gtp_disk.c

+79
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <fcntl.h>
2828
#include <dirent.h>
2929
#include <errno.h>
30+
#include <sys/un.h>
3031

3132
/* local includes */
3233
#include "gtp_guard.h"
@@ -71,3 +72,81 @@ gtp_disk_read_restart_counter(void)
7172
fclose(fcounter);
7273
return daemon_data->restart_counter;
7374
}
75+
76+
char *
77+
gtp_disk_fd2filename(int fd, char *buffer, size_t bufsize)
78+
{
79+
struct stat statbuf;
80+
#define RETERROR(s) { \
81+
snprintf(buffer, bufsize, s); \
82+
return s; \
83+
}
84+
85+
if (fd < 0 || buffer == NULL || bufsize == 0)
86+
RETERROR("invalid");
87+
88+
/* what is fd ? socket, regular file name, etc... (could be used to get pipe, etc.) */
89+
if (fstat(fd, &statbuf) == -1) {
90+
snprintf(buffer, bufsize, "error: %s", strerror(errno));
91+
return buffer;
92+
}
93+
94+
/* fd is a regular file, get its pathname */
95+
if (S_ISREG(statbuf.st_mode) || S_ISDIR(statbuf.st_mode)) {
96+
char path[PATH_MAX];
97+
snprintf(path, sizeof(path), "/proc/self/fd/%d", fd);
98+
ssize_t len = readlink(path, buffer, bufsize - 1);
99+
if (len == -1) {
100+
snprintf(buffer, bufsize, "error: %s", strerror(errno));
101+
return buffer;
102+
}
103+
buffer[len] = '\0';
104+
return buffer;
105+
}
106+
107+
/* fd is a socket, check for IPv4, IPv6, or Unix socket */
108+
struct sockaddr_storage addr;
109+
socklen_t addr_len = sizeof(addr);
110+
111+
if (getsockname(fd, (struct sockaddr *)&addr, &addr_len) == 0) {
112+
if (addr.ss_family == AF_INET) {
113+
struct sockaddr_in *ipv4 = (struct sockaddr_in *)&addr;
114+
char local_ip[INET_ADDRSTRLEN];
115+
inet_ntop(AF_INET, &ipv4->sin_addr, local_ip, sizeof(local_ip));
116+
snprintf(buffer, bufsize, "IPv4: %s:%d", local_ip, ntohs(ipv4->sin_port));
117+
} else if (addr.ss_family == AF_INET6) {
118+
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&addr;
119+
char local_ip[INET6_ADDRSTRLEN];
120+
inet_ntop(AF_INET6, &ipv6->sin6_addr, local_ip, sizeof(local_ip));
121+
snprintf(buffer, bufsize, "IPv6: [%s]:%d", local_ip, ntohs(ipv6->sin6_port));
122+
} else if (addr.ss_family == AF_UNIX) {
123+
struct sockaddr_un *un = (struct sockaddr_un *)&addr;
124+
snprintf(buffer, bufsize, "Unix Socket: %s", *un->sun_path ? un->sun_path : "(abstract)");
125+
} else {
126+
RETERROR("Unknown socket type");
127+
}
128+
129+
if (getpeername(fd, (struct sockaddr *)&addr, &addr_len) == 0) {
130+
char remote_info[PATH_MAX];
131+
if (addr.ss_family == AF_INET) {
132+
struct sockaddr_in *ipv4 = (struct sockaddr_in *)&addr;
133+
char remote_ip[INET_ADDRSTRLEN];
134+
inet_ntop(AF_INET, &ipv4->sin_addr, remote_ip, sizeof(remote_ip));
135+
snprintf(remote_info, sizeof(remote_info), " -> Remote: %s:%d", remote_ip, ntohs(ipv4->sin_port));
136+
} else if (addr.ss_family == AF_INET6) {
137+
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&addr;
138+
char remote_ip[INET6_ADDRSTRLEN];
139+
inet_ntop(AF_INET6, &ipv6->sin6_addr, remote_ip, sizeof(remote_ip));
140+
snprintf(remote_info, sizeof(remote_info), " -> Remote: [%s]:%d", remote_ip, ntohs(ipv6->sin6_port));
141+
} else if (addr.ss_family == AF_UNIX) {
142+
struct sockaddr_un *un = (struct sockaddr_un *)&addr;
143+
snprintf(remote_info, sizeof(remote_info), " -> Remote Unix Socket: %s", *un->sun_path ? un->sun_path : "(abstract)");
144+
}
145+
strncat(buffer, remote_info, bufsize - strlen(buffer) - 1);
146+
}
147+
return buffer;
148+
}
149+
150+
RETERROR("Unknown");
151+
#undef RETERROR
152+
}

src/gtp_ppp.c

+12-5
Original file line numberDiff line numberDiff line change
@@ -1723,8 +1723,9 @@ sppp_ipcp_RCR(sppp_t *sp, lcp_hdr_t *h, int len)
17231723
* this is agreeable. Gonna conf-ack
17241724
* it.
17251725
*/
1726+
uint32_t ndesiredaddr = htonl(desiredaddr);
17261727
PPPDEBUG(("%u.%u.%u.%u [ack] ",
1727-
NIPQUAD(desiredaddr)));
1728+
NIPQUAD(ndesiredaddr)));
17281729
/* record that we've seen it already */
17291730
sp->ipcp.flags |= IPCP_HISADDR_SEEN;
17301731
sp->ipcp.req_hisaddr = desiredaddr;
@@ -1738,11 +1739,12 @@ sppp_ipcp_RCR(sppp_t *sp, lcp_hdr_t *h, int len)
17381739
* matching our value. Either case, we gonna
17391740
* conf-nak it with our value.
17401741
*/
1742+
uint32_t ndesiredaddr = htonl(desiredaddr);
17411743
if (desiredaddr == 0)
17421744
PPPDEBUG(("[addr requested] "));
17431745
else
17441746
PPPDEBUG(("%u.%u.%u.%u [not agreed] ",
1745-
NIPQUAD(desiredaddr)));
1747+
NIPQUAD(ndesiredaddr)));
17461748

17471749
p[2] = hisaddr >> 24;
17481750
p[3] = hisaddr >> 16;
@@ -1858,7 +1860,8 @@ sppp_ipcp_RCN_nak(sppp_t *sp, lcp_hdr_t *h, int len)
18581860
if (len >= 6 && p[1] == 6) {
18591861
wantaddr = p[2] << 24 | p[3] << 16 | p[4] << 8 | p[5];
18601862
sp->ipcp.opts |= (1 << SPPP_IPCP_OPT_ADDRESS);
1861-
PPPDEBUG(("[wantaddr %u.%u.%u.%u] ", NIPQUAD(wantaddr)));
1863+
uint32_t nwantaddr = htonl(wantaddr);
1864+
PPPDEBUG(("[Xwantaddr %u.%u.%u.%u] ", NIPQUAD(nwantaddr)));
18621865
/*
18631866
* When doing dynamic address assignment,
18641867
* we accept his offer. Otherwise, we
@@ -1873,12 +1876,16 @@ sppp_ipcp_RCN_nak(sppp_t *sp, lcp_hdr_t *h, int len)
18731876
}
18741877
break;
18751878
case IPCP_OPT_PRIMDNS:
1876-
if (len >= 6 && p[1] == 6)
1879+
if (len >= 6 && p[1] == 6) {
18771880
memcpy(&sp->ipcp.dns[0].s_addr, p + 2, sizeof(sp->ipcp.dns[0]));
1881+
PPPDEBUG(("[pri dns addr %u.%u.%u.%u] ", NIPQUAD(sp->ipcp.dns[0].s_addr)));
1882+
}
18781883
break;
18791884
case IPCP_OPT_SECDNS:
1880-
if (len >= 6 && p[1] == 6)
1885+
if (len >= 6 && p[1] == 6) {
18811886
memcpy(&sp->ipcp.dns[1].s_addr, p + 2, sizeof(sp->ipcp.dns[1]));
1887+
PPPDEBUG(("[sec dns addr %u.%u.%u.%u] ", NIPQUAD(sp->ipcp.dns[1].s_addr)));
1888+
}
18821889
break;
18831890
}
18841891
}

src/gtp_request.c

+11
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,17 @@ gtp_request_worker_release(gtp_req_worker_t *w)
478478
return 0;
479479
}
480480

481+
int
482+
gtp_request_for_each_worker(gtp_req_channel_t *srv, int (*cb) (gtp_req_worker_t *, void *), void *arg)
483+
{
484+
gtp_req_worker_t *w;
485+
486+
pthread_mutex_lock(&srv->workers_mutex);
487+
list_for_each_entry(w, &srv->workers, next)
488+
(*cb) (w, arg);
489+
pthread_mutex_unlock(&srv->workers_mutex);
490+
return 0;
491+
}
481492

482493
/*
483494
* GTP Request init

src/gtp_router_hdl.c

+27-8
Original file line numberDiff line numberDiff line change
@@ -278,13 +278,16 @@ gtpc_pkt_put_mei(pkt_buffer_t *pbuff, uint64_t mei)
278278
}
279279

280280
static int
281-
gtpc_pkt_put_cause(pkt_buffer_t *pbuff, uint8_t cause)
281+
gtpc_pkt_put_cause(pkt_buffer_t *pbuff, uint8_t cause, gtp_teid_t *teid)
282282
{
283283
gtp_ie_cause_t *ie;
284284

285285
if (gtpc_pkt_put_ie(pbuff, GTP_IE_CAUSE_TYPE, sizeof(gtp_ie_cause_t)) < 0)
286286
return 1;
287287

288+
/* a tx pkt */
289+
teid->session->w->cause_stats.tx[cause].count++;
290+
288291
ie = (gtp_ie_cause_t *) pbuff->data;
289292
ie->value = cause;
290293
pkt_buffer_put_data(pbuff, sizeof(gtp_ie_cause_t));
@@ -580,7 +583,7 @@ gtpc_pkt_put_bearer_context(pkt_buffer_t *pbuff, gtp_session_t *s, gtp_teid_t *t
580583
pkt_buffer_put_data(pbuff, sizeof(gtp_ie_bearer_context_t));
581584

582585
err = err ? : gtpc_pkt_put_eps_bearer_id(pbuff, apn->eps_bearer_id);
583-
err = err ? : gtpc_pkt_put_cause(pbuff, GTP_CAUSE_REQUEST_ACCEPTED);
586+
err = err ? : gtpc_pkt_put_cause(pbuff, GTP_CAUSE_REQUEST_ACCEPTED, teid);
584587
err = err ? : gtpc_pkt_put_f_teid(pbuff, teid, 2, GTP_TEID_INTERFACE_TYPE_SGW_GTPU);
585588
err = err ? : gtpc_pkt_put_charging_id(pbuff, s->charging_id);
586589
if (err)
@@ -602,6 +605,9 @@ gtpc_build_header(pkt_buffer_t *pbuff, gtp_teid_t *teid, uint8_t type)
602605
{
603606
gtp_hdr_t *h = (gtp_hdr_t *) pbuff->head;
604607

608+
/* a tx pkt */
609+
teid->session->w->msg_stats.tx[type].count++;
610+
605611
h->version = 2;
606612
h->type = type;
607613
h->teid_presence = 1;
@@ -625,7 +631,7 @@ gtpc_build_create_session_response(pkt_buffer_t *pbuff, gtp_session_t *s, gtp_te
625631
gtpc_build_header(pbuff, teid, GTP_CREATE_SESSION_RESPONSE_TYPE);
626632

627633
/* Put IE */
628-
err = err ? : gtpc_pkt_put_cause(pbuff, GTP_CAUSE_REQUEST_ACCEPTED);
634+
err = err ? : gtpc_pkt_put_cause(pbuff, GTP_CAUSE_REQUEST_ACCEPTED, teid);
629635
err = err ? : gtpc_pkt_put_recovery(pbuff);
630636
err = err ? : gtpc_pkt_put_indication(pbuff, apn->indication_flags);
631637
err = err ? : gtpc_pkt_put_pco(pbuff, apn->pco, ipcp);
@@ -656,7 +662,7 @@ gtpc_build_change_notification_response(pkt_buffer_t *pbuff, gtp_session_t *s, g
656662
/* Put IE */
657663
err = err ? : gtpc_pkt_put_imsi(pbuff, s->conn->imsi);
658664
err = err ? : gtpc_pkt_put_mei(pbuff, s->mei);
659-
err = err ? : gtpc_pkt_put_cause(pbuff, GTP_CAUSE_REQUEST_ACCEPTED);
665+
err = err ? : gtpc_pkt_put_cause(pbuff, GTP_CAUSE_REQUEST_ACCEPTED, teid);
660666
if (err) {
661667
log_message(LOG_INFO, "%s(): Error building PKT !?"
662668
, __FUNCTION__);
@@ -678,7 +684,7 @@ gtpc_build_errmsg(pkt_buffer_t *pbuff, gtp_teid_t *teid, uint8_t type, uint8_t c
678684
gtpc_build_header(pbuff, teid, type);
679685

680686
/* Put IE */
681-
err = err ? : gtpc_pkt_put_cause(pbuff, cause);
687+
err = err ? : gtpc_pkt_put_cause(pbuff, cause, teid);
682688
err = err ? : gtpc_pkt_put_recovery(pbuff);
683689
if (err)
684690
return -1;
@@ -705,7 +711,7 @@ gtpc_build_delete_bearer_request(pkt_buffer_t *pbuff, gtp_teid_t *teid, uint8_t
705711
/* Put IE */
706712
err = err ? : gtpc_pkt_put_eps_bearer_id(pbuff, bearer_id);
707713
if (cause)
708-
err = err ? : gtpc_pkt_put_cause(pbuff, cause);
714+
err = err ? : gtpc_pkt_put_cause(pbuff, cause, teid);
709715
if (err)
710716
return -1;
711717

@@ -879,6 +885,9 @@ gtpc_echo_request_hdl(gtp_server_worker_t *w, struct sockaddr_storage *addr)
879885

880886
h->type = GTP_ECHO_RESPONSE_TYPE;
881887

888+
/* it does not use gtpc_build_header(), so count from here */
889+
w->msg_stats.tx[h->type].count++;
890+
882891
return 0;
883892
}
884893

@@ -1109,6 +1118,8 @@ gtpc_delete_session_request_hdl(gtp_server_worker_t *w, struct sockaddr_storage
11091118
goto end;
11101119
}
11111120

1121+
log_message(LOG_INFO, "Delete-Session-Req:={F-TEID:0x%.8x}", ntohl(teid->peer_teid->id));
1122+
11121123
msg_ie = gtp_msg_ie_get(msg, GTP_IE_F_TEID_TYPE);
11131124
if (!msg_ie) {
11141125
log_message(LOG_INFO, "%s(): no F_TEID IE present. ignoring..."
@@ -1279,10 +1290,13 @@ gtpc_router_handle(gtp_server_worker_t *w, struct sockaddr_storage *addr)
12791290
{
12801291
gtp_hdr_t *gtph = (gtp_hdr_t *) w->pbuff->head;
12811292

1282-
if (*(gtpc_msg_hdl[gtph->type].hdl))
1293+
if (*(gtpc_msg_hdl[gtph->type].hdl)) {
1294+
w->msg_stats.rx[gtph->type].count++;
12831295
return (*(gtpc_msg_hdl[gtph->type].hdl)) (w, addr);
1296+
}
12841297

12851298
/* In router mode, silently ignore message we do not support */
1299+
w->msg_stats.rx[gtph->type].unsupported++;
12861300
return -1;
12871301
}
12881302

@@ -1303,6 +1317,8 @@ gtpu_echo_request_hdl(gtp_server_worker_t *w, struct sockaddr_storage *addr)
13031317
pkt_buffer_set_end_pointer(w->pbuff, gtp1_get_header_len(h));
13041318
pkt_buffer_set_data_pointer(w->pbuff, gtp1_get_header_len(h));
13051319

1320+
w->msg_stats.tx[h->type].count++;
1321+
13061322
gtp1_ie_add_tail(w->pbuff, sizeof(gtp1_ie_recovery_t));
13071323
rec = (gtp1_ie_recovery_t *) w->pbuff->data;
13081324
rec->type = GTP1_IE_RECOVERY_TYPE;
@@ -1342,13 +1358,16 @@ gtpu_router_handle(gtp_server_worker_t *w, struct sockaddr_storage *addr)
13421358
if (len < 0)
13431359
return -1;
13441360

1345-
if (*(gtpu_msg_hdl[gtph->type].hdl))
1361+
if (*(gtpu_msg_hdl[gtph->type].hdl)) {
1362+
w->msg_stats.rx[gtph->type].count++;
13461363
return (*(gtpu_msg_hdl[gtph->type].hdl)) (w, addr);
1364+
}
13471365

13481366
/* Not supported */
13491367
log_message(LOG_INFO, "%s(): GTP-U/path-mgt msg_type:0x%.2x from %s not supported..."
13501368
, __FUNCTION__
13511369
, gtph->type
13521370
, inet_sockaddrtos(addr));
1371+
w->msg_stats.rx[gtph->type].unsupported++;
13531372
return -1;
13541373
}

0 commit comments

Comments
 (0)