On 30/05/17(Tue) 14:05, Claudio Jeker wrote: > This is more or less the same thing for PF_KEY that we now do in PF_ROUTE. > Use one PCB LIST on the keycb and embedd the rawcb in that PF_KEY cb. > Diff also has a few variable renames in it to make this code less alien > regarding the rest of our kernel. Mainly use so instead of socket and > pfkeyv2_socket is also replaced with better variable names. > > This needs the previous diff I just sent out for PF_ROUTE. > After that I can make pfkey use the same SRPL_LIST as PF_ROUTE (from an > other diff) to unlock them more. > -- > :wq Claudio > > Index: net/pfkeyv2.c > =================================================================== > RCS file: /cvs/src/sys/net/pfkeyv2.c,v > retrieving revision 1.160 > diff -u -p -r1.160 pfkeyv2.c > --- net/pfkeyv2.c 29 May 2017 20:31:12 -0000 1.160 > +++ net/pfkeyv2.c 30 May 2017 08:44:05 -0000 > @@ -212,71 +213,62 @@ pfkey_init(void) > int > pfkeyv2_attach(struct socket *so, int proto) > { > - struct pfkeyv2_socket *pfkeyv2_socket; > + struct rawcb *rp; > + struct keycb *pk; > int error; > > if ((so->so_state & SS_PRIV) == 0) > return EACCES; > > - if (!(so->so_pcb = malloc(sizeof(struct rawcb), > - M_PCB, M_DONTWAIT | M_ZERO))) > - return (ENOMEM); > - > - error = raw_attach(so, so->so_proto->pr_protocol); > - if (error) > - goto ret; > - > - ((struct rawcb *)so->so_pcb)->rcb_faddr = &pfkey_addr; > - > - if (!(pfkeyv2_socket = malloc(sizeof(struct pfkeyv2_socket), > - M_PFKEY, M_NOWAIT | M_ZERO))) > - return (ENOMEM); > + pk = malloc(sizeof(struct keycb), M_PCB, M_WAITOK | M_ZERO); > + rp = &pk->rcb; > + so->so_pcb = rp; > + > + error = raw_attach(so, proto); > + if (error) { > + free(pk, M_PCB, sizeof(struct keycb)); > + return (error); > + } > > - LIST_INSERT_HEAD(&pfkeyv2_sockets, pfkeyv2_socket, kcb_list); > - pfkeyv2_socket->socket = so; > - pfkeyv2_socket->pid = curproc->p_p->ps_pid; > + rp->rcb_faddr = &pfkey_addr; > + pk->pid = curproc->p_p->ps_pid; > > /* > * XXX we should get this from the socket instead but > * XXX rawcb doesn't store the rdomain like inpcb does. > */ > - pfkeyv2_socket->rdomain = rtable_l2(curproc->p_p->ps_rtableid); > + pk->rdomain = rtable_l2(curproc->p_p->ps_rtableid); > + > + LIST_INSERT_HEAD(&pfkeyv2_sockets, pk, kcb_list); > > so->so_options |= SO_USELOOPBACK; > soisconnected(so);
Same comment as for PF_ROUTE, I'd do the insertion here. > return (0); > -ret: > - free(so->so_pcb, M_PCB, sizeof(struct rawcb)); > - return (error); > } > > /* > * Close a PF_KEYv2 socket. > */ > int > -pfkeyv2_detach(struct socket *socket, struct proc *p) > +pfkeyv2_detach(struct socket *so, struct proc *p) > { > - struct pfkeyv2_socket *pp; > + struct keycb *pp; I'd rename 'pp' into 'pk' for coherency since you're changing all the lines ;) > int error; > > - LIST_FOREACH(pp, &pfkeyv2_sockets, kcb_list) > - if (pp->socket == socket) > - break; > - > - if (pp) { > - LIST_REMOVE(pp, kcb_list); > + pp = sotokeycb(so); > + if (pp == NULL) > + return ENOTCONN; > > - if (pp->flags & PFKEYV2_SOCKETFLAGS_REGISTERED) > - nregistered--; > + LIST_REMOVE(pp, kcb_list); > > - if (pp->flags & PFKEYV2_SOCKETFLAGS_PROMISC) > - npromisc--; > + if (pp->flags & PFKEYV2_SOCKETFLAGS_REGISTERED) > + nregistered--; > > - free(pp, M_PFKEY, 0); > - } > + if (pp->flags & PFKEYV2_SOCKETFLAGS_PROMISC) > + npromisc--; > > - error = raw_usrreq(socket, PRU_DETACH, NULL, NULL, NULL, p); > + error = raw_usrreq(so, PRU_DETACH, NULL, NULL, NULL, p); Why not call raw_detach() directly and return 0? > return (error); > } The rest is ok :)