aboutsummaryrefslogtreecommitdiff
path: root/sys/netatalk
diff options
context:
space:
mode:
authorJonathan Lemon <jlemon@FreeBSD.org>2003-03-04 23:19:55 +0000
committerJonathan Lemon <jlemon@FreeBSD.org>2003-03-04 23:19:55 +0000
commit1cafed3941f1a4e9d2beb4fb126e91018505dfd4 (patch)
treef304f726e8973253d3e8a87e56119fec0276a61c /sys/netatalk
parentc141c242ac0a55a34b58cf2b06d13964d00507a4 (diff)
downloadsrc-1cafed3941f1a4e9d2beb4fb126e91018505dfd4.tar.gz
src-1cafed3941f1a4e9d2beb4fb126e91018505dfd4.zip
Update netisr handling; Each SWI now registers its queue, and all queue
drain routines are done by swi_net, which allows for better queue control at some future point. Packets may also be directly dispatched to a netisr instead of queued, this may be of interest at some installations, but currently defaults to off. Reviewed by: hsu, silby, jayanth, sam Sponsored by: DARPA, NAI Labs
Notes
Notes: svn path=/head/; revision=111888
Diffstat (limited to 'sys/netatalk')
-rw-r--r--sys/netatalk/aarp.c5
-rw-r--r--sys/netatalk/at_extern.h4
-rw-r--r--sys/netatalk/at_var.h1
-rw-r--r--sys/netatalk/ddp_input.c87
-rw-r--r--sys/netatalk/ddp_pcb.c22
-rw-r--r--sys/netatalk/ddp_usrreq.c22
6 files changed, 58 insertions, 83 deletions
diff --git a/sys/netatalk/aarp.c b/sys/netatalk/aarp.c
index a22488acf257..f2598b9ff250 100644
--- a/sys/netatalk/aarp.c
+++ b/sys/netatalk/aarp.c
@@ -258,12 +258,13 @@ aarpresolve( ac, m, destsat, desten )
}
void
-aarpinput( ac, m )
- struct arpcom *ac;
+aarpintr( m )
struct mbuf *m;
{
struct arphdr *ar;
+ struct arpcom *ac;
+ ac = (struct arpcom *)m->m_pkthdr.rcvif;
if ( ac->ac_if.if_flags & IFF_NOARP )
goto out;
diff --git a/sys/netatalk/at_extern.h b/sys/netatalk/at_extern.h
index 7a6189cc9830..8afdad144b61 100644
--- a/sys/netatalk/at_extern.h
+++ b/sys/netatalk/at_extern.h
@@ -10,7 +10,6 @@ extern int aarpresolve (struct arpcom *,
struct mbuf *,
struct sockaddr_at *,
u_char *);
-extern void aarpinput (struct arpcom *, struct mbuf *);
extern int at_broadcast (struct sockaddr_at *);
#endif
@@ -22,6 +21,9 @@ struct ifnet;
struct thread;
struct socket;
+extern void aarpintr (struct mbuf *);
+extern void at1intr (struct mbuf *);
+extern void at2intr (struct mbuf *);
extern void aarp_clean (void);
extern int at_control (struct socket *so,
u_long cmd,
diff --git a/sys/netatalk/at_var.h b/sys/netatalk/at_var.h
index c4310aa52d21..e04748508dc8 100644
--- a/sys/netatalk/at_var.h
+++ b/sys/netatalk/at_var.h
@@ -61,7 +61,6 @@ struct at_aliasreq {
#ifdef _KERNEL
extern struct at_ifaddr *at_ifaddr;
-extern struct ifqueue atintrq1, atintrq2;
#endif
#endif /* _NETATALK_AT_VAR_H_ */
diff --git a/sys/netatalk/ddp_input.c b/sys/netatalk/ddp_input.c
index 6db107fc1e39..2f7ad8361515 100644
--- a/sys/netatalk/ddp_input.c
+++ b/sys/netatalk/ddp_input.c
@@ -18,8 +18,6 @@
#include <sys/sx.h>
#include <sys/systm.h>
#include <net/if.h>
-#include <net/intrq.h>
-#include <net/netisr.h>
#include <net/route.h>
#include <netatalk/at.h>
@@ -38,77 +36,44 @@ static void ddp_input(struct mbuf *, struct ifnet *, struct elaphdr *, int);
/*
* Could probably merge these two code segments a little better...
*/
-static void
-atintr( void )
+void
+at2intr(struct mbuf *m)
{
- struct elaphdr *elhp, elh;
- struct ifnet *ifp;
- struct mbuf *m;
- int s;
-
- /*
- * First pull off all the phase 2 packets.
- */
- for (;;) {
- s = splimp();
-
- IF_DEQUEUE( &atintrq2, m );
-
- splx( s );
-
- if ( m == 0 ) { /* no more queued packets */
- break;
- }
-
- ifp = m->m_pkthdr.rcvif;
- ddp_input( m, ifp, (struct elaphdr *)NULL, 2 );
- }
-
- /*
- * Then pull off all the phase 1 packets.
- */
- for (;;) {
- s = splimp();
-
- IF_DEQUEUE( &atintrq1, m );
-
- splx( s );
- if ( m == 0 ) { /* no more queued packets */
- break;
- }
+ /*
+ * Phase 2 packet handling
+ */
+ ddp_input(m, m->m_pkthdr.rcvif, NULL, 2);
+ return;
+}
- ifp = m->m_pkthdr.rcvif;
+void
+at1intr(struct mbuf *m)
+{
+ struct elaphdr *elhp, elh;
- if ( m->m_len < SZ_ELAPHDR &&
- (( m = m_pullup( m, SZ_ELAPHDR )) == 0 )) {
- ddpstat.ddps_tooshort++;
- continue;
+ /*
+ * Phase 1 packet handling
+ */
+ if (m->m_len < SZ_ELAPHDR && ((m = m_pullup(m, SZ_ELAPHDR)) == 0)) {
+ ddpstat.ddps_tooshort++;
+ return;
}
/*
- * this seems a little dubios, but I don't know phase 1 so leave it.
+ * This seems a little dubious, but I don't know phase 1 so leave it.
*/
- elhp = mtod( m, struct elaphdr *);
- m_adj( m, SZ_ELAPHDR );
+ elhp = mtod(m, struct elaphdr *);
+ m_adj(m, SZ_ELAPHDR);
- if ( elhp->el_type == ELAP_DDPEXTEND ) {
- ddp_input( m, ifp, (struct elaphdr *)NULL, 1 );
+ if (elhp->el_type == ELAP_DDPEXTEND) {
+ ddp_input(m, m->m_pkthdr.rcvif, NULL, 1);
} else {
- bcopy((caddr_t)elhp, (caddr_t)&elh, SZ_ELAPHDR );
- ddp_input( m, ifp, &elh, 1 );
+ bcopy((caddr_t)elhp, (caddr_t)&elh, SZ_ELAPHDR);
+ ddp_input(m, m->m_pkthdr.rcvif, &elh, 1);
}
- }
- return;
-}
-
-static void
-netisr_atalk_setup(void *dummy __unused)
-{
-
- register_netisr(NETISR_ATALK, atintr);
+ return;
}
-SYSINIT(atalk_setup, SI_SUB_CPU, SI_ORDER_ANY, netisr_atalk_setup, NULL);
static void
ddp_input( m, ifp, elh, phase )
diff --git a/sys/netatalk/ddp_pcb.c b/sys/netatalk/ddp_pcb.c
index fa79cec9de4a..7e8eed80101f 100644
--- a/sys/netatalk/ddp_pcb.c
+++ b/sys/netatalk/ddp_pcb.c
@@ -14,7 +14,7 @@
#include <sys/protosw.h>
#include <net/if.h>
#include <net/route.h>
-#include <net/intrq.h>
+#include <net/netisr.h>
#include <netatalk/at.h>
#include <netatalk/at_var.h>
@@ -35,6 +35,7 @@ struct ddpcb *ddpcb = NULL;
static u_long ddp_sendspace = DDP_MAXSZ; /* Max ddp size + 1 (ddp_type) */
static u_long ddp_recvspace = 10 * ( 587 + sizeof( struct sockaddr_at ));
+static struct ifqueue atintrq1, atintrq2, aarpintrq;
static int
ddp_attach(struct socket *so, int proto, struct thread *td)
@@ -542,16 +543,19 @@ at_setsockaddr(struct socket *so, struct sockaddr **nam)
return(0);
}
-
void
-ddp_init(void )
+ddp_init(void)
{
- atintrq1.ifq_maxlen = IFQ_MAXLEN;
- atintrq2.ifq_maxlen = IFQ_MAXLEN;
- atintrq1_present = 1;
- atintrq2_present = 1;
- mtx_init(&atintrq1.ifq_mtx, "at1_inq", NULL, MTX_DEF);
- mtx_init(&atintrq2.ifq_mtx, "at2_inq", NULL, MTX_DEF);
+
+ atintrq1.ifq_maxlen = IFQ_MAXLEN;
+ atintrq2.ifq_maxlen = IFQ_MAXLEN;
+ aarpintrq.ifq_maxlen = IFQ_MAXLEN;
+ mtx_init(&atintrq1.ifq_mtx, "at1_inq", NULL, MTX_DEF);
+ mtx_init(&atintrq2.ifq_mtx, "at2_inq", NULL, MTX_DEF);
+ mtx_init(&aarpintrq.ifq_mtx, "aarp_inq", NULL, MTX_DEF);
+ netisr_register(NETISR_ATALK1, at1intr, &atintrq1);
+ netisr_register(NETISR_ATALK2, at2intr, &atintrq2);
+ netisr_register(NETISR_AARP, aarpintr, &aarpintrq);
}
#if 0
diff --git a/sys/netatalk/ddp_usrreq.c b/sys/netatalk/ddp_usrreq.c
index fa79cec9de4a..7e8eed80101f 100644
--- a/sys/netatalk/ddp_usrreq.c
+++ b/sys/netatalk/ddp_usrreq.c
@@ -14,7 +14,7 @@
#include <sys/protosw.h>
#include <net/if.h>
#include <net/route.h>
-#include <net/intrq.h>
+#include <net/netisr.h>
#include <netatalk/at.h>
#include <netatalk/at_var.h>
@@ -35,6 +35,7 @@ struct ddpcb *ddpcb = NULL;
static u_long ddp_sendspace = DDP_MAXSZ; /* Max ddp size + 1 (ddp_type) */
static u_long ddp_recvspace = 10 * ( 587 + sizeof( struct sockaddr_at ));
+static struct ifqueue atintrq1, atintrq2, aarpintrq;
static int
ddp_attach(struct socket *so, int proto, struct thread *td)
@@ -542,16 +543,19 @@ at_setsockaddr(struct socket *so, struct sockaddr **nam)
return(0);
}
-
void
-ddp_init(void )
+ddp_init(void)
{
- atintrq1.ifq_maxlen = IFQ_MAXLEN;
- atintrq2.ifq_maxlen = IFQ_MAXLEN;
- atintrq1_present = 1;
- atintrq2_present = 1;
- mtx_init(&atintrq1.ifq_mtx, "at1_inq", NULL, MTX_DEF);
- mtx_init(&atintrq2.ifq_mtx, "at2_inq", NULL, MTX_DEF);
+
+ atintrq1.ifq_maxlen = IFQ_MAXLEN;
+ atintrq2.ifq_maxlen = IFQ_MAXLEN;
+ aarpintrq.ifq_maxlen = IFQ_MAXLEN;
+ mtx_init(&atintrq1.ifq_mtx, "at1_inq", NULL, MTX_DEF);
+ mtx_init(&atintrq2.ifq_mtx, "at2_inq", NULL, MTX_DEF);
+ mtx_init(&aarpintrq.ifq_mtx, "aarp_inq", NULL, MTX_DEF);
+ netisr_register(NETISR_ATALK1, at1intr, &atintrq1);
+ netisr_register(NETISR_ATALK2, at2intr, &atintrq2);
+ netisr_register(NETISR_AARP, aarpintr, &aarpintrq);
}
#if 0