return 0; 
ctnetlink_del_expect(struct sock *ctnl, struct sk_buff *skb, 		     struct nlmsghdr *nlh, struct nfattr *cda[], int *errp){	struct ip_conntrack_expect *exp, *tmp;	struct ip_conntrack_tuple tuple;	struct ip_conntrack_helper *h;	int err;	/* delete by tuple needs either orig or reply tuple */	if (cda[CTA_TUPLE_ORIG-1])		err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG);	else if (cda[CTA_TUPLE_REPLY-1])		err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_REPLY);	else if (cda[CTA_HELP_NAME-1]) {		char *name = NFA_DATA(cda[CTA_HELP_NAME-1]);		/* delete all expectations for this helper */		write_lock_bh(&ip_conntrack_lock);		h = __ip_conntrack_helper_find_byname(name);		if (!h) {			write_unlock_bh(&ip_conntrack_lock);			return -EINVAL;		}		list_for_each_entry_safe(exp, tmp, &ip_conntrack_expect_list,					 list) {			if (exp->master->helper == h 			    && del_timer(&exp->timeout))				__ip_ct_expect_unlink_destroy(exp);		}		write_unlock(&ip_conntrack_lock);		return 0;	} else {		/* This basically means we have to flush everything*/		write_lock_bh(&ip_conntrack_lock);		list_for_each_entry_safe(exp, tmp, &ip_conntrack_expect_list,					 list) {			if (del_timer(&exp->timeout))				__ip_ct_expect_unlink_destroy(exp);		}		write_unlock_bh(&ip_conntrack_lock);		return 0;	}	if (err < 0)		return err;	/* bump usage count to 2 */	exp = ip_conntrack_expect_find_get(&tuple);	if (!exp)		return -ENOENT;	if (cda[CTA_EXPECT_ID-1]) {		u_int32_t id = *(u_int32_t *)NFA_DATA(cda[CTA_EXPECT_ID-1]);		if (exp->id != ntohl(id)) {			ip_conntrack_expect_put(exp);			return -ENOENT;		}	}	/* after list removal, usage count == 1 */	ip_conntrack_unexpect_related(exp);	/* have to put what we 'get' above. after this line usage count == 0 */	ip_conntrack_expect_put(exp);	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/1444fc559b01aa5d4fedf4ee4f306a9e9cd56f95/ip_conntrack_netlink.c/clean/net/ipv4/netfilter/ip_conntrack_netlink.c