mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 10:29:37 +00:00
![Pablo Neira Ayuso](/assets/img/avatar_default.png)
This patch removes the module dependency between ctnetlink and nf_nat by means of an indirect call that is initialized when nf_nat is loaded. Now, nf_conntrack_netlink only requires nf_conntrack and nfnetlink. This patch puts nfnetlink_parse_nat_setup_hook into the nf_conntrack_core to avoid dependencies between ctnetlink, nf_conntrack_ipv4 and nf_conntrack_ipv6. This patch also introduces the function ctnetlink_change_nat that is only invoked from the creation path. Actually, the nat handling cannot be invoked from the update path since this is not allowed. By introducing this function, we remove the useless nat handling in the update path and we avoid deadlock-prone code. This patch also adds the required EAGAIN logic for nfnetlink. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
88 lines
2.6 KiB
C
88 lines
2.6 KiB
C
#ifndef _NFNETLINK_H
|
|
#define _NFNETLINK_H
|
|
#include <linux/types.h>
|
|
#include <linux/netfilter/nfnetlink_compat.h>
|
|
|
|
enum nfnetlink_groups {
|
|
NFNLGRP_NONE,
|
|
#define NFNLGRP_NONE NFNLGRP_NONE
|
|
NFNLGRP_CONNTRACK_NEW,
|
|
#define NFNLGRP_CONNTRACK_NEW NFNLGRP_CONNTRACK_NEW
|
|
NFNLGRP_CONNTRACK_UPDATE,
|
|
#define NFNLGRP_CONNTRACK_UPDATE NFNLGRP_CONNTRACK_UPDATE
|
|
NFNLGRP_CONNTRACK_DESTROY,
|
|
#define NFNLGRP_CONNTRACK_DESTROY NFNLGRP_CONNTRACK_DESTROY
|
|
NFNLGRP_CONNTRACK_EXP_NEW,
|
|
#define NFNLGRP_CONNTRACK_EXP_NEW NFNLGRP_CONNTRACK_EXP_NEW
|
|
NFNLGRP_CONNTRACK_EXP_UPDATE,
|
|
#define NFNLGRP_CONNTRACK_EXP_UPDATE NFNLGRP_CONNTRACK_EXP_UPDATE
|
|
NFNLGRP_CONNTRACK_EXP_DESTROY,
|
|
#define NFNLGRP_CONNTRACK_EXP_DESTROY NFNLGRP_CONNTRACK_EXP_DESTROY
|
|
__NFNLGRP_MAX,
|
|
};
|
|
#define NFNLGRP_MAX (__NFNLGRP_MAX - 1)
|
|
|
|
/* General form of address family dependent message.
|
|
*/
|
|
struct nfgenmsg {
|
|
u_int8_t nfgen_family; /* AF_xxx */
|
|
u_int8_t version; /* nfnetlink version */
|
|
__be16 res_id; /* resource id */
|
|
};
|
|
|
|
#define NFNETLINK_V0 0
|
|
|
|
/* netfilter netlink message types are split in two pieces:
|
|
* 8 bit subsystem, 8bit operation.
|
|
*/
|
|
|
|
#define NFNL_SUBSYS_ID(x) ((x & 0xff00) >> 8)
|
|
#define NFNL_MSG_TYPE(x) (x & 0x00ff)
|
|
|
|
/* No enum here, otherwise __stringify() trick of MODULE_ALIAS_NFNL_SUBSYS()
|
|
* won't work anymore */
|
|
#define NFNL_SUBSYS_NONE 0
|
|
#define NFNL_SUBSYS_CTNETLINK 1
|
|
#define NFNL_SUBSYS_CTNETLINK_EXP 2
|
|
#define NFNL_SUBSYS_QUEUE 3
|
|
#define NFNL_SUBSYS_ULOG 4
|
|
#define NFNL_SUBSYS_COUNT 5
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#include <linux/netlink.h>
|
|
#include <linux/capability.h>
|
|
#include <net/netlink.h>
|
|
|
|
struct nfnl_callback
|
|
{
|
|
int (*call)(struct sock *nl, struct sk_buff *skb,
|
|
struct nlmsghdr *nlh, struct nlattr *cda[]);
|
|
const struct nla_policy *policy; /* netlink attribute policy */
|
|
const u_int16_t attr_count; /* number of nlattr's */
|
|
};
|
|
|
|
struct nfnetlink_subsystem
|
|
{
|
|
const char *name;
|
|
__u8 subsys_id; /* nfnetlink subsystem ID */
|
|
__u8 cb_count; /* number of callbacks */
|
|
const struct nfnl_callback *cb; /* callback for individual types */
|
|
};
|
|
|
|
extern int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n);
|
|
extern int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n);
|
|
|
|
extern int nfnetlink_has_listeners(unsigned int group);
|
|
extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group,
|
|
int echo);
|
|
extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags);
|
|
|
|
extern void nfnl_lock(void);
|
|
extern void nfnl_unlock(void);
|
|
|
|
#define MODULE_ALIAS_NFNL_SUBSYS(subsys) \
|
|
MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys))
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _NFNETLINK_H */
|