Make all network interrupt service routines MPSAFE part 1/3.
[dragonfly.git] / sys / netproto / atalk / ddp_output.c
index 1e4ab06..8ca2793 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 /* $FreeBSD: src/sys/netatalk/ddp_output.c,v 1.13.6.1 2000/06/02 22:39:07 archie Exp $ */
-/* $DragonFly: src/sys/netproto/atalk/ddp_output.c,v 1.2 2003/06/17 04:28:48 dillon Exp $ */
+/* $DragonFly: src/sys/netproto/atalk/ddp_output.c,v 1.8 2005/11/28 17:13:46 dillon Exp $ */
 
 #include <sys/param.h>
 #include <sys/systm.h>
 
 #undef s_net
 
-#include <netatalk/at.h>
-#include <netatalk/at_var.h>
-#include <netatalk/ddp.h>
-#include <netatalk/ddp_var.h>
-#include <netatalk/at_extern.h>
+#include "at.h"
+#include "at_var.h"
+#include "ddp.h"
+#include "ddp_var.h"
+#include "at_extern.h"
 
 int    ddp_cksum = 1;
 
 int
-ddp_output( struct mbuf *m, struct socket *so)
+ddp_output(struct mbuf *m, struct socket *so, ...)
 {
     struct ddpehdr     *deh;
     struct ddpcb *ddp = sotoddpcb( so );
 
-    M_PREPEND( m, sizeof( struct ddpehdr ), M_WAIT );
+    M_PREPEND( m, sizeof( struct ddpehdr ), MB_WAIT );
+    if (m == NULL)
+           return (ENOBUFS);
 
     deh = mtod( m, struct ddpehdr *);
     deh->deh_pad = 0;
@@ -119,6 +121,7 @@ ddp_route( struct mbuf *m, struct route *ro)
     struct at_ifaddr   *aa = NULL;
     struct ifnet       *ifp = NULL;
     u_short            net;
+    int        error;
 
 #if 0
     /* Check for net zero, node zero ("myself") */
@@ -163,8 +166,8 @@ ddp_route( struct mbuf *m, struct route *ro)
 
     if ( aa == NULL ) {
 #ifdef NETATALK_DEBUG
-       printf( "ddp_route: no atalk address found for %s%d\n", 
-           ifp->if_name, ifp->if_unit);
+       printf( "ddp_route: no atalk address found for %s\n", 
+           ifp->if_xname);
 #endif
        m_freem( m );
        return( ENETUNREACH );
@@ -190,7 +193,7 @@ ddp_route( struct mbuf *m, struct route *ro)
      * packets end up poorly aligned due to the three byte elap header.
      */
     if ( !(aa->aa_flags & AFA_PHASE2) ) {
-       MGET( m0, M_WAIT, MT_HEADER );
+       MGET( m0, MB_WAIT, MT_HEADER );
        if ( m0 == 0 ) {
            m_freem( m );
            printf("ddp_route: no buffers\n");
@@ -209,14 +212,14 @@ ddp_route( struct mbuf *m, struct route *ro)
     ro->ro_rt->rt_use++;
 
 #ifdef NETATALK_DEBUG
-    printf ("ddp_route: from %d.%d to %d.%d, via %d.%d (%s%d)\n",
+    printf ("ddp_route: from %d.%d to %d.%d, via %d.%d (%s)\n",
        ntohs(satosat(&aa->aa_addr)->sat_addr.s_net),
        satosat(&aa->aa_addr)->sat_addr.s_node,
        ntohs(satosat(&ro->ro_dst)->sat_addr.s_net),
        satosat(&ro->ro_dst)->sat_addr.s_node,
        ntohs(gate.sat_addr.s_net),
        gate.sat_addr.s_node,
-       ifp->if_name, ifp->if_unit);
+       ifp->if_xname);
 #endif
 
     /* short-circuit the output if we're sending this to ourself */
@@ -226,6 +229,9 @@ ddp_route( struct mbuf *m, struct route *ro)
        return (if_simloop(ifp, m, gate.sat_family, 0));
     }
 
-    return((*ifp->if_output)( ifp,
-       m, (struct sockaddr *)&gate, NULL)); /* XXX */
+    /* XXX */
+    lwkt_serialize_enter(ifp->if_serializer);
+    error = (*ifp->if_output)( ifp, m, (struct sockaddr *)&gate, NULL);
+    lwkt_serialize_exit(ifp->if_serializer);
+    return (error);
 }