[IPSEC] Add complete xfrm event notification

Heres the final patch.
What this patch provides

- netlink xfrm events
- ability to have events generated by netlink propagated to pfkey
  and vice versa.
- fixes the acquire lets-be-happy-with-one-success issue

Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Jamal Hadi Salim
2005-06-18 22:42:13 -07:00
committed by David S. Miller
parent 3aa3dfb372
commit 26b15dad9f
5 changed files with 616 additions and 118 deletions

View File

@ -158,6 +158,27 @@ enum {
XFRM_STATE_DEAD
};
/* events that could be sent by kernel */
enum {
XFRM_SAP_INVALID,
XFRM_SAP_EXPIRED,
XFRM_SAP_ADDED,
XFRM_SAP_UPDATED,
XFRM_SAP_DELETED,
XFRM_SAP_FLUSHED,
__XFRM_SAP_MAX
};
#define XFRM_SAP_MAX (__XFRM_SAP_MAX - 1)
/* callback structure passed from either netlink or pfkey */
struct km_event
{
u32 data;
u32 seq;
u32 pid;
u32 event;
};
struct xfrm_type;
struct xfrm_dst;
struct xfrm_policy_afinfo {
@ -179,6 +200,8 @@ struct xfrm_policy_afinfo {
extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo);
extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo);
extern void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c);
extern void km_state_notify(struct xfrm_state *x, struct km_event *c);
#define XFRM_ACQ_EXPIRES 30
@ -290,11 +313,11 @@ struct xfrm_mgr
{
struct list_head list;
char *id;
int (*notify)(struct xfrm_state *x, int event);
int (*notify)(struct xfrm_state *x, struct km_event *c);
int (*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp, int dir);
struct xfrm_policy *(*compile_policy)(u16 family, int opt, u8 *data, int len, int *dir);
int (*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, u16 sport);
int (*notify_policy)(struct xfrm_policy *x, int dir, int event);
int (*notify_policy)(struct xfrm_policy *x, int dir, struct km_event *c);
};
extern int xfrm_register_km(struct xfrm_mgr *km);
@ -817,7 +840,7 @@ extern int xfrm_state_add(struct xfrm_state *x);
extern int xfrm_state_update(struct xfrm_state *x);
extern struct xfrm_state *xfrm_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto, unsigned short family);
extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq);
extern void xfrm_state_delete(struct xfrm_state *x);
extern int xfrm_state_delete(struct xfrm_state *x);
extern void xfrm_state_flush(u8 proto);
extern int xfrm_replay_check(struct xfrm_state *x, u32 seq);
extern void xfrm_replay_advance(struct xfrm_state *x, u32 seq);