summaryrefslogtreecommitdiffstats
path: root/sys/net/if_ethersubr.c
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2009-04-16 20:30:28 +0000
committerkmacy <kmacy@FreeBSD.org>2009-04-16 20:30:28 +0000
commit24b38efdce5f73d92ac948039ef4966d9502b484 (patch)
treef09ffe8dbc619e723cdaebdc910a5ed28f73768b /sys/net/if_ethersubr.c
parentae4f793822da0acb8cd844e26144e060eebff125 (diff)
downloadFreeBSD-src-24b38efdce5f73d92ac948039ef4966d9502b484.zip
FreeBSD-src-24b38efdce5f73d92ac948039ef4966d9502b484.tar.gz
Change if_output to take a struct route as its fourth argument in order
to allow passing a cached struct llentry * down to L2 Reviewed by: rwatson
Diffstat (limited to 'sys/net/if_ethersubr.c')
-rw-r--r--sys/net/if_ethersubr.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c
index df52f83..38bf7d4 100644
--- a/sys/net/if_ethersubr.c
+++ b/sys/net/if_ethersubr.c
@@ -163,17 +163,22 @@ static int ether_ipfw;
*/
int
ether_output(struct ifnet *ifp, struct mbuf *m,
- struct sockaddr *dst, struct rtentry *rt0)
+ struct sockaddr *dst, struct route *ro)
{
short type;
- int error, hdrcmplt = 0;
+ int error = 0, hdrcmplt = 0;
u_char esrc[ETHER_ADDR_LEN], edst[ETHER_ADDR_LEN];
struct llentry *lle = NULL;
+ struct rtentry *rt0 = NULL;
struct ether_header *eh;
struct pf_mtag *t;
int loop_copy = 1;
int hlen; /* link layer header length */
+ if (ro != NULL) {
+ lle = ro->ro_lle;
+ rt0 = ro->ro_rt;
+ }
#ifdef MAC
error = mac_ifnet_check_transmit(ifp, m);
if (error)
@@ -191,7 +196,10 @@ ether_output(struct ifnet *ifp, struct mbuf *m,
switch (dst->sa_family) {
#ifdef INET
case AF_INET:
- error = arpresolve(ifp, rt0, m, dst, edst, &lle);
+ if (lle != NULL && (lle->la_flags & LLE_VALID))
+ memcpy(edst, &lle->ll_addr.mac16, sizeof(edst));
+ else
+ error = arpresolve(ifp, rt0, m, dst, edst, &lle);
if (error)
return (error == EWOULDBLOCK ? 0 : error);
type = htons(ETHERTYPE_IP);
@@ -226,7 +234,10 @@ ether_output(struct ifnet *ifp, struct mbuf *m,
#endif
#ifdef INET6
case AF_INET6:
- error = nd6_storelladdr(ifp, m, dst, (u_char *)edst, &lle);
+ if (lle != NULL && (lle->la_flags & LLE_VALID))
+ memcpy(edst, &lle->ll_addr.mac16, sizeof(edst));
+ else
+ error = nd6_storelladdr(ifp, m, dst, (u_char *)edst, &lle);
if (error)
return error;
type = htons(ETHERTYPE_IPV6);
OpenPOWER on IntegriCloud