summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/netinet/if_ether.c73
-rw-r--r--sys/netinet/if_ether.h13
2 files changed, 30 insertions, 56 deletions
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c
index 3fa68753f74..1a66993b4dd 100644
--- a/sys/netinet/if_ether.c
+++ b/sys/netinet/if_ether.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_ether.c,v 1.148 2015/03/14 17:13:44 mpi Exp $ */
+/* $OpenBSD: if_ether.c,v 1.149 2015/03/24 12:58:43 mpi Exp $ */
/* $NetBSD: if_ether.c,v 1.31 1996/05/11 12:59:58 mycroft Exp $ */
/*
@@ -69,7 +69,6 @@
#endif
#define SDL(s) ((struct sockaddr_dl *)s)
-#define SRP(s) ((struct sockaddr_inarp *)s)
/*
* ARP trailer negotiation. Trailer protocol is not IP specific,
@@ -77,6 +76,15 @@
*/
#define ETHERTYPE_IPTRAILERS ETHERTYPE_TRAIL
+struct llinfo_arp {
+ LIST_ENTRY(llinfo_arp) la_list;
+ struct rtentry *la_rt; /* backpointer to rtentry */
+ long la_asked; /* last time we QUERIED */
+ struct mbuf_list la_ml; /* packet hold queue */
+};
+#define LA_HOLD_QUEUE 10
+#define LA_HOLD_TOTAL 100
+
/* timer values */
int arpt_prune = (5*60*1); /* walk list every 5 minutes */
int arpt_keep = (20*60); /* once resolved, good for 20 more minutes */
@@ -227,6 +235,7 @@ arp_rtrequest(int req, struct rtentry *rt)
}
arp_inuse++;
arp_allocated++;
+ ml_init(&la->la_ml);
la->la_rt = rt;
rt->rt_flags |= RTF_LLINFO;
LIST_INSERT_HEAD(&llinfo_arp, la, la_list);
@@ -282,8 +291,7 @@ arp_rtrequest(int req, struct rtentry *rt)
LIST_REMOVE(la, la_list);
rt->rt_llinfo = 0;
rt->rt_flags &= ~RTF_LLINFO;
- while ((m = la->la_hold_head) != NULL) {
- la->la_hold_head = la->la_hold_head->m_nextpkt;
+ while ((m = ml_dequeue(&la->la_ml)) != NULL) {
la_hold_total--;
m_freem(m);
}
@@ -425,32 +433,19 @@ arpresolve(struct arpcom *ac, struct rtentry *rt0, struct mbuf *m,
* response yet. Insert mbuf in hold queue if below limit
* if above the limit free the queue without queuing the new packet.
*/
- if (la_hold_total < MAX_HOLD_TOTAL && la_hold_total < nmbclust / 64) {
- if (la->la_hold_count >= MAX_HOLD_QUEUE) {
- mh = la->la_hold_head;
- la->la_hold_head = la->la_hold_head->m_nextpkt;
- if (mh == la->la_hold_tail)
- la->la_hold_tail = NULL;
- la->la_hold_count--;
+ if (la_hold_total < LA_HOLD_TOTAL && la_hold_total < nmbclust / 64) {
+ if (ml_len(&la->la_ml) >= LA_HOLD_QUEUE) {
+ mh = ml_dequeue(&la->la_ml);
la_hold_total--;
m_freem(mh);
}
- if (la->la_hold_tail == NULL)
- la->la_hold_head = m;
- else
- la->la_hold_tail->m_nextpkt = m;
- la->la_hold_tail = m;
- la->la_hold_count++;
+ ml_enqueue(&la->la_ml, m);
la_hold_total++;
} else {
- while ((mh = la->la_hold_head) != NULL) {
- la->la_hold_head =
- la->la_hold_head->m_nextpkt;
+ while ((mh = ml_dequeue(&la->la_ml)) != NULL) {
la_hold_total--;
m_freem(mh);
}
- la->la_hold_tail = NULL;
- la->la_hold_count = 0;
m_freem(m);
}
@@ -483,14 +478,10 @@ arpresolve(struct arpcom *ac, struct rtentry *rt0, struct mbuf *m,
rt->rt_flags |= RTF_REJECT;
rt->rt_expire += arpt_down;
la->la_asked = 0;
- while ((mh = la->la_hold_head) != NULL) {
- la->la_hold_head =
- la->la_hold_head->m_nextpkt;
+ while ((mh = ml_dequeue(&la->la_ml)) != NULL) {
la_hold_total--;
m_freem(mh);
}
- la->la_hold_tail = NULL;
- la->la_hold_count = 0;
}
}
}
@@ -570,13 +561,14 @@ in_arpinput(struct mbuf *m)
struct sockaddr_dl *sdl;
struct sockaddr sa;
struct in_addr isaddr, itaddr, myaddr;
- struct mbuf *mh, *mt;
+ struct mbuf *mh;
u_int8_t *enaddr = NULL;
#if NCARP > 0
u_int8_t *ether_shost = NULL;
#endif
char addr[INET_ADDRSTRLEN];
int op, changed = 0;
+ unsigned int len;
ea = mtod(m, struct ether_arp *);
op = ntohs(ea->arp_op);
@@ -732,25 +724,19 @@ in_arpinput(struct mbuf *m)
if (la->la_asked || changed)
rt_sendmsg(rt, RTM_RESOLVE, rt->rt_ifp->if_rdomain);
la->la_asked = 0;
- while ((mh = la->la_hold_head) != NULL) {
- if ((la->la_hold_head = mh->m_nextpkt) == NULL)
- la->la_hold_tail = NULL;
- la->la_hold_count--;
+ while ((len = ml_len(&la->la_ml)) != 0) {
+ mh = ml_dequeue(&la->la_ml);
la_hold_total--;
- mt = la->la_hold_tail;
(*ac->ac_if.if_output)(&ac->ac_if, mh, rt_key(rt), rt);
- if (la->la_hold_tail == mh) {
+ if (ml_len(&la->la_ml) == len) {
/* mbuf is back in queue. Discard. */
- la->la_hold_tail = mt;
- if (la->la_hold_tail)
- la->la_hold_tail->m_nextpkt = NULL;
- else
- la->la_hold_head = NULL;
- la->la_hold_count--;
- la_hold_total--;
- m_freem(mh);
+ while ((mh = ml_dequeue(&la->la_ml)) != NULL) {
+ la_hold_total--;
+ m_freem(mh);
+ }
+ break;
}
}
}
@@ -1114,8 +1100,7 @@ db_print_llinfo(caddr_t li)
if (li == 0)
return;
la = (struct llinfo_arp *)li;
- db_printf(" la_rt=%p la_hold_head=%p, la_asked=0x%lx\n",
- la->la_rt, la->la_hold_head, la->la_asked);
+ db_printf(" la_rt=%p la_asked=0x%lx\n", la->la_rt, la->la_asked);
}
/*
diff --git a/sys/netinet/if_ether.h b/sys/netinet/if_ether.h
index bf1383be55f..96760712c62 100644
--- a/sys/netinet/if_ether.h
+++ b/sys/netinet/if_ether.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_ether.h,v 1.54 2014/12/05 15:50:04 mpi Exp $ */
+/* $OpenBSD: if_ether.h,v 1.55 2015/03/24 12:58:43 mpi Exp $ */
/* $NetBSD: if_ether.h,v 1.22 1996/05/11 13:00:00 mycroft Exp $ */
/*
@@ -164,17 +164,6 @@ struct arpcom {
int ac_multirangecnt; /* number of mcast ranges */
};
-
-struct llinfo_arp {
- LIST_ENTRY(llinfo_arp) la_list;
- struct rtentry *la_rt;
- struct mbuf *la_hold_head; /* packet hold queue */
- struct mbuf *la_hold_tail;
- int la_hold_count; /* number of packets queued */
- long la_asked; /* last time we QUERIED for this addr */
-};
-#define MAX_HOLD_QUEUE 10
-#define MAX_HOLD_TOTAL 100
#endif
struct sockaddr_inarp {