diff options
author | Markus Friedl <markus@cvs.openbsd.org> | 2008-05-09 02:44:56 +0000 |
---|---|---|
committer | Markus Friedl <markus@cvs.openbsd.org> | 2008-05-09 02:44:56 +0000 |
commit | 6b5278216d3e945e7764e8fb4d6084731d9c1d42 (patch) | |
tree | e16579e8549035c8a3ce6525cf6278091980d103 /sys/netinet/in_pcb.c | |
parent | bf10d8a20a778604168423fc81c27ee72bc63285 (diff) |
divert packets to local socket without modifying the ip header;
makes transparent proxies much easier; ok beck@, feedback claudio@
Diffstat (limited to 'sys/netinet/in_pcb.c')
-rw-r--r-- | sys/netinet/in_pcb.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index ae5c16d9994..e3e8d58bdfa 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in_pcb.c,v 1.94 2008/05/07 05:14:21 claudio Exp $ */ +/* $OpenBSD: in_pcb.c,v 1.95 2008/05/09 02:44:54 markus Exp $ */ /* $NetBSD: in_pcb.c,v 1.25 1996/02/13 23:41:53 christos Exp $ */ /* @@ -68,6 +68,8 @@ * Research Laboratory (NRL). */ +#include "pf.h" + #include <sys/param.h> #include <sys/systm.h> #include <sys/mbuf.h> @@ -80,6 +82,7 @@ #include <net/if.h> #include <net/route.h> +#include <net/pfvar.h> #include <netinet/in.h> #include <netinet/in_systm.h> @@ -1009,17 +1012,24 @@ in6_pcbhashlookup(table, faddr, fport_arg, laddr, lport_arg) * *.* <-> *.lport */ struct inpcb * -in_pcblookup_listen(table, laddr, lport_arg, reverse) - struct inpcbtable *table; - struct in_addr laddr; - u_int lport_arg; - int reverse; +in_pcblookup_listen(struct inpcbtable *table, struct in_addr laddr, + u_int lport_arg, int reverse, struct mbuf *m) { struct inpcbhead *head; struct in_addr *key1, *key2; struct inpcb *inp; u_int16_t lport = lport_arg; +#if NPF + if (m->m_pkthdr.pf.flags & PF_TAG_DIVERTED) { + struct pf_divert *divert; + + if ((divert = pf_find_divert(m)) == NULL) + return (NULL); + key1 = key2 = &divert->addr.ipv4; + lport = divert->port; + } else +#endif if (reverse) { key1 = &zeroin_addr; key2 = &laddr; |