diff --git a/port_fwd.c b/port_fwd.c index 9502463..fc4d5cb 100644 --- a/port_fwd.c +++ b/port_fwd.c @@ -68,46 +68,26 @@ static void procfs_scan_listen(int fd, unsigned int lstate, } /** - * get_bound_ports_tcp() - Get maps of TCP ports with bound sockets - * @c: Execution context - * @ns: If set, set bitmaps for ports to tap/ns -- to init otherwise + * port_fwd_scan_tcp() - Scan /proc to update TCP forwarding map + * @fwd: Forwarding information to update + * @rev: Forwarding information for the reverse direction */ -void get_bound_ports_tcp(struct ctx *c, int ns) +void port_fwd_scan_tcp(struct port_fwd *fwd, const struct port_fwd *rev) { - struct port_fwd *fwd, *rev; - - if (ns) { - fwd = &c->tcp.fwd_in; - rev = &c->tcp.fwd_out; - } else { - fwd = &c->tcp.fwd_out; - rev = &c->tcp.fwd_in; - } - memset(fwd->map, 0, PORT_BITMAP_SIZE); procfs_scan_listen(fwd->scan4, TCP_LISTEN, fwd->map, rev->map); procfs_scan_listen(fwd->scan6, TCP_LISTEN, fwd->map, rev->map); } /** - * get_bound_ports_udp() - Get maps of UDP ports with bound sockets - * @c: Execution context - * @ns: If set, set bitmaps for ports to tap/ns -- to init otherwise + * port_fwd_scan_tcp() - Scan /proc to update TCP forwarding map + * @fwd: Forwarding information to update + * @rev: Forwarding information for the reverse direction + * @tcp: Corresponding TCP forwarding information */ -void get_bound_ports_udp(struct ctx *c, int ns) +void port_fwd_scan_udp(struct port_fwd *fwd, const struct port_fwd *rev, + const struct port_fwd *tcp) { - struct port_fwd *fwd, *rev, *tcp; - - if (ns) { - fwd = &c->udp.fwd_in.f; - rev = &c->udp.fwd_out.f; - tcp = &c->tcp.fwd_in; - } else { - fwd = &c->udp.fwd_out.f; - rev = &c->udp.fwd_in.f; - tcp = &c->tcp.fwd_out; - } - memset(fwd->map, 0, PORT_BITMAP_SIZE); procfs_scan_listen(fwd->scan4, UDP_LISTEN, fwd->map, rev->map); procfs_scan_listen(fwd->scan6, UDP_LISTEN, fwd->map, rev->map); @@ -137,21 +117,23 @@ void port_fwd_init(struct ctx *c) if (c->tcp.fwd_in.mode == FWD_AUTO) { c->tcp.fwd_in.scan4 = open_in_ns(c, "/proc/net/tcp", flags); c->tcp.fwd_in.scan6 = open_in_ns(c, "/proc/net/tcp6", flags); - get_bound_ports_tcp(c, 1); + port_fwd_scan_tcp(&c->tcp.fwd_in, &c->tcp.fwd_out); } if (c->udp.fwd_in.f.mode == FWD_AUTO) { c->udp.fwd_in.f.scan4 = open_in_ns(c, "/proc/net/udp", flags); c->udp.fwd_in.f.scan6 = open_in_ns(c, "/proc/net/udp6", flags); - get_bound_ports_udp(c, 1); + port_fwd_scan_udp(&c->udp.fwd_in.f, &c->udp.fwd_out.f, + &c->tcp.fwd_in); } if (c->tcp.fwd_out.mode == FWD_AUTO) { c->tcp.fwd_out.scan4 = open("/proc/net/tcp", flags); c->tcp.fwd_out.scan6 = open("/proc/net/tcp6", flags); - get_bound_ports_tcp(c, 0); + port_fwd_scan_tcp(&c->tcp.fwd_out, &c->tcp.fwd_in); } if (c->udp.fwd_out.f.mode == FWD_AUTO) { c->udp.fwd_out.f.scan4 = open("/proc/net/udp", flags); c->udp.fwd_out.f.scan6 = open("/proc/net/udp6", flags); - get_bound_ports_udp(c, 0); + port_fwd_scan_udp(&c->udp.fwd_out.f, &c->udp.fwd_in.f, + &c->tcp.fwd_out); } } diff --git a/port_fwd.h b/port_fwd.h index 8ab6b48..8a823d8 100644 --- a/port_fwd.h +++ b/port_fwd.h @@ -35,8 +35,9 @@ struct port_fwd { in_port_t delta[NUM_PORTS]; }; -void get_bound_ports_tcp(struct ctx *c, int ns); -void get_bound_ports_udp(struct ctx *c, int ns); +void port_fwd_scan_tcp(struct port_fwd *fwd, const struct port_fwd *rev); +void port_fwd_scan_udp(struct port_fwd *fwd, const struct port_fwd *rev, + const struct port_fwd *tcp); void port_fwd_init(struct ctx *c); #endif /* PORT_FWD_H */ diff --git a/tcp.c b/tcp.c index 5b41897..c13b7de 100644 --- a/tcp.c +++ b/tcp.c @@ -3287,13 +3287,13 @@ void tcp_timer(struct ctx *c, const struct timespec *ts) struct tcp_port_rebind_arg rebind_arg = { c, 0 }; if (c->tcp.fwd_out.mode == FWD_AUTO) { - get_bound_ports_tcp(c, 0); + port_fwd_scan_tcp(&c->tcp.fwd_out, &c->tcp.fwd_in); rebind_arg.bind_in_ns = 1; NS_CALL(tcp_port_rebind, &rebind_arg); } if (c->tcp.fwd_in.mode == FWD_AUTO) { - get_bound_ports_tcp(c, 1); + port_fwd_scan_tcp(&c->tcp.fwd_in, &c->tcp.fwd_out); rebind_arg.bind_in_ns = 0; tcp_port_rebind(&rebind_arg); }