diff options
author | Jonathan Lemon <jlemon@FreeBSD.org> | 2003-03-04 23:19:55 +0000 |
---|---|---|
committer | Jonathan Lemon <jlemon@FreeBSD.org> | 2003-03-04 23:19:55 +0000 |
commit | 1cafed3941f1a4e9d2beb4fb126e91018505dfd4 (patch) | |
tree | f304f726e8973253d3e8a87e56119fec0276a61c /sys/netatalk | |
parent | c141c242ac0a55a34b58cf2b06d13964d00507a4 (diff) | |
download | src-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.c | 5 | ||||
-rw-r--r-- | sys/netatalk/at_extern.h | 4 | ||||
-rw-r--r-- | sys/netatalk/at_var.h | 1 | ||||
-rw-r--r-- | sys/netatalk/ddp_input.c | 87 | ||||
-rw-r--r-- | sys/netatalk/ddp_pcb.c | 22 | ||||
-rw-r--r-- | sys/netatalk/ddp_usrreq.c | 22 |
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 |