if (!(chain->flags & CHAIN_F_BASECHAIN))
break;
+ if (!chain->priority.expr || !chain->type.str)
+ break;
+
mpz_export_data(&priority, chain->priority.expr->value,
BYTEORDER_HOST_ENDIAN, sizeof(int));
if (priority <= -200 && !strcmp(chain->type.str, "nat"))
}
if (chain->flags & CHAIN_F_BASECHAIN) {
- chain->hook.num = str2hooknum(chain->handle.family,
- chain->hook.name);
- if (chain->hook.num == NF_INET_NUMHOOKS)
- return __stmt_binary_error(ctx, &chain->hook.loc, NULL,
- "The %s family does not support this hook",
- family2str(chain->handle.family));
-
- if (!evaluate_priority(ctx, &chain->priority,
- chain->handle.family, chain->hook.num))
- return __stmt_binary_error(ctx, &chain->priority.loc, NULL,
- "invalid priority expression %s in this context.",
- expr_name(chain->priority.expr));
+ if (chain->hook.name) {
+ chain->hook.num = str2hooknum(chain->handle.family,
+ chain->hook.name);
+ if (chain->hook.num == NF_INET_NUMHOOKS)
+ return __stmt_binary_error(ctx, &chain->hook.loc, NULL,
+ "The %s family does not support this hook",
+ family2str(chain->handle.family));
+ }
+ if (chain->priority.expr) {
+ if (!evaluate_priority(ctx, &chain->priority,
+ chain->handle.family, chain->hook.num))
+ return __stmt_binary_error(ctx, &chain->priority.loc, NULL,
+ "invalid priority expression %s in this context.",
+ expr_name(chain->priority.expr));
+ }
if (chain->policy) {
expr_set_context(&ctx->ectx, &policy_type,
NFT_NAME_MAXLEN * BITS_PER_BYTE);
mnl_attr_put_strz(nlh, NFTA_CHAIN_TYPE, cmd->chain->type.str);
}
- nest = mnl_attr_nest_start(nlh, NFTA_CHAIN_HOOK);
+ if (cmd->chain->type.str ||
+ (cmd->chain && cmd->chain->dev_expr))
+ nest = mnl_attr_nest_start(nlh, NFTA_CHAIN_HOOK);
if (cmd->chain->type.str) {
mnl_attr_put_u32(nlh, NFTA_HOOK_HOOKNUM, htonl(cmd->chain->hook.num));
if (cmd->chain && cmd->chain->dev_expr)
mnl_nft_chain_devs_build(nlh, cmd);
- mnl_attr_nest_end(nlh, nest);
+ if (cmd->chain->type.str ||
+ (cmd->chain && cmd->chain->dev_expr))
+ mnl_attr_nest_end(nlh, nest);
}
nftnl_chain_free(nlc);