So now I added the ip6_output and I think i got a solution for the
accept, but I'm not 100% sure if that is enough. I tested it and it
looked fine. I couldn't test the ip6_output, because i don't have the
enviroment for it till now :) I'll hope to do this tommorw.
The '@'-thing is something completly diffrent. I wrote something and
faild by testing it since the pfctl seems not happy about to find a
'@' in the pf.conf... I'll take a look for it tommorw, too.
Index: kern/uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.67
diff -p -r1.67 uipc_socket.c
*** kern/uipc_socket.c 20 Dec 2007 17:16:50 -0000 1.67
--- kern/uipc_socket.c 7 Mar 2008 21:30:55 -0000
***************
*** 48,53 ****
--- 48,55 ----
#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);
*************** socreate(int dom, struct socket **aso, i
*** 115,120 ****
--- 117,123 ----
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);
*************** sofree(struct socket *so)
*** 188,193 ****
--- 191,200 ----
if (!soqremque(so, 0))
return;
}
+
+ if(so->so_pftag != 0)
+ pf_tag_unref(so->so_pftag);
+
sbrelease(&so->so_snd);
sorflush(so);
pool_put(&socket_pool, so);
*************** soaccept(struct socket *so, struct mbuf
*** 279,284 ****
--- 286,293 ----
else
error = ECONNABORTED;
splx(s);
+ if (!error && so->so_pftag)
+ pf_tag_ref(so->so_pftag);
return (error);
}
*************** sosetopt(struct socket *so, int level, i
*** 1085,1090 ****
--- 1094,1119 ----
}
break;
}
+
+ case SO_PFTAG:
+ {
+ if (m == NULL) {
+ error = EINVAL;
+ goto bad;
+ }
+ if(so->so_pftag != 0)
+ {
+ pf_tag_unref(so->so_pftag);
+ }
+
+ so->so_pftag = pf_tagname2tag(mtod(m, char *));
+ if(so->so_pftag == 0)
+ {
+ error = EINVAL; /*XXX*/
+ goto bad;
+ }
+ break;
+ }
default:
error = ENOPROTOOPT;
*************** sogetopt(struct socket *so, int level, i
*** 1173,1178 ****
--- 1202,1215 ----
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, m->m_len);
break;
}
Index: net/pfvar.h
===================================================================
RCS file: /cvs/src/sys/net/pfvar.h,v
retrieving revision 1.259
diff -p -r1.259 pfvar.h
*** net/pfvar.h 2 Dec 2007 12:08:04 -0000 1.259
--- net/pfvar.h 7 Mar 2008 21:30:55 -0000
***************
*** 41,46 ****
--- 41,47 ----
#include <net/radix.h>
#include <net/route.h>
+ #include <net/if.h>
#include <netinet/ip_ipsp.h>
#include <netinet/tcp_fsm.h>
Index: netinet/ip_output.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_output.c,v
retrieving revision 1.190
diff -p -r1.190 ip_output.c
*** netinet/ip_output.c 29 Oct 2007 16:19:23 -0000 1.190
--- netinet/ip_output.c 7 Mar 2008 21:30:56 -0000
*************** ip_output(struct mbuf *m0, ...)
*** 118,138 ****
struct m_tag *mtag;
struct tdb_ident *tdbi;
- struct inpcb *inp;
struct tdb *tdb;
int s;
#endif /* IPSEC */
va_start(ap, m0);
opt = va_arg(ap, struct mbuf *);
ro = va_arg(ap, struct route *);
flags = va_arg(ap, int);
imo = va_arg(ap, struct ip_moptions *);
! #ifdef IPSEC
inp = va_arg(ap, struct inpcb *);
! if (inp && (inp->inp_flags & INP_IPV6) != 0)
! panic("ip_output: IPv6 pcb is passed");
#endif /* IPSEC */
va_end(ap);
#ifdef DIAGNOSTIC
--- 118,144 ----
struct m_tag *mtag;
struct tdb_ident *tdbi;
struct tdb *tdb;
int s;
#endif /* IPSEC */
+ struct inpcb *inp;
va_start(ap, m0);
opt = va_arg(ap, struct mbuf *);
ro = va_arg(ap, struct route *);
flags = va_arg(ap, int);
imo = va_arg(ap, struct ip_moptions *);
!
inp = va_arg(ap, struct inpcb *);
! if(inp)
! {
! if(inp->inp_socket->so_pftag != 0)
! pf_tag_packet(m, inp->inp_socket->so_pftag, -1);
! #ifdef IPSEC
! if((inp->inp_flags & INP_IPV6) != 0)
! panic("ip_output: IPv6 pcb is passed");
#endif /* IPSEC */
+ }
va_end(ap);
#ifdef DIAGNOSTIC
Index: netinet6/ip6_output.c
===================================================================
RCS file: /cvs/src/sys/netinet6/ip6_output.c,v
retrieving revision 1.99
diff -p -r1.99 ip6_output.c
*** netinet6/ip6_output.c 1 Jun 2007 00:52:38 -0000 1.99
--- netinet6/ip6_output.c 7 Mar 2008 21:30:56 -0000
*************** ip6_output(m0, opt, ro, flags, im6o, ifp
*** 183,188 ****
--- 183,194 ----
if (inp && (inp->inp_flags & INP_IPV6) == 0)
panic("ip6_output: IPv4 pcb is passed");
#endif /* IPSEC */
+
+ if (inp)
+ {
+ if (inp->inp_socket->so_pftag != 0)
+ pf_tag_packet(m, inp->inp_socket->so_pftag, -1);
+ }
ip6 = mtod(m, struct ip6_hdr *);
finaldst = ip6->ip6_dst;
Index: sys/socket.h
===================================================================
RCS file: /cvs/src/sys/sys/socket.h,v
retrieving revision 1.55
diff -p -r1.55 socket.h
*** sys/socket.h 27 Nov 2007 16:22:14 -0000 1.55
--- sys/socket.h 7 Mar 2008 21:30:56 -0000
***************
*** 80,85 ****
--- 80,86 ----
#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.
Index: sys/socketvar.h
===================================================================
RCS file: /cvs/src/sys/sys/socketvar.h,v
retrieving revision 1.40
diff -p -r1.40 socketvar.h
*** sys/socketvar.h 5 Jul 2007 09:04:04 -0000 1.40
--- sys/socketvar.h 7 Mar 2008 21:30:56 -0000
*************** struct socket {
*** 108,113 ****
--- 108,114 ----
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)
\