Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101454266
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-04-28 22:37:24

 
文章来源ChinaITLab收集整理 

 

格式:static __inline __void __ip_masq_put(struct ip_masq *ms)

返回值:无

处理流程:

1. 将ms的访问计数减一。

(9)get_next_mport

格式:static __u16 get_next_mport(void)

返回值:返回一个16位的端口号。

处理流程:

1. 为masq_mport_lock加旋转锁。

2. Mport = htons(masq_port ++)。

3. 如果masq_port是最后一个锁,则masq_port = 开始锁。

4. 解旋转锁masq_port_lock。

5. 返回mport。

(10)ip_masq_new

格式:struct ip_masq *ip_masq_new(int proto, __u32 maddr, __u16 mport, __u32 saddr, __u16 sport, __u32 daddr, __u16 dport, unsigned mflags)

返回值:成功:返回ms;失败:返回null。

处理流程:

1. 如果没有可用端口,返回NULL。

2. 若mflags 设IP_MASQ_F_USER位,则 prio = GFP_KERNEL;不然, prio=GFP_ATOMIC。

3. 为ms分配空间,若失败,返回NULL。

4. MOD_INC_USE_CONUNT。

5. 清空ms。

6. 初始化ms->timer。

7. ms->timer.data = (unsigned long)ms;

ms->timer.function = masq_expire;

ms->protocol = proto;

ms->saddr = saddr;

ms->sport = sport;

ms->daddr = daddr;

ms->dport = dport;

ms->flags = NULL;

ms->app_data = NULL;

ms->control = NULL;

设ms->n_control 为0;

设ms->refcnt 为0;

ms->maddr = maddr;

ms->flags设IP_MASQ_F_NO_REPLY位。

8. 如果((不是TCP 和UDP)|| mport),ms的伪装端口设为mport。调用__ip_masq_in_get取得ms。

9. 如果没有匹配的ms,则ms->flags设 IP_MASQ_F_MPORT位;增加伪装端口计数;将ms加入HASH队列;调用ip_masq_bind_app(ms);ms的访问计数加一;为ms的IP_MASQ_S_NONE状态设置超时;返回ms。

10. 如果有匹配项,则调用__ip_masq_put(mst)使访问计数减一;释放ms; MOD_DEC_USE_COUNT;返回NULL。

11. 调用mport = get_next_mport()来找一个可用的端口。

12. 赋值 ms->mport = mport。

13. 调用ip_masq_bind_app(ms)。

14. 设n_fails为0。

15.ms的访问计数增一。

16.为ms的IP_MASQ_S_NONE设置超时。

17.返回ms。

(11)ip_fw_masquerade

格式:int ip_masquerade(struct sk_buff **skb_p, __u32 maddr)

返回值:成功:返回大于0的数;失败:返回-1。

处理流程:

1. 先做一些有关校验和的检查。

2. 调用ip_masq_out_get_iph看入口是否已经存在。

3. 如果入口存在的话,将老的ms从HASH表中删除,将ms->maddr替换为maddr,并将新的ms结构加入HASH队列。

4. 如果没有定义源端口,做以下几步:将老的ms从HASH表中删除,设置ms->sport =h.portp[0],即设置ms的源端口为TCP头中的源端口,将新的ms加入HASH表。

5. 如果定义了IP_MASQ_F_DLOOSE,ms->dport = h .port[1]; ms->daddr = iph->daddr。

6. 如果入口不存在则创建一个新的ms。

7. 将IP头的源地址替换为平衡器的ip地址。

8. 将TCP头的源端口替换为ms的伪装端口。

9. 做一些有关校验和的操作。

10. ms的访问计数减一。

11. 返回0。

(12)ip_fw_demasquerade

格式: int ip_fw_demasquerade(struct sk_buff **skb_p)

返回值:成功:返回1;失败:返回-1。

处理流程:

1. 取得sk_buff中的数据取的起始地址。

2. 取得数据区的大小。

3. 取得针对的偏移量。

4. Maddr = iph->daddr。

5.察看类型,如果是ICMP,则调用ip_fw_demasq_icmp;如果是TCP,什么也不做;如果是UDP协议,则首先确认端口号在BEGIN 和END之间,然后对校验和进行一定的操作。

6. 看现有表中是否有匹配项,返回ms。

7.如果有匹配项,设置标识位~IP_MASQ_F_NO_REPLY;如果定义了非严格,则ms->dport = h.portp[0], ms->daddr = iph_saddr。

8. 如果定义了IP_MASQ_F_NO_DPORT,则标识位设~IP_MASQ_F_DPORT, ms的目的端口设为TCP头中的源端口。

9.如果定义了IP_MASQ_F_NO_DADDR,ms的标识位设~IP_MASQ_F_NO_DADDR,ms的目标地址设为IP头的源地址。

10. 调用masq_skb_cow复制一个skb。

11. 将IP头的目标地址设为ms的源地址。

12. 将TCP头中的目标端口设为ms的源端口。

13. 调用ip_masq_app_pkt_in。

14. 对校验和进行操作。

15. 调用ip_send_check(iph)。

16. 调用masq_set_state(ms, 0 , iph, h.portp )。

17. ms的访问计数减一。

18. 返回1。

阅读(254) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~