⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ip_nat_helper_h323.c

📁 LINUX 2.6.17.4的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* Success */	DEBUGP("ip_nat_h323: expect RTP %u.%u.%u.%u:%hu->%u.%u.%u.%u:%hu\n",	       NIPQUAD(rtp_exp->tuple.src.ip),	       ntohs(rtp_exp->tuple.src.u.udp.port),	       NIPQUAD(rtp_exp->tuple.dst.ip),	       ntohs(rtp_exp->tuple.dst.u.udp.port));	DEBUGP("ip_nat_h323: expect RTCP %u.%u.%u.%u:%hu->%u.%u.%u.%u:%hu\n",	       NIPQUAD(rtcp_exp->tuple.src.ip),	       ntohs(rtcp_exp->tuple.src.u.udp.port),	       NIPQUAD(rtcp_exp->tuple.dst.ip),	       ntohs(rtcp_exp->tuple.dst.u.udp.port));	return 0;}/****************************************************************************/static int nat_t120(struct sk_buff **pskb, struct ip_conntrack *ct,		    enum ip_conntrack_info ctinfo,		    unsigned char **data, int dataoff,		    H245_TransportAddress * addr, u_int16_t port,		    struct ip_conntrack_expect *exp){	int dir = CTINFO2DIR(ctinfo);	u_int16_t nated_port = port;	/* Set expectations for NAT */	exp->saved_proto.tcp.port = exp->tuple.dst.u.tcp.port;	exp->expectfn = ip_nat_follow_master;	exp->dir = !dir;	/* Try to get same port: if not, try to change it. */	for (; nated_port != 0; nated_port++) {		exp->tuple.dst.u.tcp.port = htons(nated_port);		if (ip_conntrack_expect_related(exp) == 0)			break;	}	if (nated_port == 0) {	/* No port available */		if (net_ratelimit())			printk("ip_nat_h323: out of TCP ports\n");		return 0;	}	/* Modify signal */	if (set_h245_addr(pskb, data, dataoff, addr,			  ct->tuplehash[!dir].tuple.dst.ip, nated_port) < 0) {		ip_conntrack_unexpect_related(exp);		return -1;	}	DEBUGP("ip_nat_h323: expect T.120 %u.%u.%u.%u:%hu->%u.%u.%u.%u:%hu\n",	       NIPQUAD(exp->tuple.src.ip), ntohs(exp->tuple.src.u.tcp.port),	       NIPQUAD(exp->tuple.dst.ip), ntohs(exp->tuple.dst.u.tcp.port));	return 0;}/**************************************************************************** * This conntrack expect function replaces ip_conntrack_h245_expect() * which was set by ip_conntrack_helper_h323.c. It calls both * ip_nat_follow_master() and ip_conntrack_h245_expect() ****************************************************************************/static void ip_nat_h245_expect(struct ip_conntrack *new,			       struct ip_conntrack_expect *this){	ip_nat_follow_master(new, this);	ip_conntrack_h245_expect(new, this);}/****************************************************************************/static int nat_h245(struct sk_buff **pskb, struct ip_conntrack *ct,		    enum ip_conntrack_info ctinfo,		    unsigned char **data, int dataoff,		    TransportAddress * addr, u_int16_t port,		    struct ip_conntrack_expect *exp){	struct ip_ct_h323_master *info = &ct->help.ct_h323_info;	int dir = CTINFO2DIR(ctinfo);	u_int16_t nated_port = port;	/* Set expectations for NAT */	exp->saved_proto.tcp.port = exp->tuple.dst.u.tcp.port;	exp->expectfn = ip_nat_h245_expect;	exp->dir = !dir;	/* Check existing expects */	if (info->sig_port[dir] == port)		nated_port = info->sig_port[!dir];	/* Try to get same port: if not, try to change it. */	for (; nated_port != 0; nated_port++) {		exp->tuple.dst.u.tcp.port = htons(nated_port);		if (ip_conntrack_expect_related(exp) == 0)			break;	}	if (nated_port == 0) {	/* No port available */		if (net_ratelimit())			printk("ip_nat_q931: out of TCP ports\n");		return 0;	}	/* Modify signal */	if (set_h225_addr(pskb, data, dataoff, addr,			  ct->tuplehash[!dir].tuple.dst.ip,			  nated_port) == 0) {		/* Save ports */		info->sig_port[dir] = port;		info->sig_port[!dir] = nated_port;	} else {		ip_conntrack_unexpect_related(exp);		return -1;	}	DEBUGP("ip_nat_q931: expect H.245 %u.%u.%u.%u:%hu->%u.%u.%u.%u:%hu\n",	       NIPQUAD(exp->tuple.src.ip), ntohs(exp->tuple.src.u.tcp.port),	       NIPQUAD(exp->tuple.dst.ip), ntohs(exp->tuple.dst.u.tcp.port));	return 0;}/**************************************************************************** * This conntrack expect function replaces ip_conntrack_q931_expect() * which was set by ip_conntrack_helper_h323.c. ****************************************************************************/static void ip_nat_q931_expect(struct ip_conntrack *new,			       struct ip_conntrack_expect *this){	struct ip_nat_range range;	if (this->tuple.src.ip != 0) {	/* Only accept calls from GK */		ip_nat_follow_master(new, this);		goto out;	}	/* This must be a fresh one. */	BUG_ON(new->status & IPS_NAT_DONE_MASK);	/* Change src to where master sends to */	range.flags = IP_NAT_RANGE_MAP_IPS;	range.min_ip = range.max_ip = new->tuplehash[!this->dir].tuple.src.ip;	/* hook doesn't matter, but it has to do source manip */	ip_nat_setup_info(new, &range, NF_IP_POST_ROUTING);	/* For DST manip, map port here to where it's expected. */	range.flags = (IP_NAT_RANGE_MAP_IPS | IP_NAT_RANGE_PROTO_SPECIFIED);	range.min = range.max = this->saved_proto;	range.min_ip = range.max_ip =	    new->master->tuplehash[!this->dir].tuple.src.ip;	/* hook doesn't matter, but it has to do destination manip */	ip_nat_setup_info(new, &range, NF_IP_PRE_ROUTING);      out:	ip_conntrack_q931_expect(new, this);}/****************************************************************************/static int nat_q931(struct sk_buff **pskb, struct ip_conntrack *ct,		    enum ip_conntrack_info ctinfo,		    unsigned char **data, TransportAddress * addr, int idx,		    u_int16_t port, struct ip_conntrack_expect *exp){	struct ip_ct_h323_master *info = &ct->help.ct_h323_info;	int dir = CTINFO2DIR(ctinfo);	u_int16_t nated_port = port;	u_int32_t ip;	/* Set expectations for NAT */	exp->saved_proto.tcp.port = exp->tuple.dst.u.tcp.port;	exp->expectfn = ip_nat_q931_expect;	exp->dir = !dir;	/* Check existing expects */	if (info->sig_port[dir] == port)		nated_port = info->sig_port[!dir];	/* Try to get same port: if not, try to change it. */	for (; nated_port != 0; nated_port++) {		exp->tuple.dst.u.tcp.port = htons(nated_port);		if (ip_conntrack_expect_related(exp) == 0)			break;	}	if (nated_port == 0) {	/* No port available */		if (net_ratelimit())			printk("ip_nat_ras: out of TCP ports\n");		return 0;	}	/* Modify signal */	if (set_h225_addr(pskb, data, 0, &addr[idx],			  ct->tuplehash[!dir].tuple.dst.ip,			  nated_port) == 0) {		/* Save ports */		info->sig_port[dir] = port;		info->sig_port[!dir] = nated_port;		/* Fix for Gnomemeeting */		if (idx > 0 &&		    get_h225_addr(*data, &addr[0], &ip, &port) &&		    (ntohl(ip) & 0xff000000) == 0x7f000000) {			set_h225_addr_hook(pskb, data, 0, &addr[0],					   ct->tuplehash[!dir].tuple.dst.ip,					   info->sig_port[!dir]);		}	} else {		ip_conntrack_unexpect_related(exp);		return -1;	}	/* Success */	DEBUGP("ip_nat_ras: expect Q.931 %u.%u.%u.%u:%hu->%u.%u.%u.%u:%hu\n",	       NIPQUAD(exp->tuple.src.ip), ntohs(exp->tuple.src.u.tcp.port),	       NIPQUAD(exp->tuple.dst.ip), ntohs(exp->tuple.dst.u.tcp.port));	return 0;}/****************************************************************************/static int __init init(void){	BUG_ON(set_h245_addr_hook != NULL);	BUG_ON(set_h225_addr_hook != NULL);	BUG_ON(set_sig_addr_hook != NULL);	BUG_ON(set_ras_addr_hook != NULL);	BUG_ON(nat_rtp_rtcp_hook != NULL);	BUG_ON(nat_t120_hook != NULL);	BUG_ON(nat_h245_hook != NULL);	BUG_ON(nat_q931_hook != NULL);	set_h245_addr_hook = set_h245_addr;	set_h225_addr_hook = set_h225_addr;	set_sig_addr_hook = set_sig_addr;	set_ras_addr_hook = set_ras_addr;	nat_rtp_rtcp_hook = nat_rtp_rtcp;	nat_t120_hook = nat_t120;	nat_h245_hook = nat_h245;	nat_q931_hook = nat_q931;	DEBUGP("ip_nat_h323: init success\n");	return 0;}/****************************************************************************/static void __exit fini(void){	set_h245_addr_hook = NULL;	set_h225_addr_hook = NULL;	set_sig_addr_hook = NULL;	set_ras_addr_hook = NULL;	nat_rtp_rtcp_hook = NULL;	nat_t120_hook = NULL;	nat_h245_hook = NULL;	nat_q931_hook = NULL;	synchronize_net();}/****************************************************************************/module_init(init);module_exit(fini);MODULE_AUTHOR("Jing Min Zhao <zhaojingmin@users.sourceforge.net>");MODULE_DESCRIPTION("H.323 NAT helper");MODULE_LICENSE("GPL");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -