Add externip keyword so that it's possible to use asterisk behind a NAT through port forwarding

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1681 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.0
Martin Pycko 22 years ago
parent 0519fde656
commit da93b54687

@ -387,7 +387,7 @@ static struct sip_registry *registrations;
static int sipsock = -1; static int sipsock = -1;
static int globalnat = 0; static int globalnat = 0;
static int globalcanreinvite = REINVITE_INVITE; static int globalcanreinvite = REINVITE_INVITE;
static int use_external_ip = 0;
static struct sockaddr_in bindaddr; static struct sockaddr_in bindaddr;
@ -425,10 +425,14 @@ static void sip_destroy(struct sip_pvt *p);
static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us) static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us)
{ {
if (use_external_ip) {
return -1;
} else {
if (bindaddr.sin_addr.s_addr) if (bindaddr.sin_addr.s_addr)
memcpy(us, &bindaddr.sin_addr, sizeof(struct in_addr)); memcpy(us, &bindaddr.sin_addr, sizeof(struct in_addr));
else else
return ast_ouraddrfor(them, us); return ast_ouraddrfor(them, us);
}
return 0; return 0;
} }
@ -2985,7 +2989,7 @@ static int transmit_register(struct sip_registry *r, char *cmd, char *auth, char
strncpy(p->username, r->username, sizeof(p->username)-1); strncpy(p->username, r->username, sizeof(p->username)-1);
strncpy(p->exten, r->contact, sizeof(p->exten) - 1); strncpy(p->exten, r->contact, sizeof(p->exten) - 1);
/* Always bind to our IP if specified */ /* Always bind to our IP if specified */
if (bindaddr.sin_addr.s_addr) if (!use_external_ip && bindaddr.sin_addr.s_addr)
memcpy(&p->ourip, &bindaddr.sin_addr, sizeof(p->ourip)); memcpy(&p->ourip, &bindaddr.sin_addr, sizeof(p->ourip));
build_contact(p); build_contact(p);
} }
@ -5979,6 +5983,13 @@ static int reload_config(void)
} else { } else {
memcpy(&bindaddr.sin_addr, hp->h_addr, sizeof(bindaddr.sin_addr)); memcpy(&bindaddr.sin_addr, hp->h_addr, sizeof(bindaddr.sin_addr));
} }
} else if (!strcasecmp(v->name, "externip")) {
if (!(hp = gethostbyname(v->value))) {
ast_log(LOG_WARNING, "Invalid address for externip keyword: %s\n", v->value);
} else {
memcpy(&__ourip, hp->h_addr, sizeof(__ourip));
use_external_ip = 1;
}
} else if (!strcasecmp(v->name, "allow")) { } else if (!strcasecmp(v->name, "allow")) {
format = ast_getformatbyname(v->value); format = ast_getformatbyname(v->value);
if (format < 1) if (format < 1)
@ -6053,7 +6064,7 @@ static int reload_config(void)
} }
cat = ast_category_browse(cfg, cat); cat = ast_category_browse(cfg, cat);
} }
if (!use_external_ip) {
if (ntohl(bindaddr.sin_addr.s_addr)) { if (ntohl(bindaddr.sin_addr.s_addr)) {
memcpy(&__ourip, &bindaddr.sin_addr, sizeof(__ourip)); memcpy(&__ourip, &bindaddr.sin_addr, sizeof(__ourip));
} else { } else {
@ -6064,6 +6075,7 @@ static int reload_config(void)
} }
memcpy(&__ourip, hp->h_addr, sizeof(__ourip)); memcpy(&__ourip, hp->h_addr, sizeof(__ourip));
} }
}
if (!ntohs(bindaddr.sin_port)) if (!ntohs(bindaddr.sin_port))
bindaddr.sin_port = ntohs(DEFAULT_SIP_PORT); bindaddr.sin_port = ntohs(DEFAULT_SIP_PORT);
bindaddr.sin_family = AF_INET; bindaddr.sin_family = AF_INET;

@ -4,6 +4,7 @@
[general] [general]
port = 5060 ; Port to bind to port = 5060 ; Port to bind to
bindaddr = 0.0.0.0 ; Address to bind to bindaddr = 0.0.0.0 ; Address to bind to
externip = 200.201.202.203 ; Address that we're going to put in SIP messages if we're behind a NAT
context = default ; Default for incoming calls context = default ; Default for incoming calls
;srvlookup = yes ; Enable SRV lookups on outbound calls ;srvlookup = yes ; Enable SRV lookups on outbound calls
;pedantic = yes ; Enable slow, pedantic checking for Pingtel ;pedantic = yes ; Enable slow, pedantic checking for Pingtel

Loading…
Cancel
Save