Clean expired IPv6 pinholes correctly. and also with linux/netfilter

This commit is contained in:
Thomas Bernard 2012-05-08 22:51:23 +02:00
parent fd5c172182
commit ff397acf8f
5 changed files with 59 additions and 7 deletions

View File

@ -1,4 +1,7 @@
$Id: Changelog.txt,v 1.281 2012/05/07 15:40:03 nanard Exp $ $Id: Changelog.txt,v 1.282 2012/05/08 20:41:44 nanard Exp $
2012/05/08:
Clean expired IPv6 pinholes correctly. and also with linux/netfilter.
2012/05/07: 2012/05/07:
Finalizing netfilter version of get_pinhole_info() Finalizing netfilter version of get_pinhole_info()

View File

@ -1,4 +1,4 @@
/* $Id: miniupnpd.c,v 1.155 2012/05/01 20:13:35 nanard Exp $ */ /* $Id: miniupnpd.c,v 1.156 2012/05/08 20:41:45 nanard Exp $ */
/* MiniUPnP project /* MiniUPnP project
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* (c) 2006-2012 Thomas Bernard * (c) 2006-2012 Thomas Bernard
@ -1169,6 +1169,9 @@ main(int argc, char * * argv)
struct rule_state * rule_list = 0; struct rule_state * rule_list = 0;
struct timeval checktime = {0, 0}; struct timeval checktime = {0, 0};
struct lan_addr_s * lan_addr; struct lan_addr_s * lan_addr;
#ifdef ENABLE_6FC_SERVICE
unsigned int next_pinhole_ts;
#endif
if(init(argc, argv, &v) != 0) if(init(argc, argv, &v) != 0)
return 1; return 1;
@ -1424,7 +1427,13 @@ main(int argc, char * * argv)
#endif #endif
#ifdef ENABLE_6FC_SERVICE #ifdef ENABLE_6FC_SERVICE
/* Clean up expired IPv6 PinHoles */ /* Clean up expired IPv6 PinHoles */
upnp_clean_expired_pinholes(NULL); next_pinhole_ts = 0;
upnp_clean_expired_pinholes(&next_pinhole_ts);
if(next_pinhole_ts &&
timeout.tv_sec >= (next_pinhole_ts - timeofday.tv_sec)) {
timeout.tv_sec = next_pinhole_ts - timeofday.tv_sec;
timeout.tv_usec = 0;
}
#endif #endif
/* select open sockets (SSDP, HTTP listen, and all HTTP soap sockets) */ /* select open sockets (SSDP, HTTP listen, and all HTTP soap sockets) */

View File

@ -1,4 +1,4 @@
/* $Id: iptpinhole.c,v 1.6 2012/05/07 15:40:04 nanard Exp $ */ /* $Id: iptpinhole.c,v 1.7 2012/05/08 20:41:45 nanard Exp $ */
/* MiniUPnP project /* MiniUPnP project
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* (c) 2012 Thomas Bernard * (c) 2012 Thomas Bernard
@ -28,6 +28,9 @@ static int next_uid = 1;
static LIST_HEAD(pinhole_list_t, pinhole_t) pinhole_list; static LIST_HEAD(pinhole_list_t, pinhole_t) pinhole_list;
static struct pinhole_t *
get_pinhole(unsigned short uid);
struct pinhole_t { struct pinhole_t {
struct in6_addr saddr; struct in6_addr saddr;
struct in6_addr daddr; struct in6_addr daddr;
@ -69,6 +72,11 @@ add_to_pinhole_list(struct in6_addr * saddr, unsigned short sport,
p->timestamp = timestamp; p->timestamp = timestamp;
p->proto = (unsigned char)proto; p->proto = (unsigned char)proto;
LIST_INSERT_HEAD(&pinhole_list, p, entries); LIST_INSERT_HEAD(&pinhole_list, p, entries);
while(get_pinhole(next_uid) != NULL) {
next_uid++;
if(next_uid > 65535)
next_uid = 1;
}
p->uid = next_uid; p->uid = next_uid;
next_uid++; next_uid++;
if(next_uid > 65535) if(next_uid > 65535)
@ -369,5 +377,35 @@ get_pinhole_info(unsigned short uid,
return 0; return 0;
} }
int
clean_pinhole_list(unsigned int * next_timestamp)
{
unsigned int min_ts = UINT_MAX;
struct pinhole_t * p;
time_t current_time;
int n = 0;
current_time = time(NULL);
p = pinhole_list.lh_first;
while(p != NULL) {
if(p->timestamp <= (unsigned int)current_time) {
unsigned short uid = p->uid;
syslog(LOG_INFO, "removing expired pinhole with uid=%hu", uid);
p = p->entries.le_next;
if(delete_pinhole(uid) == 0)
n++;
else
break;
} else {
if(p->timestamp < min_ts)
min_ts = p->timestamp;
p = p->entries.le_next;
}
}
if(next_timestamp)
*next_timestamp = min_ts;
return n;
}
#endif #endif

View File

@ -1,4 +1,4 @@
/* $Id: iptpinhole.h,v 1.4 2012/05/01 22:37:53 nanard Exp $ */ /* $Id: iptpinhole.h,v 1.5 2012/05/08 20:41:45 nanard Exp $ */
/* MiniUPnP project /* MiniUPnP project
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* (c) 2012 Thomas Bernard * (c) 2012 Thomas Bernard
@ -24,6 +24,8 @@ get_pinhole_info(unsigned short uid,
int * proto, unsigned int * timestamp, int * proto, unsigned int * timestamp,
u_int64_t * packets, u_int64_t * bytes); u_int64_t * packets, u_int64_t * bytes);
int clean_pinhole_list(unsigned int * next_timestamp);
#endif #endif
#endif #endif

View File

@ -1,4 +1,4 @@
/* $Id: upnppinhole.c,v 1.3 2012/05/07 15:40:04 nanard Exp $ */ /* $Id: upnppinhole.c,v 1.4 2012/05/08 20:41:45 nanard Exp $ */
/* MiniUPnP project /* MiniUPnP project
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* (c) 2006-2012 Thomas Bernard * (c) 2006-2012 Thomas Bernard
@ -499,7 +499,7 @@ upnp_check_pinhole_working(const char * uid,
int int
upnp_clean_expired_pinholes(unsigned int * next_timestamp) upnp_clean_expired_pinholes(unsigned int * next_timestamp)
{ {
#ifdef USE_PF #if defined(USE_PF) || defined(USE_NETFILTER)
return clean_pinhole_list(next_timestamp); return clean_pinhole_list(next_timestamp);
#else #else
UNUSED(next_timestamp); UNUSED(next_timestamp);