summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--firmware/zpu/lib/net_common.c22
-rw-r--r--host/lib/usrp/usrp2/mboard_impl.cpp8
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){