Once we distribute socket protocol processing requests to different
[dragonfly.git] / sys / netproto / natm / natm.c
index 17dae6a..8c5fb4e 100644 (file)
@@ -1,5 +1,6 @@
 /*     $NetBSD: natm.c,v 1.5 1996/11/09 03:26:26 chuck Exp $   */
 /* $FreeBSD: src/sys/netnatm/natm.c,v 1.12 2000/02/13 03:32:03 peter Exp $ */
+/* $DragonFly: src/sys/netproto/natm/natm.c,v 1.10 2004/03/05 16:57:16 hsu Exp $ */
 
 /*
  *
@@ -53,7 +54,7 @@
 
 #include <netinet/in.h>
 
-#include <netnatm/natm.h>
+#include "natm.h"
 
 static u_long natm5_sendspace = 16*1024;
 static u_long natm5_recvspace = 16*1024;
@@ -68,25 +69,25 @@ static u_long natm0_recvspace = 16*1024;
 /*
  * FreeBSD new usrreqs supersedes pr_usrreq.
  */
-static int natm_usr_attach __P((struct socket *, int, struct proc *));
-static int natm_usr_detach __P((struct socket *));
-static int natm_usr_connect __P((struct socket *, struct sockaddr *,
-                                struct proc *));
-static int natm_usr_disconnect __P((struct socket *));
-static int natm_usr_shutdown __P((struct socket *));
-static int natm_usr_send __P((struct socket *, int, struct mbuf *,
+static int natm_usr_attach (struct socket *, int, struct pru_attach_info *ai);
+static int natm_usr_detach (struct socket *);
+static int natm_usr_connect (struct socket *, struct sockaddr *,
+                                struct thread *);
+static int natm_usr_disconnect (struct socket *);
+static int natm_usr_shutdown (struct socket *);
+static int natm_usr_send (struct socket *, int, struct mbuf *,
                              struct sockaddr *, struct mbuf *, 
-                             struct proc *));
-static int natm_usr_peeraddr __P((struct socket *, struct sockaddr **));
-static int natm_usr_control __P((struct socket *, u_long, caddr_t,
-                                struct ifnet *, struct proc *));
-static int natm_usr_abort __P((struct socket *));
-static int natm_usr_bind __P((struct socket *, struct sockaddr *, 
-                             struct proc *));
-static int natm_usr_sockaddr __P((struct socket *, struct sockaddr **));
+                             struct thread *);
+static int natm_usr_peeraddr (struct socket *, struct sockaddr **);
+static int natm_usr_control (struct socket *, u_long, caddr_t,
+                                struct ifnet *, struct thread *);
+static int natm_usr_abort (struct socket *);
+static int natm_usr_bind (struct socket *, struct sockaddr *, 
+                             struct thread *);
+static int natm_usr_sockaddr (struct socket *, struct sockaddr **);
 
 static int
-natm_usr_attach(struct socket *so, int proto, struct proc *p)
+natm_usr_attach(struct socket *so, int proto, struct pru_attach_info *ai)
 {
     struct natmpcb *npcb;
     int error = 0;
@@ -101,9 +102,11 @@ natm_usr_attach(struct socket *so, int proto, struct proc *p)
 
     if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
        if (proto == PROTO_NATMAAL5) 
-           error = soreserve(so, natm5_sendspace, natm5_recvspace);
+           error = soreserve(so, natm5_sendspace, natm5_recvspace,
+                             ai->sb_rlimit);
        else
-           error = soreserve(so, natm0_sendspace, natm0_recvspace);
+           error = soreserve(so, natm0_sendspace, natm0_recvspace,
+                             ai->sb_rlimit);
         if (error)
           goto out;
     }
@@ -140,7 +143,7 @@ natm_usr_detach(struct socket *so)
 }
 
 static int
-natm_usr_connect(struct socket *so, struct sockaddr *nam, struct proc *p)
+natm_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
     struct natmpcb *npcb;
     struct sockaddr_natm *snatm;
@@ -274,7 +277,7 @@ natm_usr_shutdown(struct socket *so)
 
 static int
 natm_usr_send(struct socket *so, int flags, struct mbuf *m, 
-             struct sockaddr *nam, struct mbuf *control, struct proc *p)
+             struct sockaddr *nam, struct mbuf *control, struct thread *td)
 {
     struct natmpcb *npcb;
     struct atm_pseudohdr *aph;
@@ -334,8 +337,8 @@ natm_usr_peeraddr(struct socket *so, struct sockaddr **nam)
     bzero(snatm, sizeof(*snatm));
     snatm->snatm_len = sizeof(*snatm);
     snatm->snatm_family = AF_NATM;
-    snprintf(snatm->snatm_if, sizeof(snatm->snatm_if),
-       "%s%d", npcb->npcb_ifp->if_name, npcb->npcb_ifp->if_unit);
+    strlcpy(snatm->snatm_if, npcb->npcb_ifp->if_xname,
+        sizeof(snatm->snatm_if));
     snatm->snatm_vci = npcb->npcb_vci;
     snatm->snatm_vpi = npcb->npcb_vpi;
     *nam = dup_sockaddr((struct sockaddr *)snatm, 0);
@@ -347,7 +350,7 @@ natm_usr_peeraddr(struct socket *so, struct sockaddr **nam)
 
 static int
 natm_usr_control(struct socket *so, u_long cmd, caddr_t arg,
-                struct ifnet *ifp, struct proc *p)
+                struct ifnet *ifp, struct thread *td)
 {
     struct natmpcb *npcb;
     struct atm_rawioctl ario;
@@ -395,7 +398,7 @@ natm_usr_abort(struct socket *so)
 }
 
 static int
