Merge branch 'limit_eport_search'

This commit is contained in:
Thomas Bernard 2014-02-28 13:35:49 +01:00
commit b71e0c028f
2 changed files with 33 additions and 23 deletions

View File

@ -2,6 +2,7 @@ $Id: Changelog.txt,v 1.354 2014/02/28 12:14:29 nanard Exp $
2014/02/28: 2014/02/28:
log message when shutting down log message when shutting down
natpmp : avoid hang when all external ports in use
2014/02/25: 2014/02/25:
add implementation of scheduled sendto (asyncsendto) in order add implementation of scheduled sendto (asyncsendto) in order

View File

@ -266,29 +266,38 @@ void ProcessIncomingNATPMPPacket(int s, unsigned char *msg_buff, int len,
} else if(iport==0 } else if(iport==0
|| !check_upnp_rule_against_permissions(upnppermlist, num_upnpperm, eport, senderaddr->sin_addr, iport)) { || !check_upnp_rule_against_permissions(upnppermlist, num_upnpperm, eport, senderaddr->sin_addr, iport)) {
resp[3] = 2; /* Not Authorized/Refused */ resp[3] = 2; /* Not Authorized/Refused */
} else do { } else {
r = get_redirect_rule(ext_if_name, eport, proto, unsigned short eport_first;
iaddr_old, sizeof(iaddr_old), char desc[64];
&iport_old, 0, 0, 0, 0, eport_first = eport;
&timestamp, 0, 0); do {
if(r==0) { r = get_redirect_rule(ext_if_name, eport, proto,
if(strcmp(senderaddrstr, iaddr_old)==0 iaddr_old, sizeof(iaddr_old),
&& iport==iport_old) { &iport_old, 0, 0, 0, 0,
/* redirection allready existing */ &timestamp, 0, 0);
syslog(LOG_INFO, "port %hu %s already redirected to %s:%hu, replacing", if(r==0) {
eport, (proto==IPPROTO_TCP)?"tcp":"udp", iaddr_old, iport_old); if(strcmp(senderaddrstr, iaddr_old)==0
/* remove and then add again */ && iport==iport_old) {
if(_upnp_delete_redir(eport, proto) < 0) { /* redirection allready existing */
syslog(LOG_ERR, "failed to remove port mapping"); syslog(LOG_INFO, "port %hu %s already redirected to %s:%hu, replacing",
break; eport, (proto==IPPROTO_TCP)?"tcp":"udp", iaddr_old, iport_old);
/* remove and then add again */
if(_upnp_delete_redir(eport, proto) < 0) {
syslog(LOG_ERR, "failed to remove port mapping");
break;
}
} else {
eport++;
if(eport == eport_first) { /* no external port available */
syslog(LOG_ERR, "Failed to find available eport for NAT-PMP %hu %s->%s:%hu",
eport, (proto==IPPROTO_TCP)?"tcp":"udp", senderaddrstr, iport);
resp[3] = 3; /* Failure */
break;
}
continue;
} }
} else {
eport++;
continue;
} }
} /* do the redirection */
{ /* do the redirection */
char desc[64];
#if 0 #if 0
timestamp = (unsigned)(time(NULL) - startup_time) timestamp = (unsigned)(time(NULL) - startup_time)
+ lifetime; + lifetime;
@ -314,8 +323,8 @@ void ProcessIncomingNATPMPPacket(int s, unsigned char *msg_buff, int len,
#endif #endif
} }
break; break;
} } while(r==0);
} while(r==0); }
*((uint16_t *)(resp+8)) = htons(iport); /* private port */ *((uint16_t *)(resp+8)) = htons(iport); /* private port */
*((uint16_t *)(resp+10)) = htons(eport); /* public port */ *((uint16_t *)(resp+10)) = htons(eport); /* public port */
*((uint32_t *)(resp+12)) = htonl(lifetime); /* Port Mapping lifetime */ *((uint32_t *)(resp+12)) = htonl(lifetime); /* Port Mapping lifetime */