diff options
author | Ben Hilburn <ben.hilburn@ettus.com> | 2014-02-13 17:30:24 -0800 |
---|---|---|
committer | Ben Hilburn <ben.hilburn@ettus.com> | 2014-02-14 12:07:25 -0800 |
commit | ebf1f1780d692c25e445b4df1c19d01ba43d6a94 (patch) | |
tree | 8f9ece09e6df569d690c0839271d246dffc4c079 | |
parent | ff1546f8137f7f92bb250f685561b0c34cc0e053 (diff) | |
download | uhd-ebf1f1780d692c25e445b4df1c19d01ba43d6a94.tar.gz uhd-ebf1f1780d692c25e445b4df1c19d01ba43d6a94.tar.bz2 uhd-ebf1f1780d692c25e445b4df1c19d01ba43d6a94.zip |
Putting the ICMP destination unreachable fix in X300 firmware.
-rw-r--r-- | firmware/x300/x300/x300_main.c | 78 |
1 files changed, 44 insertions, 34 deletions
diff --git a/firmware/x300/x300/x300_main.c b/firmware/x300/x300/x300_main.c index 4e3f2d585..5f7c19624 100644 --- a/firmware/x300/x300/x300_main.c +++ b/firmware/x300/x300/x300_main.c @@ -66,8 +66,14 @@ void handle_udp_prog_framer( const void *buff, const size_t num_bytes ) { + if (buff == NULL) { + /* We got here from ICMP_DUR undeliverable packet */ + /* Future space for hooks to tear down streaming radios etc */ + } + else { const uint32_t sid = ((const uint32_t *)buff)[1]; program_udp_framer(ethno, sid, src, src_port, dst_port); + } } /*********************************************************************** @@ -80,41 +86,41 @@ void handle_udp_fw_comms( const void *buff, const size_t num_bytes ) { - const x300_fw_comms_t *request = (const x300_fw_comms_t *)buff; - x300_fw_comms_t reply; memcpy(&reply, buff, sizeof(reply)); - - //check for error and set error flag - if (num_bytes < sizeof(x300_fw_comms_t)) - { - reply.flags |= X300_FW_COMMS_FLAGS_ERROR; - } + if (buff == NULL) { + /* We got here from ICMP_DUR undeliverable packet */ + /* Future space for hooks to tear down streaming radios etc */ + } else { + const x300_fw_comms_t *request = (const x300_fw_comms_t *)buff; + x300_fw_comms_t reply; memcpy(&reply, buff, sizeof(reply)); - //otherwise, run the actions set by the flags - else - { - if (request->flags & X300_FW_COMMS_FLAGS_PEEK32) - { - if (request->addr & 0x00100000) { - chinch_peek32(request->addr & 0x000FFFFF, &reply.data); - } else { - reply.data = wb_peek32(request->addr); - } + //check for error and set error flag + if (num_bytes < sizeof(x300_fw_comms_t)) { + reply.flags |= X300_FW_COMMS_FLAGS_ERROR; } - - if (request->flags & X300_FW_COMMS_FLAGS_POKE32) - { - if (request->addr & 0x00100000) { - chinch_poke32(request->addr & 0x000FFFFF, request->data); - } else { - wb_poke32(request->addr, request->data); + //otherwise, run the actions set by the flags + else { + if (request->flags & X300_FW_COMMS_FLAGS_PEEK32) + { + if (request->addr & 0x00100000) { + chinch_peek32(request->addr & 0x000FFFFF, &reply.data); + } else { + reply.data = wb_peek32(request->addr); + } + } + if (request->flags & X300_FW_COMMS_FLAGS_POKE32) + { + if (request->addr & 0x00100000) { + chinch_poke32(request->addr & 0x000FFFFF, request->data); + } else { + wb_poke32(request->addr, request->data); + } } } - } - //send a reply if ack requested - if (request->flags & X300_FW_COMMS_FLAGS_ACK) - { - u3_net_stack_send_udp_pkt(ethno, src, dst_port, src_port, &reply, sizeof(reply)); + //send a reply if ack requested + if (request->flags & X300_FW_COMMS_FLAGS_ACK) { + u3_net_stack_send_udp_pkt(ethno, src, dst_port, src_port, &reply, sizeof(reply)); + } } } @@ -132,7 +138,9 @@ void handle_udp_fpga_prog( x300_fpga_prog_flags_t reply = {0}; bool status = true; - if (num_bytes < offsetof(x300_fpga_prog_t, data)) { + if (buff == NULL) { + return; + } else if (num_bytes < offsetof(x300_fpga_prog_t, data)) { reply.flags |= X300_FPGA_PROG_FLAGS_ERROR; } else { if (request->flags & X300_FPGA_PROG_FLAGS_INIT) { @@ -183,7 +191,7 @@ void handle_udp_fpga_prog( /*********************************************************************** * Handler for MTU detection **********************************************************************/ -void handle_mtu_detect( +void handle_udp_mtu_detect( const uint8_t ethno, const struct ip_addr *src, const struct ip_addr *dst, const uint16_t src_port, const uint16_t dst_port, @@ -193,7 +201,9 @@ void handle_mtu_detect( const x300_mtu_t *request = (const x300_mtu_t *) buff; x300_mtu_t reply; - if (!(request->flags & X300_MTU_DETECT_ECHO_REQUEST)) { + if (buff == NULL) { + return; + } else if (!(request->flags & X300_MTU_DETECT_ECHO_REQUEST)) { printf("DEBUG: MTU detect got unknown request\n"); reply.flags |= X300_MTU_DETECT_ERROR; } @@ -415,7 +425,7 @@ int main(void) u3_net_stack_register_udp_handler(X300_FW_COMMS_UDP_PORT, &handle_udp_fw_comms); u3_net_stack_register_udp_handler(X300_VITA_UDP_PORT, &handle_udp_prog_framer); u3_net_stack_register_udp_handler(X300_FPGA_PROG_UDP_PORT, &handle_udp_fpga_prog); - u3_net_stack_register_udp_handler(X300_MTU_DETECT_UDP_PORT, &handle_mtu_detect); + u3_net_stack_register_udp_handler(X300_MTU_DETECT_UDP_PORT, &handle_udp_mtu_detect); uint32_t last_cronjob = 0; |