So sorry its not a propper diff anymore but this is what i've done: --- sys.bak/kern/uipc_socket.c Wed Mar 5 21:11:31 2008 +++ sys/kern/uipc_socket.c Thu Mar 6 06:50:29 2008 @@ -48,6 +48,8 @@ #include <sys/resourcevar.h> #include <sys/pool.h>
+#include <net/pfvar.h> + void filt_sordetach(struct knote *kn); int filt_soread(struct knote *kn, long hint); void filt_sowdetach(struct knote *kn); @@ -115,6 +117,7 @@ socreate(int dom, struct socket **aso, int type, int p so->so_rgid = p->p_cred->p_rgid; so->so_egid = p->p_ucred->cr_gid; so->so_cpid = p->p_pid; + so->so_pftag = 0; so->so_proto = prp; error = (*prp->pr_usrreq)(so, PRU_ATTACH, NULL, (struct mbuf *)(long)proto, NULL); @@ -1085,6 +1088,17 @@ sosetopt(struct socket *so, int level, int optname, st } break; } + + case SO_PFTAG: + { + if (m == NULL) { + error = EINVAL; + printf("Error while setting tag\n"); + goto bad; + } + so->so_pftag = pf_tagname2tag(mtod(m, char *)); + break; + } default: error = ENOPROTOOPT; @@ -1173,6 +1187,14 @@ sogetopt(struct socket *so, int level, int optname, st mtod(m, struct timeval *)->tv_sec = val / hz; mtod(m, struct timeval *)->tv_usec = (val % hz) * tick; + break; + } + case SO_PFTAG: + { + char tagname[PF_TAG_NAME_SIZE]; + pf_tag2tagname(so->so_pftag, tagname); + m->m_len = strlen(tagname) + 1; + strlcpy(mtod(m, char *), tagname, MLEN); break; } --- sys.bak/net/pfvar.h Wed Mar 5 21:12:24 2008 +++ sys/net/pfvar.h Wed Mar 5 23:31:03 2008 @@ -41,6 +41,7 @@ #include <net/radix.h> #include <net/route.h> +#include <net/if.h> #include <netinet/ip_ipsp.h> #include <netinet/tcp_fsm.h> --- sys.bak/netinet/tcp_output.c Wed Mar 5 21:12:02 2008 +++ sys/netinet/tcp_output.c Wed Mar 5 23:53:37 2008 @@ -98,6 +98,8 @@ #include <netinet6/in6_var.h> #endif /* INET6 */ +#include <net/pfvar.h> + #ifdef notyet extern struct mbuf *m_copypack(); #endif @@ -698,6 +700,10 @@ send: error = ENOBUFS; goto out; } + if (so->so_pftag != 0) + { + pf_tag_packet(m, so->so_pftag, -1); + } /* * m_copypack left space for our hdr; use it. */ @@ -716,6 +722,10 @@ send: error = ENOBUFS; goto out; } + if (so->so_pftag != 0) + { + pf_tag_packet(m, so->so_pftag, -1); + } m->m_data += max_linkhdr; m->m_len = hdrlen; if (len <= M_TRAILINGSPACE(m)) { @@ -761,6 +771,11 @@ send: error = ENOBUFS; goto out; } + if (so->so_pftag != 0) + { + pf_tag_packet(m, so->so_pftag, -1); + } + m->m_data += max_linkhdr; m->m_len = hdrlen; } --- sys.bak/sys/socket.h Wed Mar 5 21:12:13 2008 +++ sys/sys/socket.h Wed Mar 5 21:28:05 2008 @@ -80,6 +80,7 @@ #define SO_ERROR 0x1007 /* get error status and clear */ #define SO_TYPE 0x1008 /* get socket type */ #define SO_NETPROC 0x1020 /* multiplex; network processing */ +#define SO_PFTAG 0x1030 /* tag packets from this socket */ /* * Structure used for manipulating linger option. --- sys.bak/sys/socketvar.h Wed Mar 5 21:12:13 2008 +++ sys/sys/socketvar.h Wed Mar 5 23:46:07 2008 @@ -108,6 +108,7 @@ struct socket { uid_t so_euid, so_ruid; /* who opened the socket */ gid_t so_egid, so_rgid; pid_t so_cpid; /* pid of process that opened socket */ + u_int16_t so_pftag; /* tag a packet from this socket */ }; #define SB_EMPTY_FIXUP(sb) \