Changeset View
Changeset View
Standalone View
Standalone View
sys/net/if_ethersubr.c
Show First 20 Lines • Show All 198 Lines • ▼ Show 20 Lines | |||||
static int | static int | ||||
ether_resolve_addr(struct ifnet *ifp, struct mbuf *m, | ether_resolve_addr(struct ifnet *ifp, struct mbuf *m, | ||||
const struct sockaddr *dst, struct route *ro, u_char *phdr, | const struct sockaddr *dst, struct route *ro, u_char *phdr, | ||||
uint32_t *pflags) | uint32_t *pflags) | ||||
{ | { | ||||
struct ether_header *eh; | struct ether_header *eh; | ||||
uint32_t lleflags = 0; | uint32_t lleflags = 0; | ||||
int error = 0; | int error = 0; | ||||
#ifdef INET | |||||
const struct in_addr *a; | |||||
#endif | |||||
#ifdef INET6 | |||||
const struct in6_addr *a6; | |||||
#endif | |||||
#if defined(INET) || defined(INET6) | #if defined(INET) || defined(INET6) | ||||
uint16_t etype; | uint16_t etype; | ||||
#endif | #endif | ||||
eh = (struct ether_header *)phdr; | eh = (struct ether_header *)phdr; | ||||
switch (dst->sa_family) { | switch (dst->sa_family) { | ||||
#ifdef INET | #ifdef INET | ||||
case AF_INET: | case AF_INET: | ||||
a = &(((const struct sockaddr_in *)dst)->sin_addr); | |||||
if ((m->m_flags & (M_BCAST | M_MCAST)) == 0) | if ((m->m_flags & (M_BCAST | M_MCAST)) == 0) | ||||
error = arpresolve(ifp, 0, m, dst, phdr, &lleflags); | error = in_resolve_lla(ifp, m, a, phdr, &lleflags); | ||||
else { | else { | ||||
if (m->m_flags & M_BCAST) | if (m->m_flags & M_BCAST) | ||||
memcpy(eh->ether_dhost, ifp->if_broadcastaddr, | memcpy(eh->ether_dhost, ifp->if_broadcastaddr, | ||||
ETHER_ADDR_LEN); | ETHER_ADDR_LEN); | ||||
else { | else | ||||
const struct in_addr *a; | |||||
a = &(((const struct sockaddr_in *)dst)->sin_addr); | |||||
ETHER_MAP_IP_MULTICAST(a, eh->ether_dhost); | ETHER_MAP_IP_MULTICAST(a, eh->ether_dhost); | ||||
} | |||||
etype = htons(ETHERTYPE_IP); | etype = htons(ETHERTYPE_IP); | ||||
memcpy(&eh->ether_type, &etype, sizeof(etype)); | memcpy(&eh->ether_type, &etype, sizeof(etype)); | ||||
memcpy(eh->ether_shost, IF_LLADDR(ifp), ETHER_ADDR_LEN); | memcpy(eh->ether_shost, IF_LLADDR(ifp), ETHER_ADDR_LEN); | ||||
} | } | ||||
break; | break; | ||||
#endif | #endif | ||||
#ifdef INET6 | #ifdef INET6 | ||||
case AF_INET6: | case AF_INET6: | ||||
a6 = &(((const struct sockaddr_in6 *)dst)->sin6_addr); | |||||
if ((m->m_flags & M_MCAST) == 0) | if ((m->m_flags & M_MCAST) == 0) | ||||
error = nd6_resolve(ifp, 0, m, dst, phdr, &lleflags); | error = in6_resolve_lla(ifp, m, a6, phdr, &lleflags); | ||||
else { | else { | ||||
const struct in6_addr *a6; | |||||
a6 = &(((const struct sockaddr_in6 *)dst)->sin6_addr); | |||||
ETHER_MAP_IPV6_MULTICAST(a6, eh->ether_dhost); | ETHER_MAP_IPV6_MULTICAST(a6, eh->ether_dhost); | ||||
etype = htons(ETHERTYPE_IPV6); | etype = htons(ETHERTYPE_IPV6); | ||||
memcpy(&eh->ether_type, &etype, sizeof(etype)); | memcpy(&eh->ether_type, &etype, sizeof(etype)); | ||||
memcpy(eh->ether_shost, IF_LLADDR(ifp), ETHER_ADDR_LEN); | memcpy(eh->ether_shost, IF_LLADDR(ifp), ETHER_ADDR_LEN); | ||||
} | } | ||||
break; | break; | ||||
#endif | #endif | ||||
default: | default: | ||||
▲ Show 20 Lines • Show All 951 Lines • Show Last 20 Lines |