| 1 | |
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
| 6 |
|
| 7 |
|
| 8 | #include <net/netlink.h>
|
| 9 | #include <net/genetlink.h>
|
| 10 |
|
| 11 | #include "netlink.h"
|
| 12 |
|
| 13 | #include <uapi/linux/wireguard.h>
|
| 14 | #include <linux/time_types.h>
|
| 15 |
|
| 16 |
|
| 17 | const struct nla_policy wireguard_wgallowedip_nl_policy[WGALLOWEDIP_A_FLAGS + 1] = {
|
| 18 | [WGALLOWEDIP_A_FAMILY] = { .type = NLA_U16, },
|
| 19 | [WGALLOWEDIP_A_IPADDR] = NLA_POLICY_MIN_LEN(4),
|
| 20 | [WGALLOWEDIP_A_CIDR_MASK] = { .type = NLA_U8, },
|
| 21 | [WGALLOWEDIP_A_FLAGS] = NLA_POLICY_MASK(NLA_U32, 0x1),
|
| 22 | };
|
| 23 |
|
| 24 | const struct nla_policy wireguard_wgpeer_nl_policy[WGPEER_A_PROTOCOL_VERSION + 1] = {
|
| 25 | [WGPEER_A_PUBLIC_KEY] = NLA_POLICY_EXACT_LEN(WG_KEY_LEN),
|
| 26 | [WGPEER_A_PRESHARED_KEY] = NLA_POLICY_EXACT_LEN(WG_KEY_LEN),
|
| 27 | [WGPEER_A_FLAGS] = NLA_POLICY_MASK(NLA_U32, 0x7),
|
| 28 | [WGPEER_A_ENDPOINT] = NLA_POLICY_MIN_LEN(16),
|
| 29 | [WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL] = { .type = NLA_U16, },
|
| 30 | [WGPEER_A_LAST_HANDSHAKE_TIME] = NLA_POLICY_EXACT_LEN(16),
|
| 31 | [WGPEER_A_RX_BYTES] = { .type = NLA_U64, },
|
| 32 | [WGPEER_A_TX_BYTES] = { .type = NLA_U64, },
|
| 33 | [WGPEER_A_ALLOWEDIPS] = NLA_POLICY_NESTED_ARRAY(wireguard_wgallowedip_nl_policy),
|
| 34 | [WGPEER_A_PROTOCOL_VERSION] = { .type = NLA_U32, },
|
| 35 | };
|
| 36 |
|
| 37 |
|
| 38 | static const struct nla_policy wireguard_get_device_nl_policy[WGDEVICE_A_IFNAME + 1] = {
|
| 39 | [WGDEVICE_A_IFINDEX] = { .type = NLA_U32, },
|
| 40 | [WGDEVICE_A_IFNAME] = { .type = NLA_NUL_STRING, .len = 15, },
|
| 41 | };
|
| 42 |
|
| 43 |
|
| 44 | static const struct nla_policy wireguard_set_device_nl_policy[WGDEVICE_A_PEERS + 1] = {
|
| 45 | [WGDEVICE_A_IFINDEX] = { .type = NLA_U32, },
|
| 46 | [WGDEVICE_A_IFNAME] = { .type = NLA_NUL_STRING, .len = 15, },
|
| 47 | [WGDEVICE_A_PRIVATE_KEY] = NLA_POLICY_EXACT_LEN(WG_KEY_LEN),
|
| 48 | [WGDEVICE_A_PUBLIC_KEY] = NLA_POLICY_EXACT_LEN(WG_KEY_LEN),
|
| 49 | [WGDEVICE_A_FLAGS] = NLA_POLICY_MASK(NLA_U32, 0x1),
|
| 50 | [WGDEVICE_A_LISTEN_PORT] = { .type = NLA_U16, },
|
| 51 | [WGDEVICE_A_FWMARK] = { .type = NLA_U32, },
|
| 52 | [WGDEVICE_A_PEERS] = NLA_POLICY_NESTED_ARRAY(wireguard_wgpeer_nl_policy),
|
| 53 | };
|
| 54 |
|
| 55 |
|
| 56 | const struct genl_split_ops wireguard_nl_ops[2] = {
|
| 57 | {
|
| 58 | .cmd = WG_CMD_GET_DEVICE,
|
| 59 | .start = wg_get_device_start,
|
| 60 | .dumpit = wg_get_device_dumpit,
|
| 61 | .done = wg_get_device_done,
|
| 62 | .policy = wireguard_get_device_nl_policy,
|
| 63 | .maxattr = WGDEVICE_A_IFNAME,
|
| 64 | .flags = GENL_UNS_ADMIN_PERM | GENL_CMD_CAP_DUMP,
|
| 65 | },
|
| 66 | {
|
| 67 | .cmd = WG_CMD_SET_DEVICE,
|
| 68 | .doit = wg_set_device_doit,
|
| 69 | .policy = wireguard_set_device_nl_policy,
|
| 70 | .maxattr = WGDEVICE_A_PEERS,
|
| 71 | .flags = GENL_UNS_ADMIN_PERM | GENL_CMD_CAP_DO,
|
| 72 | },
|
| 73 | };
|