1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
/*
* Embedded Linux library
* Copyright (C) 2011-2014 Intel Corporation
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
#ifndef __ELL_NETLINK_H
#define __ELL_NETLINK_H
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*l_netlink_debug_func_t) (const char *str, void *user_data);
typedef void (*l_netlink_command_func_t) (int error,
uint16_t type, const void *data,
uint32_t len, void *user_data);
typedef void (*l_netlink_notify_func_t) (uint16_t type, const void *data,
uint32_t len, void *user_data);
typedef void (*l_netlink_destroy_func_t) (void *user_data);
struct l_netlink;
struct l_netlink_message;
struct l_netlink *l_netlink_new(int protocol);
void l_netlink_destroy(struct l_netlink *netlink);
unsigned int l_netlink_send(struct l_netlink *netlink,
struct l_netlink_message *message,
l_netlink_command_func_t function,
void *user_data,
l_netlink_destroy_func_t destroy);
bool l_netlink_cancel(struct l_netlink *netlink, unsigned int id);
bool l_netlink_request_sent(struct l_netlink *netlink, unsigned int id);
unsigned int l_netlink_register(struct l_netlink *netlink,
uint32_t group, l_netlink_notify_func_t function,
void *user_data, l_netlink_destroy_func_t destroy);
bool l_netlink_unregister(struct l_netlink *netlink, unsigned int id);
bool l_netlink_set_debug(struct l_netlink *netlink,
l_netlink_debug_func_t function,
void *user_data, l_netlink_destroy_func_t destroy);
struct l_netlink_message *l_netlink_message_new(uint16_t type, uint16_t flags);
struct l_netlink_message *l_netlink_message_new_sized(uint16_t type,
uint16_t flags,
size_t initial_size);
struct l_netlink_message *l_netlink_message_ref(
struct l_netlink_message *message);
void l_netlink_message_unref(struct l_netlink_message *message);
int l_netlink_message_append(struct l_netlink_message *message, uint16_t type,
const void *data, size_t len);
int l_netlink_message_appendv(struct l_netlink_message *message,
uint16_t type,
const struct iovec *iov, size_t iov_len);
int l_netlink_message_add_header(struct l_netlink_message *message,
const void *header, size_t len);
int l_netlink_message_enter_nested(struct l_netlink_message *message,
uint16_t type);
int l_netlink_message_leave_nested(struct l_netlink_message *message);
static inline int l_netlink_message_append_u8(struct l_netlink_message *message,
uint16_t type, uint8_t u8)
{
return l_netlink_message_append(message, type, &u8, sizeof(uint8_t));
}
static inline int l_netlink_message_append_u16(struct l_netlink_message *message,
uint16_t type, uint16_t u16)
{
return l_netlink_message_append(message, type, &u16, sizeof(uint16_t));
}
static inline int l_netlink_message_append_u32(struct l_netlink_message *message,
uint16_t type, uint32_t u32)
{
return l_netlink_message_append(message, type, &u32, sizeof(uint32_t));
}
static inline int l_netlink_message_append_u64(struct l_netlink_message *message,
uint16_t type, uint64_t u64)
{
return l_netlink_message_append(message, type, &u64, sizeof(uint64_t));
}
static inline int l_netlink_message_append_s8(struct l_netlink_message *message,
uint16_t type, int8_t s8)
{
return l_netlink_message_append(message, type, &s8, sizeof(int8_t));
}
static inline int l_netlink_message_append_s16(struct l_netlink_message *message,
uint16_t type, int16_t s16)
{
return l_netlink_message_append(message, type, &s16, sizeof(int16_t));
}
static inline int l_netlink_message_append_s32(struct l_netlink_message *message,
uint16_t type, int32_t s32)
{
return l_netlink_message_append(message, type, &s32, sizeof(int32_t));
}
static inline int l_netlink_message_append_s64(struct l_netlink_message *message,
uint16_t type, int64_t s64)
{
return l_netlink_message_append(message, type, &s64, sizeof(int64_t));
}
static inline int l_netlink_message_append_mac(struct l_netlink_message *message,
uint16_t type,
const uint8_t mac[static 6])
{
return l_netlink_message_append(message, type, mac, 6);
}
static inline int l_netlink_message_append_string(
struct l_netlink_message *message,
uint16_t type,
const char *str)
{
return l_netlink_message_append(message, type, str, strlen(str) + 1);
}
struct l_netlink_attr {
const struct nlattr *data;
uint32_t len;
const struct nlattr *next_data;
uint32_t next_len;
};
int l_netlink_attr_init(struct l_netlink_attr *attr, size_t header_len,
const void *data, uint32_t len);
int l_netlink_attr_next(struct l_netlink_attr *attr,
uint16_t *type, uint16_t *len,
const void **data);
int l_netlink_attr_recurse(const struct l_netlink_attr *iter,
struct l_netlink_attr *nested);
#ifdef __cplusplus
}
#endif
#endif /* __ELL_NETLINK_H */
|