summaryrefslogtreecommitdiffstats
path: root/sys/netkey/key.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1998-04-05 05:19:00 +0000
committerpeter <peter@FreeBSD.org>1998-04-05 05:19:00 +0000
commitfdb7a2eb670a264e445c873f43be79bac7e39820 (patch)
treeebe0424b1a0aba997313603617831844e4a42891 /sys/netkey/key.c
parent9cde5a8d0963c890fc763dc9f3108cc1808c9ff2 (diff)
downloadFreeBSD-src-fdb7a2eb670a264e445c873f43be79bac7e39820.zip
FreeBSD-src-fdb7a2eb670a264e445c873f43be79bac7e39820.tar.gz
Maybe fix netkey. I am not sure how to test this..
Diffstat (limited to 'sys/netkey/key.c')
-rw-r--r--sys/netkey/key.c112
1 files changed, 68 insertions, 44 deletions
diff --git a/sys/netkey/key.c b/sys/netkey/key.c
index a589bea..0f74055 100644
--- a/sys/netkey/key.c
+++ b/sys/netkey/key.c
@@ -157,6 +157,8 @@ u_long maxacquiretime = MAXACQUIRETIME;
extern struct sockaddr key_addr;
+extern struct pr_usrreqs raw_usrreqs;
+
#define ROUNDUP(a) \
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
#define ADVANCE(x, n) \
@@ -180,8 +182,8 @@ static int key_sendup __P((struct socket *, struct key_msghdr *));
static void key_init __P((void));
static int my_addr __P((struct sockaddr *));
static int key_output __P((struct mbuf *, struct socket *));
-static int key_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *,
- struct mbuf *));
+static int key_attach __P((struct socket *, int, struct proc *));
+static int key_detach __P((struct socket *));
static void key_cbinit __P((void));
/*----------------------------------------------------------------------
@@ -2367,46 +2369,30 @@ flush:
* key_usrreq():
* Handles PRU_* for pf_key sockets.
----------------------------------------------------------------------*/
+
static int
-key_usrreq(so, req, m, nam, control)
- struct socket *so;
- int req;
- struct mbuf *m;
- struct mbuf *nam;
- struct mbuf *control;
+key_attach(struct socket *so, int proto, struct proc *p)
{
register int error = 0;
- register struct rawcb *rp = sotorawcb(so);
+ register struct rawcb *rp;
int s;
- DPRINTF(IDL_EVENT,("Entering key_usrreq, req = %d.\n",req));
+ DPRINTF(IDL_EVENT,("Entering key_attach\n"));
- if (req == PRU_ATTACH) {
- MALLOC(rp, struct rawcb *, sizeof(*rp), M_PCB, M_WAITOK);
- if (so->so_pcb = (caddr_t)rp)
- bzero(so->so_pcb, sizeof(*rp));
- }
-
- if (req == PRU_DETACH && rp) {
- int af = rp->rcb_proto.sp_protocol;
- if (af == AF_INET)
- keyso_cb.ip4_count--;
-#ifdef INET6
- else if (af == AF_INET6)
- keyso_cb.ip6_count--;
-#endif /* INET6 */
- keyso_cb.any_count--;
+ MALLOC(rp, struct rawcb *, sizeof(*rp), M_PCB, M_WAITOK);
+ if (rp) {
+ bzero(rp, sizeof(*rp));
+ so->so_pcb = (caddr_t)rp;
}
s = splnet();
-#if 0
- error = raw_usrreq(so, req, m, nam, control);
-#else
- panic("FIXME!");
-#endif
- if (!so) return error;
- rp = sotorawcb(so);
+ error = (raw_usrreqs.pru_attach)(so, proto, p);
+ if (!error) { /* XXX was: if (!so) which didn't make sense */
+ splx(s);
+ return error;
+ }
- if (req == PRU_ATTACH && rp) {
+ rp = sotorawcb(so); /* isn't this redundant? */
+ if (rp) {
int af = rp->rcb_proto.sp_protocol;
if (error) {
free((caddr_t)rp, M_PCB);
@@ -2423,15 +2409,15 @@ key_usrreq(so, req, m, nam, control)
#if 0 /*itojun*/
rp->rcb_faddr = &key_addr;
#else
- {
- struct mbuf *m;
- MGET(m, M_DONTWAIT, MT_DATA);
- if (m) {
- rp->rcb_faddr = mtod(m, struct sockaddr *);
- bcopy(&key_addr, rp->rcb_faddr, sizeof(struct sockaddr));
- } else
- rp->rcb_faddr = NULL;
- }
+ {
+ struct mbuf *m;
+ MGET(m, M_DONTWAIT, MT_DATA);
+ if (m) { /* XXX but what about sin_len here? -PW */
+ rp->rcb_faddr = mtod(m, struct sockaddr *);
+ bcopy(&key_addr, rp->rcb_faddr, sizeof(struct sockaddr));
+ } else
+ rp->rcb_faddr = NULL;
+ }
#endif
soisconnected(so); /* Key socket, like routing socket, must be
connected. */
@@ -2444,6 +2430,33 @@ key_usrreq(so, req, m, nam, control)
return error;
}
+static int
+key_detach(struct socket *so)
+{
+ register int error = 0;
+ register struct rawcb *rp;
+ int s;
+
+ DPRINTF(IDL_EVENT,("Entering key_detach\n"));
+
+ rp = sotorawcb(so);
+ if (rp) {
+ int af = rp->rcb_proto.sp_protocol;
+ if (af == AF_INET)
+ keyso_cb.ip4_count--;
+#ifdef INET6
+ else if (af == AF_INET6)
+ keyso_cb.ip6_count--;
+#endif /* INET6 */
+ keyso_cb.any_count--;
+ }
+ s = splnet();
+ error = (raw_usrreqs.pru_detach)(so);
+ splx(s);
+ return error;
+
+}
+
/*----------------------------------------------------------------------
* key_cbinit():
* Control block init routine for key socket
@@ -2465,12 +2478,23 @@ key_cbinit()
extern struct domain keydomain; /* or at least forward */
+struct pr_usrreqs key_usrreqs = {
+ raw_usrreqs.pru_abort, pru_accept_notsupp, key_attach, raw_usrreqs.pru_bind,
+ raw_usrreqs.pru_connect,
+ pru_connect2_notsupp, in_control, key_detach, raw_usrreqs.pru_disconnect,
+ pru_listen_notsupp, in_setpeeraddr, pru_rcvd_notsupp,
+ pru_rcvoob_notsupp, raw_usrreqs.pru_send, pru_sense_null,
+ raw_usrreqs.pru_shutdown,
+ in_setsockaddr, sosend, soreceive, sopoll
+};
+
+
struct protosw keysw[] = {
{ SOCK_RAW, &keydomain, 0, PR_ATOMIC|PR_ADDR,
raw_input, key_output, raw_ctlinput, 0,
- key_usrreq,
- key_cbinit, 0, 0, 0,
0,
+ key_cbinit, 0, 0, 0,
+ key_usrreqs,
},
};
OpenPOWER on IntegriCloud