 exp_reply->dir = !exp_orig->dir; 
exp_gre(struct ip_conntrack *master,	u_int32_t seq,	__be16 callid,	__be16 peer_callid){	struct ip_conntrack_tuple inv_tuple;	struct ip_conntrack_tuple exp_tuples[] = {		/* tuple in original direction, PNS->PAC */		{ .src = { .ip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip,			   .u = { .gre = { .key = peer_callid } }			 },		  .dst = { .ip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip,			   .u = { .gre = { .key = callid } },			   .protonum = IPPROTO_GRE			 },		 },		/* tuple in reply direction, PAC->PNS */		{ .src = { .ip = master->tuplehash[IP_CT_DIR_REPLY].tuple.src.ip,			   .u = { .gre = { .key = callid } }			 },		  .dst = { .ip = master->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip,			   .u = { .gre = { .key = peer_callid } },			   .protonum = IPPROTO_GRE			 },		 }	};	struct ip_conntrack_expect *exp_orig, *exp_reply;	int ret = 1;	exp_orig = ip_conntrack_expect_alloc(master);	if (exp_orig == NULL)		goto out;	exp_reply = ip_conntrack_expect_alloc(master);	if (exp_reply == NULL)		goto out_put_orig;	memcpy(&exp_orig->tuple, &exp_tuples[0], sizeof(exp_orig->tuple));	exp_orig->mask.src.ip = 0xffffffff;	exp_orig->mask.src.u.all = 0;	exp_orig->mask.dst.u.all = 0;	exp_orig->mask.dst.u.gre.key = htons(0xffff);	exp_orig->mask.dst.ip = 0xffffffff;	exp_orig->mask.dst.protonum = 0xff;			exp_orig->master = master;	exp_orig->expectfn = pptp_expectfn;	exp_orig->flags = 0;	exp_orig->dir = IP_CT_DIR_ORIGINAL;	/* both expectations are identical apart from tuple */	memcpy(exp_reply, exp_orig, sizeof(*exp_reply));	memcpy(&exp_reply->tuple, &exp_tuples[1], sizeof(exp_reply->tuple));	exp_reply->dir = !exp_orig->dir;	if (ip_nat_pptp_hook_exp_gre)		ret = ip_nat_pptp_hook_exp_gre(exp_orig, exp_reply);	else {		DEBUGP("calling expect_related PNS->PAC");		DUMP_TUPLE(&exp_orig->tuple);		if (ip_conntrack_expect_related(exp_orig) != 0) {			DEBUGP("cannot expect_related()\n");			goto out_put_both;		}		DEBUGP("calling expect_related PAC->PNS");		DUMP_TUPLE(&exp_reply->tuple);		if (ip_conntrack_expect_related(exp_reply) != 0) {			DEBUGP("cannot expect_related()\n");			goto out_unexpect_orig;		}		/* Add GRE keymap entries */		if (ip_ct_gre_keymap_add(master, &exp_reply->tuple, 0) != 0) {			DEBUGP("cannot keymap_add() exp\n");			goto out_unexpect_both;		}		invert_tuplepr(&inv_tuple, &exp_reply->tuple);		if (ip_ct_gre_keymap_add(master, &inv_tuple, 1) != 0) {			ip_ct_gre_keymap_destroy(master);			DEBUGP("cannot keymap_add() exp_inv\n");			goto out_unexpect_both;		}		ret = 0;	}out_put_both:	ip_conntrack_expect_put(exp_reply);out_put_orig:	ip_conntrack_expect_put(exp_orig);out:	return ret;out_unexpect_both:	ip_conntrack_unexpect_related(exp_reply);out_unexpect_orig:	ip_conntrack_unexpect_related(exp_orig);	goto out_put_both;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/3428c209c6820bbbb7dfb323caef8d402b3deb4c/ip_conntrack_helper_pptp.c/buggy/net/ipv4/netfilter/ip_conntrack_helper_pptp.c