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:
Harald Welte 2013-06-30 15:27:10 +02:00 committed by Holger Hans Peter Freyther
parent b77ae3bc60
commit 359fb8caf4
4 changed files with 25 additions and 7 deletions

View File

@ -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 */

View File

@ -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>

View File

@ -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;

View File

@ -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,