Hi Joe, On 24 July 2018 at 15:40, Joe Hershberger <joe.hershber...@ni.com> wrote: > Make the behavior of the send function reusable. > > Signed-off-by: Joe Hershberger <joe.hershber...@ni.com> > --- > > arch/sandbox/include/asm/eth.h | 20 +++++ > drivers/net/sandbox.c | 176 > ++++++++++++++++++++++++----------------- > 2 files changed, 124 insertions(+), 72 deletions(-) > > diff --git a/arch/sandbox/include/asm/eth.h b/arch/sandbox/include/asm/eth.h > index bfcd11b593..00062616a4 100644 > --- a/arch/sandbox/include/asm/eth.h > +++ b/arch/sandbox/include/asm/eth.h > @@ -13,4 +13,24 @@ void sandbox_eth_disable_response(int index, bool disable); > > void sandbox_eth_skip_timeout(void); > > +/* > + * sandbox_eth_arp_req_to_reply() > + * > + * Check for an arp request to be sent. If so, inject a reply
comments for args? > + * > + * returns 1 if injected, 0 if not > + */ > +int sandbox_eth_arp_req_to_reply(struct udevice *dev, void *packet, > + unsigned int len); > + > +/* > + * sandbox_eth_ping_req_to_reply() > + * > + * Check for a ping request to be sent. If so, inject a reply > + * > + * returns 1 if injected, 0 if not > + */ > +int sandbox_eth_ping_req_to_reply(struct udevice *dev, void *packet, > + unsigned int len); > + > #endif /* __ETH_H */ > diff --git a/drivers/net/sandbox.c b/drivers/net/sandbox.c > index 60fe065ee5..5746af11a6 100644 > --- a/drivers/net/sandbox.c > +++ b/drivers/net/sandbox.c > @@ -63,6 +63,108 @@ void sandbox_eth_skip_timeout(void) > skip_timeout = true; > } > > +/* > + * sandbox_eth_arp_req_to_reply() > + * > + * Check for an arp request to be sent. If so, inject a reply > + * > + * returns 1 if injected, 0 if not > + */ > +int sandbox_eth_arp_req_to_reply(struct udevice *dev, void *packet, > + unsigned int len) > +{ > + struct eth_sandbox_priv *priv = dev_get_priv(dev); > + struct ethernet_hdr *eth = packet; > + struct arp_hdr *arp; > + struct ethernet_hdr *eth_recv; > + struct arp_hdr *arp_recv; > + > + if (ntohs(eth->et_protlen) != PROT_ARP) > + return 0; It seems odd to put this check here? Why not check it before calling this function? > + > + arp = packet + ETHER_HDR_SIZE; > + > + if (ntohs(arp->ar_op) != ARPOP_REQUEST) > + return 0; > + > + /* store this as the assumed IP of the fake host */ > + priv->fake_host_ipaddr = net_read_ip(&arp->ar_tpa); > + > + /* Formulate a fake response */ > + eth_recv = (void *)priv->recv_packet_buffer; > + memcpy(eth_recv->et_dest, eth->et_src, ARP_HLEN); > + memcpy(eth_recv->et_src, priv->fake_host_hwaddr, ARP_HLEN); > + eth_recv->et_protlen = htons(PROT_ARP); > + > + arp_recv = (void *)eth_recv + ETHER_HDR_SIZE; > + arp_recv->ar_hrd = htons(ARP_ETHER); > + arp_recv->ar_pro = htons(PROT_IP); > + arp_recv->ar_hln = ARP_HLEN; > + arp_recv->ar_pln = ARP_PLEN; > + arp_recv->ar_op = htons(ARPOP_REPLY); > + memcpy(&arp_recv->ar_sha, priv->fake_host_hwaddr, ARP_HLEN); > + net_write_ip(&arp_recv->ar_spa, priv->fake_host_ipaddr); > + memcpy(&arp_recv->ar_tha, &arp->ar_sha, ARP_HLEN); > + net_copy_ip(&arp_recv->ar_tpa, &arp->ar_spa); > + > + priv->recv_packet_length = ETHER_HDR_SIZE + ARP_HDR_SIZE; > + > + return 1; > +} > + [..] > + sandbox_eth_arp_req_to_reply(dev, packet, length); > + sandbox_eth_ping_req_to_reply(dev, packet, length); Here functions are called unconditionally, but presumably only at most one function will do anything. > > return 0; > } > -- > 2.11.0 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot