Skip to content

Commit 5170e7e

Browse files
committed
Add subnet mask of interface for the SGi connection
1 parent 254cc71 commit 5170e7e

File tree

4 files changed

+16
-4
lines changed

4 files changed

+16
-4
lines changed

srsepc/hdr/spgw/spgw.h

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ typedef struct {
4545
std::string gtpu_bind_addr;
4646
std::string sgi_if_addr;
4747
std::string sgi_if_name;
48+
std::string sgi_if_netmask;
4849
uint32_t max_paging_queue;
4950
} spgw_args_t;
5051

srsepc/src/main.cc

+3
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ void parse_args(all_args_t* args, int argc, char* argv[])
9090
string spgw_bind_addr;
9191
string sgi_if_addr;
9292
string sgi_if_name;
93+
string sgi_if_netmask;
9394
string dns_addr;
9495
string full_net_name;
9596
string short_net_name;
@@ -130,6 +131,7 @@ void parse_args(all_args_t* args, int argc, char* argv[])
130131
("spgw.gtpu_bind_addr", bpo::value<string>(&spgw_bind_addr)->default_value("127.0.0.1"), "IP address of SP-GW for the S1-U connection")
131132
("spgw.sgi_if_addr", bpo::value<string>(&sgi_if_addr)->default_value("176.16.0.1"), "IP address of TUN interface for the SGi connection")
132133
("spgw.sgi_if_name", bpo::value<string>(&sgi_if_name)->default_value("srs_spgw_sgi"), "Name of TUN interface for the SGi connection")
134+
("spgw.sgi_if_netmask", bpo::value<string>(&sgi_if_netmask)->default_value("255.255.255.0"), "IP mask of TUN interface for the SGi connection")
133135
("spgw.max_paging_queue", bpo::value<uint32_t>(&max_paging_queue)->default_value(100), "Max number of packets in paging queue")
134136

135137
("pcap.enable", bpo::value<bool>(&args->mme_args.s1ap_args.pcap_enable)->default_value(false), "Enable S1AP PCAP")
@@ -294,6 +296,7 @@ void parse_args(all_args_t* args, int argc, char* argv[])
294296
args->spgw_args.gtpu_bind_addr = spgw_bind_addr;
295297
args->spgw_args.sgi_if_addr = sgi_if_addr;
296298
args->spgw_args.sgi_if_name = sgi_if_name;
299+
args->spgw_args.sgi_if_netmask = sgi_if_netmask;
297300
args->spgw_args.max_paging_queue = max_paging_queue;
298301
args->hss_args.db_file = hss_db_file;
299302

srsepc/src/spgw/gtpc.cc

+11-3
Original file line numberDiff line numberDiff line change
@@ -561,17 +561,25 @@ int spgw::gtpc::init_ue_ip(spgw_args_t* args, const std::map<std::string, uint64
561561
}
562562
}
563563

564-
// XXX TODO add an upper bound to ip addr range via config, use 254 for now
564+
struct in_addr netmask_addr;
565+
if (inet_pton(AF_INET, args->sgi_if_netmask.c_str(), &netmask_addr.s_addr) != 1) {
566+
m_logger.error("Invalid sgi_if_netmask: %s", args->sgi_if_netmask.c_str());
567+
srsran::console("Invalid sgi_if_netmask: %s\n", args->sgi_if_netmask.c_str());
568+
perror("inet_pton");
569+
return SRSRAN_ERROR;
570+
}
571+
uint32_t hosts_bound = (~ntohl(netmask_addr.s_addr)) - 1;
572+
565573
// first address is allocated to the epc tun interface, start w/next addr
566-
for (uint32_t n = 1; n < 254; ++n) {
574+
for (uint32_t n = 1; n < hosts_bound; ++n) {
567575
struct in_addr ue_addr;
568576
if (inet_pton(AF_INET, args->sgi_if_addr.c_str(), &ue_addr.s_addr) != 1) {
569577
m_logger.error("Invalid sgi_if_addr: %s", args->sgi_if_addr.c_str());
570578
srsran::console("Invalid sgi_if_addr: %s\n", args->sgi_if_addr.c_str());
571579
perror("inet_pton");
572580
return SRSRAN_ERROR;
573581
}
574-
ue_addr.s_addr = ue_addr.s_addr + htonl(n);
582+
ue_addr.s_addr = htonl(ntohl(ue_addr.s_addr) + n);
575583

576584
std::map<std::string, uint64_t>::const_iterator iter = ip_to_imsi.find(inet_ntoa(ue_addr));
577585
if (iter != ip_to_imsi.end()) {

srsepc/src/spgw/gtpu.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ int spgw::gtpu::init_sgi(spgw_args_t* args)
156156
}
157157

158158
ifr.ifr_netmask.sa_family = AF_INET;
159-
if (inet_pton(ifr.ifr_netmask.sa_family , "255.255.255.0", &((struct sockaddr_in*)&ifr.ifr_netmask)->sin_addr.s_addr) != 1) {
159+
if (inet_pton(ifr.ifr_netmask.sa_family , args->sgi_if_netmask.c_str(), &((struct sockaddr_in*)&ifr.ifr_netmask)->sin_addr.s_addr) != 1) {
160160
perror("inet_pton");
161161
return false;
162162
}

0 commit comments

Comments
 (0)