Мне нужна помощь в настройке libnftnl с помощью libmnl.
Здесь я пытаюсь создать новую таблицу в nftables, используя libnftnl(1.2.4) и libmnl(1.0.4).
По какой-то причине mnl_cb_run возвращает ошибку с именем «Неверный аргумент».
Я не уверен как это решить. Я добавил такие атрибуты, как table_name и Family.
mnl_socket_sento завершается успешно, и mnl_socket_recvfrom также завершается успешно, но mnl_cb_run не работает.
Таблица также не создается в nftable.
Код, использованный для создания таблицы:
int nftablehandler_create_table(char* table_name, int family){
struct mnl_socket *sock = mnl_socket_open(NETLINK_NETFILTER);
if (!sock) {
log_info("Error: mnl_socket_open failed");
return -1;
}
if (mnl_socket_bind(sock, 0, MNL_SOCKET_AUTOPID) < 0) {
log_info("Error: mnl_socket_bind failed");
mnl_socket_close(sock);
return -1;
}
struct nftnl_table *t;
struct nl_msg *msg = nfnlmsg_alloc_simple( NFNL_SUBSYS_NFTABLES,NFT_MSG_NEWTABLE,NLM_F_CREATE | NLM_F_ACK | NLM_F_EXCL,NFPROTO_INET,0);
struct nlmsghdr *nlh;
char buf[MNL_SOCKET_BUFFER_SIZE];
uint32_t seq, portid;
int err;
static uint32_t seq_counter = 0;
nlh = nlmsg_hdr(msg);
t = nftnl_table_alloc();
if (!t) {
log_info("Error: Could not allocate table structure.\n");
return -1;
}
nftnl_table_set_str(t, NFTNL_TABLE_NAME, table_name);
nftnl_table_set_u32(t, NFTNL_TABLE_FAMILY, family);
// 3. Generate unique seq and get portid
portid = mnl_socket_get_portid(sock);
seq = ++seq_counter; // Generate unique sequence
// 4. Build the Netlink message (passing seq AND portid)
nlh = nftnl_table_nlmsg_build_hdr(
buf,
NFT_MSG_NEWTABLE,
family,
NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK | NLM_F_REQUEST,
seq
);
if (!nlh) {
log_info("Error: Could not build table message header.\n");
nftnl_table_free(t);
return -1;
}
nftnl_table_nlmsg_build_payload(nlh,t);
// 5. Send the message
err = mnl_socket_sendto(sock, nlh, nlh->nlmsg_len);
if (err < 0){
log_info("[ERROR][NFTABLE][TABLE CREATION FAILED - SEND][TABLE NAME: %s]",table_name);
nftnl_table_free(t);
return err;
}
// 6. Receive the ACK/Error response
err = mnl_socket_recvfrom(sock, buf, sizeof(buf));
if (err < 0){
log_info("[ERROR][NFTABLE][TABLE CREATION FAILED - RECV][TABLE NAME: %s]",table_name);
nftnl_table_free(t);
return err;
}
mnl_socket
// 7. Process the received message (using local portid for filtering)
err = mnl_cb_run(buf, err, seq, mnl_socket_get_portid(sock), nft_error_cb, NULL);
if (err < 0){
log_info("[ERROR][NFTABLE][CALLBACK FAILED / KERNEL ERROR][TABLE NAME: %s][ERROR: %s]%d",table_name,strerror(errno),errno);
// Note: nft_error_cb should have logged the specific kernel error
nftnl_table_free(t);
return err;
}
// Success
log_info("[INFO][NFTABLE][TABLE CREATION SUCCESSFUL][TABLE NAME: %s] [error %d]",table_name,err);
nftnl_table_free(t);
return 0;
}
Функция обратного вызова:
static int nft_error_cb(const struct nlmsghdr *nlh, void *data)
{
log_info("[DEBUG] nft_error_cb invoked");
struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh);
if (err->error == 0) {
// ACK success
return MNL_CB_STOP;
}
log_info("[KERNEL ERROR] errno=%d (%s)",
-err->error,
strerror(-err->error));
return MNL_CB_ERROR;
}
Вызов функции:
int family = NFPROTO_INET;
int res = nftablehandler_create_table(strdup("test_table"),family);
if(res < 0){
log_info("nftable failed");
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... h-libnftnl
Новое создание nftable с помощью libnftnl ⇐ Linux
1765800317
Anonymous
Мне нужна помощь в настройке libnftnl с помощью libmnl.
Здесь я пытаюсь создать новую таблицу в nftables, используя libnftnl(1.2.4) и libmnl(1.0.4).
По какой-то причине mnl_cb_run возвращает ошибку с именем «Неверный аргумент».
Я не уверен как это решить. Я добавил такие атрибуты, как table_name и Family.
mnl_socket_sento завершается успешно, и mnl_socket_recvfrom также завершается успешно, но mnl_cb_run не работает.
Таблица также не создается в nftable.
Код, использованный для создания таблицы:
int nftablehandler_create_table(char* table_name, int family){
struct mnl_socket *sock = mnl_socket_open(NETLINK_NETFILTER);
if (!sock) {
log_info("Error: mnl_socket_open failed");
return -1;
}
if (mnl_socket_bind(sock, 0, MNL_SOCKET_AUTOPID) < 0) {
log_info("Error: mnl_socket_bind failed");
mnl_socket_close(sock);
return -1;
}
struct nftnl_table *t;
struct nl_msg *msg = nfnlmsg_alloc_simple( NFNL_SUBSYS_NFTABLES,NFT_MSG_NEWTABLE,NLM_F_CREATE | NLM_F_ACK | NLM_F_EXCL,NFPROTO_INET,0);
struct nlmsghdr *nlh;
char buf[MNL_SOCKET_BUFFER_SIZE];
uint32_t seq, portid;
int err;
static uint32_t seq_counter = 0;
nlh = nlmsg_hdr(msg);
t = nftnl_table_alloc();
if (!t) {
log_info("Error: Could not allocate table structure.\n");
return -1;
}
nftnl_table_set_str(t, NFTNL_TABLE_NAME, table_name);
nftnl_table_set_u32(t, NFTNL_TABLE_FAMILY, family);
// 3. Generate unique seq and get portid
portid = mnl_socket_get_portid(sock);
seq = ++seq_counter; // Generate unique sequence
// 4. Build the Netlink message (passing seq AND portid)
nlh = nftnl_table_nlmsg_build_hdr(
buf,
NFT_MSG_NEWTABLE,
family,
NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK | NLM_F_REQUEST,
seq
);
if (!nlh) {
log_info("Error: Could not build table message header.\n");
nftnl_table_free(t);
return -1;
}
nftnl_table_nlmsg_build_payload(nlh,t);
// 5. Send the message
err = mnl_socket_sendto(sock, nlh, nlh->nlmsg_len);
if (err < 0){
log_info("[ERROR][NFTABLE][TABLE CREATION FAILED - SEND][TABLE NAME: %s]",table_name);
nftnl_table_free(t);
return err;
}
// 6. Receive the ACK/Error response
err = mnl_socket_recvfrom(sock, buf, sizeof(buf));
if (err < 0){
log_info("[ERROR][NFTABLE][TABLE CREATION FAILED - RECV][TABLE NAME: %s]",table_name);
nftnl_table_free(t);
return err;
}
mnl_socket
// 7. Process the received message (using local portid for filtering)
err = mnl_cb_run(buf, err, seq, mnl_socket_get_portid(sock), nft_error_cb, NULL);
if (err < 0){
log_info("[ERROR][NFTABLE][CALLBACK FAILED / KERNEL ERROR][TABLE NAME: %s][ERROR: %s]%d",table_name,strerror(errno),errno);
// Note: nft_error_cb should have logged the specific kernel error
nftnl_table_free(t);
return err;
}
// Success
log_info("[INFO][NFTABLE][TABLE CREATION SUCCESSFUL][TABLE NAME: %s] [error %d]",table_name,err);
nftnl_table_free(t);
return 0;
}
Функция обратного вызова:
static int nft_error_cb(const struct nlmsghdr *nlh, void *data)
{
log_info("[DEBUG] nft_error_cb invoked");
struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh);
if (err->error == 0) {
// ACK success
return MNL_CB_STOP;
}
log_info("[KERNEL ERROR] errno=%d (%s)",
-err->error,
strerror(-err->error));
return MNL_CB_ERROR;
}
Вызов функции:
int family = NFPROTO_INET;
int res = nftablehandler_create_table(strdup("test_table"),family);
if(res < 0){
log_info("nftable failed");
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79847651/new-nftable-creation-with-libnftnl[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия