diff --git a/libraries/GCS_MAVLink/MAVLink_routing.cpp b/libraries/GCS_MAVLink/MAVLink_routing.cpp index fbfbf46f8782d..54d922f81e842 100644 --- a/libraries/GCS_MAVLink/MAVLink_routing.cpp +++ b/libraries/GCS_MAVLink/MAVLink_routing.cpp @@ -177,7 +177,8 @@ bool MAVLink_routing::check_and_forward(mavlink_channel_t in_channel, const mavl } } - if (!forwarded && match_system) { + if ((!forwarded && match_system) || + broadcast_system) { process_locally = true; } @@ -266,9 +267,20 @@ bool MAVLink_routing::find_by_mavtype(uint8_t mavtype, uint8_t &sysid, uint8_t & void MAVLink_routing::learn_route(mavlink_channel_t in_channel, const mavlink_message_t &msg) { uint8_t i; - if (msg.sysid == 0 || - (msg.sysid == mavlink_system.sysid && - msg.compid == mavlink_system.compid)) { + if (msg.sysid == 0) { + // don't learn routes to the broadcast system + return; + } + if (msg.sysid == mavlink_system.sysid && + msg.compid == mavlink_system.compid) { + // don't learn routes to ourself. We know where we are. + return; + } + if (msg.sysid == mavlink_system.sysid && + msg.compid == MAV_COMP_ID_ALL) { + // don't learn routes to the broadcast component ID for our + // own system id. We should still broadcast these, but we + // should also process them locally. return; } for (i=0; i