nftset: fix family option not working issue
This commit is contained in:
@@ -46,6 +46,27 @@ enum { PAYLOAD_MAX = 2048 };
|
|||||||
|
|
||||||
static int nftset_fd;
|
static int nftset_fd;
|
||||||
|
|
||||||
|
static int _nftset_get_nffamily_from_str(const char *family)
|
||||||
|
{
|
||||||
|
if (strncmp(family, "inet", sizeof("inet")) == 0) {
|
||||||
|
return NFPROTO_INET;
|
||||||
|
} else if (strncmp(family, "ip", sizeof("ip")) == 0) {
|
||||||
|
return NFPROTO_IPV4;
|
||||||
|
} else if (strncmp(family, "ip6", sizeof("ip6")) == 0) {
|
||||||
|
return NFPROTO_IPV6;
|
||||||
|
} else if (strncmp(family, "arp", sizeof("arp")) == 0) {
|
||||||
|
return NFPROTO_ARP;
|
||||||
|
} else if (strncmp(family, "netdev", sizeof("netdev")) == 0) {
|
||||||
|
return NFPROTO_NETDEV;
|
||||||
|
} else if (strncmp(family, "bridge", sizeof("bridge")) == 0) {
|
||||||
|
return NFPROTO_BRIDGE;
|
||||||
|
} else if (strncmp(family, "decnet", sizeof("decnet")) == 0) {
|
||||||
|
return NFPROTO_DECNET;
|
||||||
|
} else {
|
||||||
|
return NFPROTO_UNSPEC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct rtattr *_nftset_nlmsg_tail(struct nlmsghdr *n)
|
static struct rtattr *_nftset_nlmsg_tail(struct nlmsghdr *n)
|
||||||
{
|
{
|
||||||
return (struct rtattr *)((uint8_t *)n + NLMSG_ALIGN(n->nlmsg_len));
|
return (struct rtattr *)((uint8_t *)n + NLMSG_ALIGN(n->nlmsg_len));
|
||||||
@@ -249,7 +270,7 @@ static int _nftset_socket_send(void *msg, int msg_len)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _nftset_del_element(const char *table_name, const char *setname, const void *data, int data_len, void *buf,
|
static int _nftset_del_element(int nffamily, const char *table_name, const char *setname, const void *data, int data_len, void *buf,
|
||||||
void **nextbuf)
|
void **nextbuf)
|
||||||
{
|
{
|
||||||
struct nlmsgreq *req = (struct nlmsgreq *)buf;
|
struct nlmsgreq *req = (struct nlmsgreq *)buf;
|
||||||
@@ -264,7 +285,7 @@ static int _nftset_del_element(const char *table_name, const char *setname, cons
|
|||||||
req->h.nlmsg_flags |= NLM_F_ACK;
|
req->h.nlmsg_flags |= NLM_F_ACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
req->m.nfgen_family = NFPROTO_INET;
|
req->m.nfgen_family = nffamily;
|
||||||
|
|
||||||
struct nlmsghdr *n = &req->h;
|
struct nlmsghdr *n = &req->h;
|
||||||
|
|
||||||
@@ -286,7 +307,7 @@ static int _nftset_del_element(const char *table_name, const char *setname, cons
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _nftset_add_element(const char *table_name, const char *setname, const void *data, int data_len,
|
static int _nftset_add_element(int nffamily, const char *table_name, const char *setname, const void *data, int data_len,
|
||||||
unsigned long timeout, void *buf, void **nextbuf)
|
unsigned long timeout, void *buf, void **nextbuf)
|
||||||
{
|
{
|
||||||
struct nlmsgreq *req = (struct nlmsgreq *)buf;
|
struct nlmsgreq *req = (struct nlmsgreq *)buf;
|
||||||
@@ -301,7 +322,7 @@ static int _nftset_add_element(const char *table_name, const char *setname, cons
|
|||||||
req->h.nlmsg_flags |= NLM_F_ACK;
|
req->h.nlmsg_flags |= NLM_F_ACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
req->m.nfgen_family = NFPROTO_INET;
|
req->m.nfgen_family = nffamily;
|
||||||
|
|
||||||
struct nlmsghdr *n = &req->h;
|
struct nlmsghdr *n = &req->h;
|
||||||
|
|
||||||
@@ -329,7 +350,7 @@ static int _nftset_add_element(const char *table_name, const char *setname, cons
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nftset_del(const char *familyname, const char *tablename, const char *setname, const unsigned char addr[],
|
static int _nftset_del(int nffamily, const char *tablename, const char *setname, const unsigned char addr[],
|
||||||
int addr_len)
|
int addr_len)
|
||||||
{
|
{
|
||||||
uint8_t buf[PAYLOAD_MAX];
|
uint8_t buf[PAYLOAD_MAX];
|
||||||
@@ -337,11 +358,17 @@ int nftset_del(const char *familyname, const char *tablename, const char *setnam
|
|||||||
int buffer_len = 0;
|
int buffer_len = 0;
|
||||||
|
|
||||||
_nftset_start_batch(next, &next);
|
_nftset_start_batch(next, &next);
|
||||||
_nftset_del_element(tablename, setname, addr, addr_len, next, &next);
|
_nftset_del_element(nffamily, tablename, setname, addr, addr_len, next, &next);
|
||||||
_nftset_end_batch(next, &next);
|
_nftset_end_batch(next, &next);
|
||||||
buffer_len = (uint8_t *)next - buf;
|
buffer_len = (uint8_t *)next - buf;
|
||||||
|
return _nftset_socket_send(buf, buffer_len);;
|
||||||
|
}
|
||||||
|
|
||||||
int ret = _nftset_socket_send(buf, buffer_len);
|
int nftset_del(const char *familyname, const char *tablename, const char *setname, const unsigned char addr[],
|
||||||
|
int addr_len)
|
||||||
|
{
|
||||||
|
int nffamily = _nftset_get_nffamily_from_str(familyname);
|
||||||
|
int ret = _nftset_del(nffamily, tablename, setname, addr, addr_len);
|
||||||
if (ret != 0 && errno != ENOENT) {
|
if (ret != 0 && errno != ENOENT) {
|
||||||
tlog(TLOG_ERROR, "nftset delete failed, family:%s, table:%s, set:%s, error:%s", familyname, tablename, setname,
|
tlog(TLOG_ERROR, "nftset delete failed, family:%s, table:%s, set:%s, error:%s", familyname, tablename, setname,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
@@ -357,14 +384,15 @@ int nftset_add(const char *familyname, const char *tablename, const char *setnam
|
|||||||
void *next = buf;
|
void *next = buf;
|
||||||
int buffer_len = 0;
|
int buffer_len = 0;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
int nffamily = _nftset_get_nffamily_from_str(familyname);
|
||||||
|
|
||||||
if (dns_conf_nftset_timeout_enable == 0) {
|
if (dns_conf_nftset_timeout_enable == 0) {
|
||||||
timeout = 0;
|
timeout = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
nftset_del(familyname, tablename, setname, addr, addr_len);
|
_nftset_del(nffamily, tablename, setname, addr, addr_len);
|
||||||
_nftset_start_batch(next, &next);
|
_nftset_start_batch(next, &next);
|
||||||
_nftset_add_element(tablename, setname, addr, addr_len, timeout, next, &next);
|
_nftset_add_element(nffamily, tablename, setname, addr, addr_len, timeout, next, &next);
|
||||||
_nftset_end_batch(next, &next);
|
_nftset_end_batch(next, &next);
|
||||||
buffer_len = (uint8_t *)next - buf;
|
buffer_len = (uint8_t *)next - buf;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user