mirror of https://gerrit.osmocom.org/libosmocore
[GPRS] NS: VTY: Move all local ip/port bind values into 'ns' node
This removes the requirement for gb_proxy and sgsn to have duplicate vty parsing code
This commit is contained in:
parent
b3ee265b69
commit
7fb05234a7
|
@ -134,10 +134,14 @@ struct gprs_ns_inst {
|
||||||
/* NS-over-IP specific bits */
|
/* NS-over-IP specific bits */
|
||||||
struct {
|
struct {
|
||||||
struct bsc_fd fd;
|
struct bsc_fd fd;
|
||||||
|
uint32_t local_ip;
|
||||||
|
uint16_t local_port;
|
||||||
} nsip;
|
} nsip;
|
||||||
/* NS-over-FR-over-GRE-over-IP specific bits */
|
/* NS-over-FR-over-GRE-over-IP specific bits */
|
||||||
struct {
|
struct {
|
||||||
struct bsc_fd fd;
|
struct bsc_fd fd;
|
||||||
|
uint32_t local_ip;
|
||||||
|
int enabled:1;
|
||||||
} frgre;
|
} frgre;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -188,7 +192,7 @@ struct gprs_ns_inst *gprs_ns_instantiate(gprs_ns_cb_t *cb);
|
||||||
void gprs_ns_destroy(struct gprs_ns_inst *nsi);
|
void gprs_ns_destroy(struct gprs_ns_inst *nsi);
|
||||||
|
|
||||||
/* Listen for incoming GPRS packets via NS/UDP */
|
/* Listen for incoming GPRS packets via NS/UDP */
|
||||||
int nsip_listen(struct gprs_ns_inst *nsi, uint32_t ip, uint16_t udp_port);
|
int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi);
|
||||||
|
|
||||||
struct sockaddr_in;
|
struct sockaddr_in;
|
||||||
|
|
||||||
|
@ -200,7 +204,7 @@ int gprs_ns_tx_block(struct gprs_nsvc *nsvc, uint8_t cause);
|
||||||
int gprs_ns_tx_unblock(struct gprs_nsvc *nsvc);
|
int gprs_ns_tx_unblock(struct gprs_nsvc *nsvc);
|
||||||
|
|
||||||
/* Listen for incoming GPRS packets via NS/FR/GRE */
|
/* Listen for incoming GPRS packets via NS/FR/GRE */
|
||||||
int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi, uint32_t ip);
|
int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi);
|
||||||
|
|
||||||
/* Establish a connection (from the BSS) to the SGSN */
|
/* Establish a connection (from the BSS) to the SGSN */
|
||||||
struct gprs_nsvc *nsip_connect(struct gprs_ns_inst *nsi,
|
struct gprs_nsvc *nsip_connect(struct gprs_ns_inst *nsi,
|
||||||
|
|
|
@ -903,11 +903,12 @@ static int nsip_fd_cb(struct bsc_fd *bfd, unsigned int what)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Listen for incoming GPRS packets */
|
/* Listen for incoming GPRS packets */
|
||||||
int nsip_listen(struct gprs_ns_inst *nsi, uint32_t ip, uint16_t udp_port)
|
int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = make_sock(&nsi->nsip.fd, IPPROTO_UDP, ip, udp_port, nsip_fd_cb);
|
ret = make_sock(&nsi->nsip.fd, IPPROTO_UDP, nsi->nsip.local_ip,
|
||||||
|
nsi->nsip.local_port, nsip_fd_cb);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
@ -202,7 +202,7 @@ static int nsfrgre_fd_cb(struct bsc_fd *bfd, unsigned int what)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi, uint32_t ip)
|
int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
@ -210,7 +210,11 @@ int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi, uint32_t ip)
|
||||||
if (nsi->frgre.fd.fd)
|
if (nsi->frgre.fd.fd)
|
||||||
close(nsi->frgre.fd.fd);
|
close(nsi->frgre.fd.fd);
|
||||||
|
|
||||||
rc = make_sock(&nsi->frgre.fd, IPPROTO_GRE, ip, 0, nsfrgre_fd_cb);
|
if (!nsi->frgre.enabled)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
rc = make_sock(&nsi->frgre.fd, IPPROTO_GRE, nsi->frgre.local_ip,
|
||||||
|
0, nsfrgre_fd_cb);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
LOGP(DNS, LOGL_ERROR, "Error creating GRE socket (%s)\n",
|
LOGP(DNS, LOGL_ERROR, "Error creating GRE socket (%s)\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
|
|
|
@ -68,6 +68,7 @@ static int config_write_ns(struct vty *vty)
|
||||||
{
|
{
|
||||||
struct gprs_nsvc *nsvc;
|
struct gprs_nsvc *nsvc;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
struct in_addr ia;
|
||||||
|
|
||||||
vty_out(vty, "ns%s", VTY_NEWLINE);
|
vty_out(vty, "ns%s", VTY_NEWLINE);
|
||||||
|
|
||||||
|
@ -111,6 +112,21 @@ static int config_write_ns(struct vty *vty)
|
||||||
get_value_string(gprs_ns_timer_strs, i),
|
get_value_string(gprs_ns_timer_strs, i),
|
||||||
vty_nsi->timeout[i], VTY_NEWLINE);
|
vty_nsi->timeout[i], VTY_NEWLINE);
|
||||||
|
|
||||||
|
if (vty_nsi->nsip.local_ip) {
|
||||||
|
ia.s_addr = htonl(vty_nsi->nsip.local_ip);
|
||||||
|
vty_out(vty, " encapsulation udp local-ip %s%s",
|
||||||
|
inet_ntoa(ia), VTY_NEWLINE);
|
||||||
|
vty_out(vty, " encapsulation udp local-port %u%s",
|
||||||
|
vty_nsi->nsip.local_port);
|
||||||
|
}
|
||||||
|
vty_out(vty, " encapsulation framerelay-gre enabled %u%s",
|
||||||
|
vty_nsi->frgre.enabled ? 1 : 0, VTY_NEWLINE);
|
||||||
|
if (vty_nsi->frgre.enabled) {
|
||||||
|
ia.s_addr = htonl(vty_nsi->frgre.local_ip);
|
||||||
|
vty_out(vty, " encapsulation framerelay-gre local-ip %s%s",
|
||||||
|
inet_ntoa(ia), VTY_NEWLINE);
|
||||||
|
}
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,6 +158,15 @@ static void dump_nse(struct vty *vty, struct gprs_nsvc *nsvc, int stats)
|
||||||
static void dump_ns(struct vty *vty, struct gprs_ns_inst *nsi, int stats)
|
static void dump_ns(struct vty *vty, struct gprs_ns_inst *nsi, int stats)
|
||||||
{
|
{
|
||||||
struct gprs_nsvc *nsvc;
|
struct gprs_nsvc *nsvc;
|
||||||
|
struct in_addr ia;
|
||||||
|
|
||||||
|
ia.s_addr = htonl(vty_nsi->nsip.local_ip);
|
||||||
|
vty_out(vty, "NS-UDP-IP Encapsulation: Local IP: %s, UDP Port: %u%s",
|
||||||
|
inet_ntoa(ia), vty_nsi->nsip.local_port, VTY_NEWLINE);
|
||||||
|
|
||||||
|
ia.s_addr = htonl(vty_nsi->frgre.local_ip);
|
||||||
|
vty_out(vty, "NS-FR-GRE-IP Encapsulation: Local IP: %s%s",
|
||||||
|
inet_ntoa(ia), VTY_NEWLINE);
|
||||||
|
|
||||||
llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
|
llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
|
||||||
if (nsvc == nsi->unknown_nsvc)
|
if (nsvc == nsi->unknown_nsvc)
|
||||||
|
@ -387,6 +412,66 @@ DEFUN(cfg_ns_timer, cfg_ns_timer_cmd,
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ENCAPS_STR "NS encapsulation options\n"
|
||||||
|
|
||||||
|
DEFUN(cfg_nsip_local_ip, cfg_nsip_local_ip_cmd,
|
||||||
|
"encapsulation udp local-ip A.B.C.D",
|
||||||
|
ENCAPS_STR "NS over UDP Encapsulation\n"
|
||||||
|
"Set the IP address on which we listen for NS/UDP\n"
|
||||||
|
"IP Address\n")
|
||||||
|
{
|
||||||
|
struct in_addr ia;
|
||||||
|
|
||||||
|
inet_aton(argv[0], &ia);
|
||||||
|
vty_nsi->nsip.local_ip = ntohl(ia.s_addr);
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFUN(cfg_nsip_local_port, cfg_nsip_local_port_cmd,
|
||||||
|
"encapsulation udp local-port <0-65535>",
|
||||||
|
ENCAPS_STR "NS over UDP Encapsulation\n"
|
||||||
|
"Set the UDP port on which we listen for NS/UDP\n"
|
||||||
|
"UDP port number\n")
|
||||||
|
{
|
||||||
|
unsigned int port = atoi(argv[0]);
|
||||||
|
|
||||||
|
vty_nsi->nsip.local_port = port;
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFUN(cfg_frgre_local_ip, cfg_frgre_local_ip_cmd,
|
||||||
|
"encapsulation framerelay-gre local-ip A.B.C.D",
|
||||||
|
ENCAPS_STR "NS over Frame Relay over GRE Encapsulation\n"
|
||||||
|
"Set the IP address on which we listen for NS/FR/GRE\n"
|
||||||
|
"IP Address\n")
|
||||||
|
{
|
||||||
|
struct in_addr ia;
|
||||||
|
|
||||||
|
if (!vty_nsi->frgre.enabled) {
|
||||||
|
vty_out(vty, "FR/GRE is not enabled%s", VTY_NEWLINE);
|
||||||
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
|
inet_aton(argv[0], &ia);
|
||||||
|
vty_nsi->frgre.local_ip = ntohl(ia.s_addr);
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFUN(cfg_frgre_enable, cfg_frgre_enable_cmd,
|
||||||
|
"encapsulation framerelay-gre enabled (1|0)",
|
||||||
|
ENCAPS_STR "NS over Frame Relay over GRE Encapsulation\n"
|
||||||
|
"Enable or disable Frame Relay over GRE\n"
|
||||||
|
"Enable\n" "Disable\n")
|
||||||
|
{
|
||||||
|
int enabled = atoi(argv[0]);
|
||||||
|
|
||||||
|
vty_nsi->frgre.enabled = enabled;
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
DEFUN(nsvc_nsei, nsvc_nsei_cmd,
|
DEFUN(nsvc_nsei, nsvc_nsei_cmd,
|
||||||
"nsvc nsei <0-65535> (block|unblock|reset)",
|
"nsvc nsei <0-65535> (block|unblock|reset)",
|
||||||
"Perform an operation on a NSVC\n"
|
"Perform an operation on a NSVC\n"
|
||||||
|
@ -472,6 +557,10 @@ int gprs_ns_vty_init(struct gprs_ns_inst *nsi)
|
||||||
install_element(NS_NODE, &cfg_nse_remoterole_cmd);
|
install_element(NS_NODE, &cfg_nse_remoterole_cmd);
|
||||||
install_element(NS_NODE, &cfg_no_nse_cmd);
|
install_element(NS_NODE, &cfg_no_nse_cmd);
|
||||||
install_element(NS_NODE, &cfg_ns_timer_cmd);
|
install_element(NS_NODE, &cfg_ns_timer_cmd);
|
||||||
|
install_element(NS_NODE, &cfg_nsip_local_ip_cmd);
|
||||||
|
install_element(NS_NODE, &cfg_nsip_local_port_cmd);
|
||||||
|
install_element(NS_NODE, &cfg_frgre_enable_cmd);
|
||||||
|
install_element(NS_NODE, &cfg_frgre_local_ip_cmd);
|
||||||
|
|
||||||
install_element(ENABLE_NODE, &nsvc_nsei_cmd);
|
install_element(ENABLE_NODE, &nsvc_nsei_cmd);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue