If set, a rule will start matching a prefix some number of bytes into the frame. This is useful since header information, addresses, and sequence numbers may be unpredictable between test runs. --- tools/hwsim.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/tools/hwsim.c b/tools/hwsim.c index 8fb9b0a4..9a7a90a9 100644 --- a/tools/hwsim.c +++ b/tools/hwsim.c @@ -132,6 +132,7 @@ struct hwsim_rule { int delay; uint8_t *prefix; size_t prefix_len; + uint16_t prefix_offset; int match_times; /* negative value indicates unused */ }; @@ -1212,8 +1213,13 @@ static void process_rules(const struct radio_info_rec *src_radio, if (rule->frequency && rule->frequency != frame->frequency) continue; - if (rule->prefix && frame->payload_len >= rule->prefix_len) { - if (memcmp(rule->prefix, frame->payload, + if (rule->prefix) { + if (frame->payload_len < + rule->prefix_len + rule->prefix_offset) + continue; + + if (memcmp(rule->prefix, + frame->payload + rule->prefix_offset, rule->prefix_len) != 0) continue; } @@ -2394,6 +2400,37 @@ invalid_args: return dbus_error_invalid_args(message); } +static bool rule_property_get_prefix_offset(struct l_dbus *dbus, + struct l_dbus_message *message, + struct l_dbus_message_builder *builder, + void *user_data) +{ + struct hwsim_rule *rule = user_data; + uint16_t val = rule->prefix_offset; + + l_dbus_message_builder_append_basic(builder, 'q', &val); + + return true; +} + +static struct l_dbus_message *rule_property_set_prefix_offset( + struct l_dbus *dbus, + struct l_dbus_message *message, + struct l_dbus_message_iter *new_value, + l_dbus_property_complete_cb_t complete, + void *user_data) +{ + struct hwsim_rule *rule = user_data; + uint16_t val; + + if (!l_dbus_message_iter_get_variant(new_value, "q", &val)) + return dbus_error_invalid_args(message); + + rule->prefix_offset = val; + + return l_dbus_message_new_method_return(message); +} + static bool rule_property_get_enabled(struct l_dbus *dbus, struct l_dbus_message *message, struct l_dbus_message_builder *builder, @@ -2527,6 +2564,10 @@ static void setup_rule_interface(struct l_dbus_interface *interface) L_DBUS_PROPERTY_FLAG_AUTO_EMIT, "ay", rule_property_get_prefix, rule_property_set_prefix); + l_dbus_interface_property(interface, "PrefixOffset", + L_DBUS_PROPERTY_FLAG_AUTO_EMIT, "q", + rule_property_get_prefix_offset, + rule_property_set_prefix_offset); l_dbus_interface_property(interface, "Enabled", L_DBUS_PROPERTY_FLAG_AUTO_EMIT, "b", rule_property_get_enabled, -- 2.31.1