diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/netinet/ip_carp.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c index 22b3be7434c..2ce518bc084 100644 --- a/sys/netinet/ip_carp.c +++ b/sys/netinet/ip_carp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_carp.c,v 1.89 2005/01/04 10:30:00 pascoe Exp $ */ +/* $OpenBSD: ip_carp.c,v 1.90 2005/01/06 00:41:51 pascoe Exp $ */ /* * Copyright (c) 2002 Michael Shalayeff. All rights reserved. @@ -2023,9 +2023,27 @@ carp_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *sa, struct rtentry *rt) { struct ifnet *ifp0 = ((struct carp_softc *)ifp->if_softc)->sc_carpdev; - if (ifp0) + if (ifp0) { + struct m_tag *mtag; + + /* Tag packet for carp_fix_lladdr if not already tagged */ + mtag = m_tag_find(m, PACKET_TAG_CARP, NULL); + if (mtag == NULL) { + mtag = m_tag_get(PACKET_TAG_CARP, + sizeof(struct ifnet *), M_NOWAIT); + if (mtag == NULL) { + m_freem(m); + ((struct carp_softc *)ifp->if_softc + )->sc_if.if_oerrors++; + carpstats.carps_onomem++; + return (ENOMEM); + } + bcopy(&ifp, (caddr_t)(mtag + 1), + sizeof(struct ifnet *)); + m_tag_prepend(m, mtag); + } return (ifp0->if_output(ifp, m, sa, rt)); - else + } else return (EINVAL); } |