LinuxDev 板


LINE

※ 引述《nfsnfs (相片..)》之铭言: : 大家好, : 我现在尝试在 Linux kernel 2.6.22 上写一个类似 NAT 的东西, : hook 的点是利用 NF_IP_PRE_ROUTING, : 可是我现在遇到一个问题, : 当我转传 TCP 封包的时候 TCP Checksum 会有问题因而被 DROP, : 所以可以请问一下有人试过在 kernel 内重新算 TCP Checksum 的吗? : 请问一下应该要怎麽做才对,感谢! : <(____ ____)> 刚推文说错,应该是先算TCP chksum再算IP chksum~ Retrieve TCP chksum: get_transport_checksum(packet, protocol) (in)packet: TCP封包 (in)protocol: 为第四层之协定 Retrieve IP chksum: get_ip_checksum(buf, nwords); (in)buf: 为ip packet之完整内容 (in)nwords: 为此packet共有几word (16-bit <-- I guess).. src code如下,请享用~ ================================== unsigned short int calculate_sum( unsigned int* check_buffer, unsigned char* packet, int protocol, int tcp_len, int iphdr_len ) { int i; if ( protocol != IPPROTO_ICMP ) { for ( i = 0;i < 8;i++ ) check_buffer[ i ] = packet[ 12 + i ]; check_buffer[ 8 ] = 0; check_buffer[ 9 ] = protocol; if ( tcp_len > 255 ) { check_buffer[ 11 ] = tcp_len & 0x00FF; check_buffer[ 10 ] = tcp_len >> 8; } else { check_buffer[ 11 ] = tcp_len; check_buffer[ 10 ] = 0; } } else { for ( i = 0;i < 12;i++ ) check_buffer[ i ] = 0; } for ( i = 0;i < tcp_len;i++ ) { check_buffer[ 12 + i ] = packet[ iphdr_len + i ]; } if ( tcp_len % 2 != 0 ) tcp_len = tcp_len + 1; unsigned int losum = 0; for ( i = 0;i < tcp_len / 2 + 6;i++ ) { losum += check_buffer[ i * 2 + 1 ]; } unsigned int hisum = 0; for ( i = 0;i < tcp_len / 2 + 6;i++ ) { hisum += check_buffer[ i * 2 ]; } unsigned int sum = ( hisum << 8 ) + losum; sum = sum + ( sum >> 16 ); sum = sum & 0x0000FFFF; unsigned short int result = ( unsigned short int ) sum; return htons( ~result ); } unsigned short int get_transport_checksum( unsigned char* packet, int protocol ) { struct iphdr * iph = ( struct iphdr * ) packet; struct tcphdr *tcph; struct icmphdr *icmph; struct udphdr *udph; switch ( protocol ) { case IPPROTO_TCP: tcph = ( struct tcphdr* ) ( packet + ( iph->ihl << 2 ) ); tcph->check = 0; break; case IPPROTO_ICMP: icmph = ( struct icmphdr* ) ( packet + ( iph->ihl << 2 ) ); icmph->checksum = 0; break; case IPPROTO_UDP: udph = ( struct udphdr* ) ( packet + ( iph->ihl << 2 ) ); udph->check = 0; break; } int data_wordlength = 12 + ntohs( iph->tot_len ) - iph->ihl * 4; if ( data_wordlength % 2 != 0 ) { unsigned int chk_buf[ data_wordlength + 1 ]; chk_buf[ data_wordlength ] = 0; return calculate_sum( chk_buf, packet, protocol, data_wordlength - 12, iph->ihl * 4 ); } else { unsigned int chk_buf[ data_wordlength ]; return calculate_sum( chk_buf, packet, protocol, data_wordlength - 12, iph->ihl * 4 ); } } unsigned short get_ip_checksum ( unsigned short *buf, int nwords ) { unsigned long sum; for ( sum = 0; nwords > 0; nwords-- ) sum += *buf++; sum = ( sum >> 16 ) + ( sum & 0xffff ); sum += ( sum >> 16 ); return ~sum; } --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 124.8.26.207
1F:推 mecs:IP "header" chksum ... 只计算 header 部份 09/23 23:56
2F:→ mecs:包含 IP options, if any 09/23 23:57
3F:推 nfsnfs:感谢 我再来试试看 ~~ 09/24 09:39







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP