Changeset View
Changeset View
Standalone View
Standalone View
sys/net/if_infiniband.c
Show First 20 Lines • Show All 294 Lines • ▼ Show 20 Lines | infiniband_output(struct ifnet *ifp, struct mbuf *m, | ||||
uint8_t linkhdr[INFINIBAND_HDR_LEN]; | uint8_t linkhdr[INFINIBAND_HDR_LEN]; | ||||
uint8_t *phdr; | uint8_t *phdr; | ||||
struct llentry *lle = NULL; | struct llentry *lle = NULL; | ||||
struct infiniband_header *ih; | struct infiniband_header *ih; | ||||
int error = 0; | int error = 0; | ||||
int hlen; /* link layer header length */ | int hlen; /* link layer header length */ | ||||
uint32_t pflags; | uint32_t pflags; | ||||
bool addref; | bool addref; | ||||
int af = dst->sa_family; | |||||
NET_EPOCH_ASSERT(); | NET_EPOCH_ASSERT(); | ||||
addref = false; | addref = false; | ||||
phdr = NULL; | phdr = NULL; | ||||
pflags = 0; | pflags = 0; | ||||
if (ro != NULL) { | if (ro != NULL) { | ||||
/* XXX BPF uses ro_prepend */ | /* XXX BPF uses ro_prepend */ | ||||
Show All 21 Lines | if (ro->ro_prepend != NULL) { | ||||
llentry_mark_used(lle); | llentry_mark_used(lle); | ||||
} | } | ||||
if (lle != NULL) { | if (lle != NULL) { | ||||
phdr = lle->r_linkdata; | phdr = lle->r_linkdata; | ||||
hlen = lle->r_hdrlen; | hlen = lle->r_hdrlen; | ||||
pflags = lle->r_flags; | pflags = lle->r_flags; | ||||
} | } | ||||
} | } | ||||
if ((ro->ro_flags & RT_HAS_GW) != 0) | |||||
af = ro->ro_dst.sa_family; | |||||
} | } | ||||
#ifdef MAC | #ifdef MAC | ||||
error = mac_ifnet_check_transmit(ifp, m); | error = mac_ifnet_check_transmit(ifp, m); | ||||
if (error) | if (error) | ||||
goto bad; | goto bad; | ||||
#endif | #endif | ||||
Show All 16 Lines | error = infiniband_resolve_addr(ifp, m, dst, ro, phdr, &pflags, | ||||
addref ? &lle : NULL); | addref ? &lle : NULL); | ||||
if (addref && lle != NULL) | if (addref && lle != NULL) | ||||
ro->ro_lle = lle; | ro->ro_lle = lle; | ||||
if (error != 0) | if (error != 0) | ||||
return (error == EWOULDBLOCK ? 0 : error); | return (error == EWOULDBLOCK ? 0 : error); | ||||
} | } | ||||
if ((pflags & RT_L2_ME) != 0) { | if ((pflags & RT_L2_ME) != 0) { | ||||
update_mbuf_csumflags(m, m); | update_mbuf_csumflags(m, m); | ||||
hselasky: Maybe move the "int af = ..." down here, if this is the only place it is used. | |||||
return (if_simloop(ifp, m, dst->sa_family, 0)); | return (if_simloop(ifp, m, af, 0)); | ||||
} | } | ||||
/* | /* | ||||
* Add local infiniband header. If no space in first mbuf, | * Add local infiniband header. If no space in first mbuf, | ||||
* allocate another. | * allocate another. | ||||
*/ | */ | ||||
M_PREPEND(m, INFINIBAND_HDR_LEN, M_NOWAIT); | M_PREPEND(m, INFINIBAND_HDR_LEN, M_NOWAIT); | ||||
if (m == NULL) { | if (m == NULL) { | ||||
error = ENOBUFS; | error = ENOBUFS; | ||||
goto bad; | goto bad; | ||||
} | } | ||||
if ((pflags & RT_HAS_HEADER) == 0) { | if ((pflags & RT_HAS_HEADER) == 0) { | ||||
ih = mtod(m, struct infiniband_header *); | ih = mtod(m, struct infiniband_header *); | ||||
memcpy(ih, phdr, hlen); | memcpy(ih, phdr, hlen); | ||||
/* XXX phdr might be from lle cache, let's fix the ether_type */ | |||||
Done Inline ActionsNot needed, we should pass proper family to ‘infiniband_resolve_addr()’ melifaro: Not needed, we should pass proper family to ‘infiniband_resolve_addr()’ | |||||
#if defined(INET) || defined(INET6) | |||||
uint16_t etype = 0; | |||||
#ifdef INET | |||||
if (af == AF_INET) | |||||
etype = htons(ETHERTYPE_IP); | |||||
#endif | |||||
#ifdef INET6 | |||||
if (af == AF_INET6) | |||||
etype = htons(ETHERTYPE_IPV6); | |||||
#endif | |||||
if (etype != 0) | |||||
ih->ib_protocol = etype; | |||||
#endif | |||||
} | } | ||||
/* | /* | ||||
* Queue message on interface, update output statistics if | * Queue message on interface, update output statistics if | ||||
* successful, and start output if interface not yet active. | * successful, and start output if interface not yet active. | ||||
*/ | */ | ||||
return (ifp->if_transmit(ifp, m)); | return (ifp->if_transmit(ifp, m)); | ||||
bad: | bad: | ||||
▲ Show 20 Lines • Show All 255 Lines • Show Last 20 Lines |
Maybe move the "int af = ..." down here, if this is the only place it is used.