-natm_usr_bind(struct socket *so, struct sockaddr *nam, struct proc *p)
+natm_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
     return EOPNOTSUPP;
 }
@@ -420,7 +423,7 @@ struct pr_usrreqs natm_usrreqs = {
 
 #if defined(__NetBSD__) || defined(__OpenBSD__)
 int natm_usrreq(so, req, m, nam, control, p)
-#elif defined(__FreeBSD__)
+#elif defined(__DragonFly__)
 int natm_usrreq(so, req, m, nam, control)
 #endif
 
@@ -621,9 +624,9 @@ struct proc *p;
       bzero(snatm, sizeof(*snatm));
       nam->m_len = snatm->snatm_len = sizeof(*snatm);
       snatm->snatm_family = AF_NATM;
-#if defined(__NetBSD__) || defined(__OpenBSD__)
+#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
       bcopy(npcb->npcb_ifp->if_xname, snatm->snatm_if, sizeof(snatm->snatm_if));
-#elif defined(__FreeBSD__)
+#elif defined(__DragonFly__)
       snprintf(snatm->snatm_if, sizeof(snatm->snatm_if),
        "%s%d", npcb->npcb_ifp->if_name, npcb->npcb_ifp->if_unit);
 #endif
@@ -688,6 +691,54 @@ done:
 
 #endif  /* !FREEBSD_USRREQS */
 
+/* 
+ * natm0_sysctl: not used, but here in case we want to add something
+ * later...
+ */
+
+int natm0_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp,
+    void *newp, size_t newlen)
+{
+  /* All sysctl names at this level are terminal. */
+  if (namelen != 1)
+    return (ENOTDIR);
+  return (ENOPROTOOPT);
+}
+
+/* 
+ * natm5_sysctl: not used, but here in case we want to add something
+ * later...
+ */
+
+int natm5_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp,
+    void *newp, size_t newlen)
+{
+  /* All sysctl names at this level are terminal. */
+  if (namelen != 1)
+    return (ENOTDIR);
+  return (ENOPROTOOPT);
+}
+
+static void natmintr(struct mbuf *);
+
+#if defined(__DragonFly__)
+static void
+netisr_natm_setup(void *dummy __unused)
+{
+
+       netisr_register(NETISR_NATM, cpu0_portfn, natmintr);
+}
+SYSINIT(natm_setup, SI_SUB_CPU, SI_ORDER_ANY, netisr_natm_setup, NULL);
+#endif
+
+void
+natm_init()
+{
+  LIST_INIT(&natm_pcbs);
+
+  netisr_register(NETISR_NATM, cpu0_portfn, natmintr);
+}
+
 /*
  * natmintr: splsoftnet interrupt
  *
@@ -695,23 +746,13 @@ done:
  * pointer.    we can get the interface pointer from the so's PCB if
  * we really need it.
  */
-
-void
-natmintr()
-
+static void
+natmintr(struct mbuf *m)
 {
   int s;
-  struct mbuf *m;
   struct socket *so;
   struct natmpcb *npcb;
 
-next:
-  s = splimp();
-  IF_DEQUEUE(&natmintrq, m);
-  splx(s);
-  if (m == NULL)
-    return;
-
 #ifdef DIAGNOSTIC
   if ((m->m_flags & M_PKTHDR) == 0)
     panic("natmintr no HDR");
@@ -728,12 +769,12 @@ next:
     m_freem(m);
     if (npcb->npcb_inq == 0)
       FREE(npcb, M_PCB);                       /* done! */
-    goto next;
+    return;
   }
 
   if (npcb->npcb_flags & NPCB_FREE) {
     m_freem(m);                                        /* drop */
-    goto next;
+    return;
   }
 
 #ifdef NEED_TO_RESTORE_IFP
@@ -759,59 +800,5 @@ m->m_pkthdr.rcvif = NULL;  /* null it out to be safe */
 #endif
     m_freem(m);
   }
-
-  goto next;
-}
-
-#if defined(__FreeBSD__)
-static void
-netisr_natm_setup(void *dummy __unused)
-{
-
-       register_netisr(NETISR_NATM, natmintr);
 }
-SYSINIT(natm_setup, SI_SUB_CPU, SI_ORDER_ANY, netisr_natm_setup, NULL);
-#endif
-
-
-/* 
- * natm0_sysctl: not used, but here in case we want to add something
- * later...
- */
-
-int natm0_sysctl(name, namelen, oldp, oldlenp, newp, newlen)
 
-int *name;
-u_int namelen;
-void *oldp;
-size_t *oldlenp;
-void *newp;
-size_t newlen;
-
-{
-  /* All sysctl names at this level are terminal. */
-  if (namelen != 1)
-    return (ENOTDIR);
-  return (ENOPROTOOPT);
-}
-
-/* 
- * natm5_sysctl: not used, but here in case we want to add something
- * later...
- */
-
-int natm5_sysctl(name, namelen, oldp, oldlenp, newp, newlen)
-
-int *name;
-u_int namelen;
-void *oldp;
-size_t *oldlenp;
-void *newp;
-size_t newlen;
-
-{
-  /* All sysctl names at this level are terminal. */
-  if (namelen != 1)
-    return (ENOTDIR);
-  return (ENOPROTOOPT);
-}