abis: Use OML remote (BSC) address if RSL CONNECT contains no IP
This introduces a new get_signlink_remote_ip() function whcih we also use in the RSL code to determine the RTP remote address if the CRCX/MDCX contains no remote IP address IE.
This commit is contained in:
parent
b77ae3bc60
commit
359fb8caf4
|
@ -23,4 +23,6 @@ struct e1inp_line *abis_open(struct gsm_bts *bts, const char *dst_host,
|
|||
int abis_oml_sendmsg(struct msgb *msg);
|
||||
int abis_rsl_sendmsg(struct msgb *msg);
|
||||
|
||||
uint32_t get_signlink_remote_ip(struct e1inp_sign_link *link);
|
||||
|
||||
#endif /* _ABIS_H */
|
||||
|
|
|
@ -139,6 +139,27 @@ static int sign_link_cb(struct msgb *msg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
uint32_t get_signlink_remote_ip(struct e1inp_sign_link *link)
|
||||
{
|
||||
int fd = link->ts->driver.ipaccess.fd.fd;
|
||||
struct sockaddr_in sin;
|
||||
socklen_t slen = sizeof(sin);
|
||||
int rc;
|
||||
|
||||
rc = getpeername(fd, (struct sockaddr *)&sin, &slen);
|
||||
if (rc < 0) {
|
||||
LOGP(DOML, LOGL_ERROR, "Cannot determine remote IP Addr: %s\n",
|
||||
strerror(errno));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* we assume that the soket is AF_INET. As Abis/IP contains
|
||||
* lots of hard-coded IPv4 addresses, this safe */
|
||||
OSMO_ASSERT(sin.sin_family == AF_INET);
|
||||
|
||||
return ntohl(sin.sin_addr.s_addr);
|
||||
}
|
||||
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <net/if.h>
|
||||
|
|
|
@ -991,13 +991,12 @@ static int oml_ipa_set_attr(struct gsm_bts *bts, struct msgb *msg)
|
|||
return oml_fom_ack_nack(msg, rc);
|
||||
}
|
||||
|
||||
|
||||
static int rx_oml_ipa_rsl_connect(struct gsm_bts_trx *trx, struct msgb *msg,
|
||||
struct tlv_parsed *tp)
|
||||
{
|
||||
struct e1inp_sign_link *oml_link = trx->bts->oml_link;
|
||||
uint16_t port = IPA_TCP_PORT_RSL;
|
||||
uint32_t ip;//FIXME = oml_link->ip;
|
||||
uint32_t ip = get_signlink_remote_ip(oml_link);
|
||||
struct in_addr in;
|
||||
int rc;
|
||||
|
||||
|
|
|
@ -1364,12 +1364,8 @@ static int rsl_rx_ipac_XXcx(struct msgb *msg)
|
|||
if (connect_ip == 0) {
|
||||
struct e1inp_sign_link *sign_link =
|
||||
lchan->ts->trx->rsl_link;
|
||||
int rsl_fd = sign_link->ts->driver.ipaccess.fd.fd;
|
||||
struct sockaddr_in sin;
|
||||
socklen_t slen = sizeof(sin);
|
||||
|
||||
getpeername(rsl_fd, (struct sockaddr *)&sin, &slen);
|
||||
ia = sin.sin_addr;
|
||||
ia.s_addr = htonl(get_signlink_remote_ip(sign_link));
|
||||
} else
|
||||
ia.s_addr = connect_ip;
|
||||
rc = osmo_rtp_socket_connect(lchan->abis_ip.rtp_socket,
|
||||
|
|
Loading…
Reference in New Issue