NETLINK_CB(skb).dst_groups = XFRMGRP_SA;  
static int xfrm_notify_sa(struct xfrm_state *x, struct km_event *c){	struct xfrm_usersa_info *p;	struct xfrm_usersa_id *id;	struct nlmsghdr *nlh;	struct sk_buff *skb;	unsigned char *b;	int len = xfrm_sa_len(x);	int headlen;	headlen = sizeof(*p);	if (c->event == XFRM_MSG_DELSA) {		len += RTA_SPACE(headlen);		headlen = sizeof(*id);	}	len += NLMSG_SPACE(headlen);	skb = alloc_skb(len, GFP_ATOMIC);	if (skb == NULL)		return -ENOMEM;	b = skb->tail;	nlh = NLMSG_PUT(skb, c->pid, c->seq, c->event, headlen);	nlh->nlmsg_flags = 0;	p = NLMSG_DATA(nlh);	if (c->event == XFRM_MSG_DELSA) {		id = NLMSG_DATA(nlh);		memcpy(&id->daddr, &x->id.daddr, sizeof(id->daddr));		id->spi = x->id.spi;		id->family = x->props.family;		id->proto = x->id.proto;		p = RTA_DATA(__RTA_PUT(skb, XFRMA_SA, sizeof(*p)));	}	copy_to_user_state(x, p);	if (x->aalg)		RTA_PUT(skb, XFRMA_ALG_AUTH,			sizeof(*(x->aalg))+(x->aalg->alg_key_len+7)/8, x->aalg);	if (x->ealg)		RTA_PUT(skb, XFRMA_ALG_CRYPT,			sizeof(*(x->ealg))+(x->ealg->alg_key_len+7)/8, x->ealg);	if (x->calg)		RTA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg);	if (x->encap)		RTA_PUT(skb, XFRMA_ENCAP, sizeof(*x->encap), x->encap);	nlh->nlmsg_len = skb->tail - b;	return netlink_broadcast(xfrm_nl, skb, 0, XFRMGRP_SA, GFP_ATOMIC);nlmsg_failure:rtattr_failure:	kfree_skb(skb);	return -1;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/43e943c32b9213b5d25407b281c94aaa474fd9a6/xfrm_user.c/clean/net/xfrm/xfrm_user.c