diff options
-rw-r--r-- | firmware/zpu/lib/net_common.c | 22 | ||||
-rw-r--r-- | host/lib/usrp/usrp2/mboard_impl.cpp | 8 |
2 files changed, 23 insertions, 7 deletions
diff --git a/firmware/zpu/lib/net_common.c b/firmware/zpu/lib/net_common.c index ec9198090..d1b06976d 100644 --- a/firmware/zpu/lib/net_common.c +++ b/firmware/zpu/lib/net_common.c @@ -298,20 +298,28 @@ handle_icmp_packet(struct ip_addr src, struct ip_addr dst, break; case ICMP_ECHO:{ + const void *icmp_data_buff = ((uint8_t*)icmp) + sizeof(struct icmp_echo_hdr); + size_t icmp_data_len = len - sizeof(struct icmp_echo_hdr); + struct icmp_echo_hdr echo_reply; echo_reply.type = 0; echo_reply.code = 0; echo_reply.chksum = 0; echo_reply.id = icmp->id; echo_reply.seqno = icmp->seqno; - echo_reply.chksum = ~chksum_buffer( - (unsigned short *)&echo_reply, - sizeof(echo_reply)/sizeof(short), - 0); + echo_reply.chksum = ~chksum_buffer( //data checksum + (unsigned short *)icmp_data_buff, + icmp_data_len/sizeof(short), + chksum_buffer( //header checksum + (unsigned short *)&echo_reply, + sizeof(echo_reply)/sizeof(short), + 0) + ); + send_ip_pkt( - src, IP_PROTO_ICMP, &echo_reply, sizeof(echo_reply), - ((uint8_t*)icmp) + sizeof(struct icmp_echo_hdr), - len - sizeof(struct icmp_echo_hdr) + src, IP_PROTO_ICMP, + &echo_reply, sizeof(echo_reply), + icmp_data_buff, icmp_data_len ); break; } diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp index 784f662d9..397fae636 100644 --- a/host/lib/usrp/usrp2/mboard_impl.cpp +++ b/host/lib/usrp/usrp2/mboard_impl.cpp @@ -157,6 +157,14 @@ usrp2_mboard_impl::usrp2_mboard_impl( //set default subdev specs (*this)[MBOARD_PROP_RX_SUBDEV_SPEC] = subdev_spec_t(); (*this)[MBOARD_PROP_TX_SUBDEV_SPEC] = subdev_spec_t(); + + //This is a hack/fix for the lingering packet problem. + stream_cmd_t stream_cmd(stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE); + stream_cmd.num_samps = 1; + this->issue_ddc_stream_cmd(stream_cmd); + data_transport->get_recv_buff().get(); //recv with timeout for lingering + data_transport->get_recv_buff().get(); //recv with timeout for expected + _iface->poke32(_iface->regs.rx_ctrl_clear_overrun, 1); //resets sequence } usrp2_mboard_impl::~usrp2_mboard_impl(void){ |