checker
probes_check_t *checker_func = (*p)[action].checker;
[PROBES_MRS] = {.checker = arm_check_regs_normal},
[PROBES_SATURATING_ARITHMETIC] = {.checker = arm_check_regs_normal},
[PROBES_MUL1] = {.checker = arm_check_regs_normal},
[PROBES_MUL2] = {.checker = arm_check_regs_normal},
[PROBES_MUL_ADD_LONG] = {.checker = arm_check_regs_normal},
[PROBES_MUL_ADD] = {.checker = arm_check_regs_normal},
[PROBES_LOAD] = {.checker = arm_check_regs_normal},
[PROBES_LOAD_EXTRA] = {.checker = arm_check_regs_normal},
[PROBES_STORE] = {.checker = arm_check_regs_normal},
[PROBES_STORE_EXTRA] = {.checker = arm_check_regs_normal},
[PROBES_DATA_PROCESSING_REG] = {.checker = arm_check_regs_normal},
[PROBES_DATA_PROCESSING_IMM] = {.checker = arm_check_regs_normal},
[PROBES_SEV] = {.checker = arm_check_regs_nouse},
[PROBES_WFE] = {.checker = arm_check_regs_nouse},
[PROBES_SATURATE] = {.checker = arm_check_regs_normal},
[PROBES_REV] = {.checker = arm_check_regs_normal},
[PROBES_MMI] = {.checker = arm_check_regs_normal},
[PROBES_PACK] = {.checker = arm_check_regs_normal},
[PROBES_EXTEND] = {.checker = arm_check_regs_normal},
[PROBES_EXTEND_ADD] = {.checker = arm_check_regs_normal},
[PROBES_BITFIELD] = {.checker = arm_check_regs_normal},
[PROBES_LDMSTM] = {.checker = arm_check_regs_ldmstm},
[PROBES_MOV_IP_SP] = {.checker = arm_check_regs_mov_ip_sp},
[PROBES_LDRSTRD] = {.checker = arm_check_regs_ldrdstrd},
[PROBES_LDRSTRD] = {.checker = arm_check_stack},
[PROBES_STORE_EXTRA] = {.checker = arm_check_stack},
[PROBES_STORE] = {.checker = arm_check_stack},
[PROBES_LDMSTM] = {.checker = arm_check_stack},
[PROBES_T16_PUSH] = {.checker = t16_check_stack},
[PROBES_T32_LDMSTM] = {.checker = t32_check_stack},
[PROBES_T32_LDRDSTRD] = {.checker = t32_check_stack},
[PROBES_T32_LDRSTR] = {.checker = t32_check_stack},
adf_mstate_preamble_checker checker,
get_random_bytes(checker->secret, NOISE_HASH_LEN);
up_write(&checker->secret_lock);
down_read(&checker->secret_lock);
blake2s_init_key(&blake, COOKIE_LEN, checker->secret, NOISE_HASH_LEN);
up_read(&checker->secret_lock);
enum cookie_mac_state wg_cookie_validate_packet(struct cookie_checker *checker,
checker->message_mac1_key);
make_cookie(cookie, skb, checker);
if (!wg_ratelimiter_allow(skb, dev_net(checker->device->dev)))
struct cookie_checker *checker)
void wg_cookie_checker_init(struct cookie_checker *checker,
make_cookie(cookie, skb, checker);
checker->cookie_encryption_key);
init_rwsem(&checker->secret_lock);
checker->secret_birthdate = ktime_get_coarse_boottime_ns();
get_random_bytes(checker->secret, NOISE_HASH_LEN);
checker->device = wg;
void wg_cookie_checker_precompute_device_keys(struct cookie_checker *checker)
if (likely(checker->device->static_identity.has_identity)) {
precompute_key(checker->cookie_encryption_key,
checker->device->static_identity.static_public,
precompute_key(checker->message_mac1_key,
checker->device->static_identity.static_public,
memset(checker->cookie_encryption_key, 0,
memset(checker->message_mac1_key, 0, NOISE_SYMMETRIC_KEY_LEN);
struct cookie_checker *checker)
if (wg_birthdate_has_expired(checker->secret_birthdate,
down_write(&checker->secret_lock);
checker->secret_birthdate = ktime_get_coarse_boottime_ns();
void wg_cookie_checker_init(struct cookie_checker *checker,
void wg_cookie_checker_precompute_device_keys(struct cookie_checker *checker);
enum cookie_mac_state wg_cookie_validate_packet(struct cookie_checker *checker,
struct cookie_checker *checker);
bool (*checker)(const struct device_node *))
if (!checker(next))
#define TEST_kmalloc(checker, expected_size, alloc_size) do { \
checker(expected_size, kmalloc(alloc_size, gfp), \
checker(expected_size, \
checker(expected_size, kzalloc(alloc_size, gfp), \
checker(expected_size, \
checker(expected_size, kcalloc(1, alloc_size, gfp), \
checker(expected_size, kcalloc(alloc_size, 1, gfp), \
checker(expected_size, \
checker(expected_size, \
checker(expected_size, kmalloc_array(1, alloc_size, gfp), \
checker(expected_size, kmalloc_array(alloc_size, 1, gfp), \
checker(expected_size, \
checker(expected_size, \
checker((expected_size) * 2, \
checker((expected_size) * 2, \
checker((expected_size) * 2, \
checker(len, kmemdup("hello there", len, gfp), kfree(p)); \
#define TEST_vmalloc(checker, expected_pages, alloc_pages) do { \
checker((expected_pages) * PAGE_SIZE, \
checker((expected_pages) * PAGE_SIZE, \
checker((expected_pages) * PAGE_SIZE, \
#define TEST_kvmalloc(checker, expected_pages, alloc_pages) do { \
checker((expected_pages) * PAGE_SIZE, \
checker((expected_pages) * PAGE_SIZE, \
checker((expected_pages) * PAGE_SIZE, \
checker((expected_pages) * PAGE_SIZE, \
checker((expected_pages) * PAGE_SIZE, \
checker((expected_pages) * PAGE_SIZE, \
checker((expected_pages) * PAGE_SIZE, \
checker((expected_pages) * PAGE_SIZE, \
checker(((expected_pages) * PAGE_SIZE) * 2, \
#define TEST_devm_kmalloc(checker, expected_size, alloc_size) do { \
checker(expected_size, devm_kmalloc(dev, alloc_size, gfp), \
checker(expected_size, devm_kzalloc(dev, alloc_size, gfp), \
checker(expected_size, \
checker(expected_size, \
checker(expected_size, \
checker(expected_size, \
checker((expected_size) * 2, \
checker(len, devm_kmemdup(dev, "Ohai", len, gfp), \
#define TEST_realloc(checker) do { \
checker(len, kmemdup_array(test_strs[i], 1, len, gfp), \
checker(len, kmemdup(test_strs[i], len, gfp), \
#define check_pair(outcome, untouched, shuffled, checker...) \
DO_MANY_MEMBERS(checker, untouched, shuffled) \