+ switch (proto) {
+
+ case ETHERTYPE_IPTRAILERS:
+ /* partner says trailers are OK */
+ if (la)
+ la->la_rt->rt_flags |= RTF_USETRAILERS;
+ /*
+ * Reply to request iff we want trailers.
+ */
+ if (op != ARPOP_REQUEST || ac->ac_if.if_flags & IFF_NOTRAILERS)
+ goto out;
+ break;
+
+ case ETHERTYPE_IP:
+ /*
+ * Reply if this is an IP request,
+ * or if we want to send a trailer response.
+ * Send the latter only to the IP response
+ * that completes the current ARP entry.
+ */
+ if (op != ARPOP_REQUEST &&
+ (completed == 0 || ac->ac_if.if_flags & IFF_NOTRAILERS))
+ goto out;
+ }
+ if (itaddr.s_addr == myaddr.s_addr) {
+ /* I am the target */
+ bcopy((caddr_t)ea->arp_sha, (caddr_t)ea->arp_tha,
+ sizeof(ea->arp_sha));
+ bcopy((caddr_t)ac->ac_enaddr, (caddr_t)ea->arp_sha,
+ sizeof(ea->arp_sha));
+ sendtrailers = !(ac->ac_if.if_flags & IFF_NOTRAILERS);
+ } else {
+ la = arplookup(itaddr.s_addr, 0, SIN_PROXY);
+ if (la == NULL)
+ goto out;
+ bcopy((caddr_t)ea->arp_sha, (caddr_t)ea->arp_tha,
+ sizeof(ea->arp_sha));
+ sdl = SDL(la->la_rt->rt_gateway);
+ bcopy(LLADDR(sdl), (caddr_t)ea->arp_sha, sizeof(ea->arp_sha));
+ sendtrailers = rt->rt_flags & RTF_USETRAILERS;
+ }
+