case NFTA_CHAIN_NAME:
case NFTA_CHAIN_TABLE:
case NFTA_CHAIN_TYPE:
- if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
+ abi_breakage();
break;
case NFTA_CHAIN_HOOK:
case NFTA_CHAIN_COUNTERS:
- if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0)
+ abi_breakage();
break;
case NFTA_CHAIN_POLICY:
case NFTA_CHAIN_USE:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
case NFTA_CHAIN_HANDLE:
- if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_COUNTER_BYTES:
case NFTA_COUNTER_PACKETS:
- if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_HOOK_HOOKNUM:
case NFTA_HOOK_PRIORITY:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
}
case NFTA_BITWISE_SREG:
case NFTA_BITWISE_DREG:
case NFTA_BITWISE_LEN:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
case NFTA_BITWISE_MASK:
case NFTA_BITWISE_XOR:
- if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0)
+ abi_breakage();
break;
}
case NFTA_BYTEORDER_OP:
case NFTA_BYTEORDER_LEN:
case NFTA_BYTEORDER_SIZE:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_CMP_SREG:
case NFTA_CMP_OP:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
case NFTA_CMP_DATA:
- if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_COUNTER_BYTES:
case NFTA_COUNTER_PACKETS:
- if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0)
+ abi_breakage();
break;
}
case NFTA_CT_KEY:
case NFTA_CT_DREG:
case NFTA_CT_SREG:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
case NFTA_CT_DIRECTION:
- if (mnl_attr_validate(attr, MNL_TYPE_U8) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_DATA_VALUE:
- if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0)
+ abi_breakage();
break;
case NFTA_DATA_VERDICT:
- if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0)
+ abi_breakage();
break;
}
tb[type] = attr;
switch(type) {
case NFTA_VERDICT_CODE:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
case NFTA_VERDICT_CHAIN:
- if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
+ abi_breakage();
break;
}
tb[type] = attr;
switch(type) {
case NFTA_EXTHDR_TYPE:
- if (mnl_attr_validate(attr, MNL_TYPE_U8) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
+ abi_breakage();
break;
case NFTA_EXTHDR_DREG:
case NFTA_EXTHDR_OFFSET:
case NFTA_EXTHDR_LEN:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_IMMEDIATE_DREG:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
case NFTA_IMMEDIATE_DATA:
- if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_LIMIT_RATE:
case NFTA_LIMIT_UNIT:
- if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_LOG_PREFIX:
- if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
+ abi_breakage();
break;
case NFTA_LOG_GROUP:
case NFTA_LOG_QTHRESHOLD:
- if (mnl_attr_validate(attr, MNL_TYPE_U16) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
+ abi_breakage();
break;
case NFTA_LOG_SNAPLEN:
case NFTA_LOG_LEVEL:
case NFTA_LOG_FLAGS:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
}
case NFTA_LOOKUP_SREG:
case NFTA_LOOKUP_DREG:
case NFTA_LOOKUP_SET_ID:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
case NFTA_LOOKUP_SET:
- if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_MATCH_NAME:
- if (mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0)
+ abi_breakage();
break;
case NFTA_MATCH_REV:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
case NFTA_MATCH_INFO:
- if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0)
+ abi_breakage();
break;
}
case NFTA_META_KEY:
case NFTA_META_DREG:
case NFTA_META_SREG:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
}
case NFTA_NAT_REG_ADDR_MAX:
case NFTA_NAT_REG_PROTO_MIN:
case NFTA_NAT_REG_PROTO_MAX:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
}
case NFTA_PAYLOAD_BASE:
case NFTA_PAYLOAD_OFFSET:
case NFTA_PAYLOAD_LEN:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
}
case NFTA_QUEUE_NUM:
case NFTA_QUEUE_TOTAL:
case NFTA_QUEUE_FLAGS:
- if (mnl_attr_validate(attr, MNL_TYPE_U16) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_REJECT_TYPE:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
case NFTA_REJECT_ICMP_CODE:
- if (mnl_attr_validate(attr, MNL_TYPE_U8) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_TARGET_NAME:
- if (mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0)
+ abi_breakage();
break;
case NFTA_TARGET_REV:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
case NFTA_TARGET_INFO:
- if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0)
+ abi_breakage();
break;
}
nft_assert(data, attr, _validate_array[_attr] == _data_len); \
})
+#define __noreturn __attribute__((__noreturn__))
+
+void __noreturn __abi_breakage(const char *file, int line, const char *reason);
+
+#include <string.h>
+
+#define abi_breakage() \
+ __abi_breakage(__FILE__, __LINE__, strerror(errno));
+
#endif
switch(type) {
case NFTA_RULE_TABLE:
case NFTA_RULE_CHAIN:
- if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
+ abi_breakage();
break;
case NFTA_RULE_HANDLE:
- if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0)
+ abi_breakage();
break;
case NFTA_RULE_COMPAT:
- if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0)
+ abi_breakage();
break;
case NFTA_RULE_POSITION:
- if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0)
+ abi_breakage();
break;
case NFTA_RULE_USERDATA:
- if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_EXPR_NAME:
- if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
+ abi_breakage();
break;
case NFTA_EXPR_DATA:
- if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_RULE_COMPAT_PROTO:
case NFTA_RULE_COMPAT_FLAGS:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_SET_TABLE:
case NFTA_SET_NAME:
- if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
+ abi_breakage();
break;
case NFTA_SET_FLAGS:
case NFTA_SET_KEY_TYPE:
case NFTA_SET_DATA_TYPE:
case NFTA_SET_DATA_LEN:
case NFTA_SET_ID:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_SET_ELEM_FLAGS:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
case NFTA_SET_ELEM_KEY:
case NFTA_SET_ELEM_DATA:
- if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_SET_ELEM_LIST_TABLE:
case NFTA_SET_ELEM_LIST_SET:
- if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
+ abi_breakage();
break;
case NFTA_SET_ELEM_LIST_ELEMENTS:
- if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0)
+ abi_breakage();
break;
}
switch(type) {
case NFTA_TABLE_NAME:
- if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
+ abi_breakage();
break;
case NFTA_TABLE_FLAGS:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
- break;
case NFTA_TABLE_USE:
- if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
- perror("mnl_attr_validate");
- return MNL_CB_ERROR;
- }
+ if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+ abi_breakage();
break;
}
attr, filename, line);
exit(EXIT_FAILURE);
}
+
+void __noreturn __abi_breakage(const char *file, int line, const char *reason)
+{
+ fprintf(stderr, "nf_tables kernel ABI is broken, contact your vendor.\n"
+ "%s:%d reason: %s\n", file, line, reason);
+ exit(EXIT_FAILURE);
+}