hmm so by the way.. it was a mistake form my side, the pf.conf takes
the @ if the rule is:
block out on fxp1 tagged "@foo"

instead of:

block out on fxp1 tagged @foo

I allready implement it and test it would work, the question for me
is, if the uid would be necessary and the namespace is enough, because
if want to allow non-root processes to set tags, why we should need to
look for the userid, if the @ allready indicates its an
non-root-set-tag?

Here is the uipc_socket.c diff the rest didn't change since my last diff.

Good start in the week everybody!

Index: uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.67
diff -p -r1.67 uipc_socket.c
*** uipc_socket.c       20 Dec 2007 17:16:50 -0000      1.67
--- uipc_socket.c       9 Mar 2008 23:44:33 -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,1120 ----
                        }
                        break;
                    }
+               
+               case SO_PFTAG:
+                   {
+                       char tagname[PF_TAG_NAME_SIZE] = "@";
+                       if (m == NULL)  {
+                               error = EINVAL;
+                               goto bad;
+                       }
+                       if(so->so_pftag != 0)
+                       {
+                               pf_tag_unref(so->so_pftag);
+                       }
+                       strlcat(tagname, mtod(m, char *), PF_TAG_NAME_SIZE);
+                       so->so_pftag = pf_tagname2tag(tagname);
+                       if(so->so_pftag == 0)
+                       {
+                               error = EINVAL; /*XXX*/
+                               goto bad;       
+                       }
+                       break;
+                   }

                default:
                        error = ENOPROTOOPT;
*************** sogetopt(struct socket *so, int level, i
*** 1173,1178 ****
--- 1203,1216 ----
                        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;
                    }

Reply via email to