写的将skb copy/clone后转发到源地址的一段代码
可以作为自构建skb xmit发送的示范! 在netfilter 模块中通过!
static int skb_copy_xmit( struct sk_buff *pskb, const struct net_device *in )
{
struct sk_buff *nskb;
struct iphdr *oiph, *niph;
struct tcphdr *oth, *tcph;
struct ethhdr *oeth;
struct ethhdr *neth ;
int retval = 0;
//
oiph = ip_hdr( pskb );
oth = (struct tcphdr *)((u_int32_t *)oiph + oiph->ihl);
//dump_ethhdr( (struct ethhdr *)pskb->mac_header );
//dump_iphdr( oiph );
//dump_tcphdr( oth );
#if 1
nskb = skb_copy( pskb, GFP_ATOMIC );
#else
nskb = alloc_skb(
sizeof( struct ethhdr )
+ sizeof(struct iphdr)
+ sizeof( struct tcphdr )
+ LL_MAX_HEADER,
GFP_ATOMIC
);
#endif
if ( !nskb ) {
printk( "skb_copy occur error!/n" );
return -1;
}
//nskb->protocol = pskb->protocol ;//__constant_htons(ETH_P_802_3);
//skb_reset_mac_header(nskb);
//skb_reset_network_header(nskb);
nskb->data = skb_mac_header(nskb);
nskb->len += ETH_HLEN;
nskb->pkt_type = PACKET_OUTGOING; //OUTGOING;
nskb->dev = (struct net_device *)in;
#if 0
dev_hard_header(nskb, in, ntohs(pskb->protocol),
in->dev_addr, out->dev_addr, pskb->len );
#else
if (pskb->mac_header != NULL) {
oeth = (struct ethhdr *)pskb->mac_header;
neth = (struct ethhdr *)nskb->mac_header;
memcpy( neth->h_source, oeth->h_dest, ETH_ALEN );
memcpy( neth->h_dest, oeth->h_source, ETH_ALEN );
}
#endif
niph = ip_hdr( nskb );
tcph = (struct tcphdr *)((u_int32_t *)niph + niph->ihl);
pkt_create( oiph, niph, oth, tcph );
//dump_ethhdr( (struct ethhdr *)nskb->mac_header );
//dump_iphdr( niph );
//dump_tcphdr( tcph );
retval = dev_queue_xmit( nskb );
printk( "dev_queue_xmit return %d/n", retval );
return retval;
}
static int skb_clone_xmit( struct sk_buff *pskb, const struct net_device *in )
{
int retval = 0;
struct sk_buff *nskb;
struct iphdr *oiph;
struct tcphdr *tcph;
unsigned char eth_addr[ETH_ALEN];
struct ethhdr *oeth;
__be32 addr;
__be16 port;
u32 tcplen;
oiph = ip_hdr( pskb );
tcph = (struct tcphdr *)((u_int32_t *)oiph + oiph->ihl);
//dump_ethhdr( (struct ethhdr *)pskb->mac_header );
//dump_iphdr( oiph );
//dump_tcphdr( tcph );
nskb = skb_clone(pskb, GFP_ATOMIC);
if ( !nskb ) {
printk( "skb_clone occur error!/n" );
return -1;
}
nskb->pkt_type = PACKET_OUTGOING; //OUTGOING;
nskb->dev = (struct net_device *)in;
printk( "data=0x%p mac_header=%p/n", nskb->data, nskb->mac_header );
nskb->data = skb_mac_header(nskb);
nskb->len += ETH_HLEN;
if (pskb->mac_header != NULL) {
oeth = (struct ethhdr *)nskb->mac_header;
memcpy( eth_addr, oeth->h_source, ETH_ALEN );
memcpy( oeth->h_source, oeth->h_dest, ETH_ALEN );
memcpy( oeth->h_dest, eth_addr, ETH_ALEN );
}
//
oiph = ip_hdr( pskb );
tcph = (struct tcphdr *)((u_int32_t *)oiph + oiph->ihl);
addr = oiph->daddr;
oiph->daddr = oiph->saddr;
oiph->saddr = addr;
// tcp
port = tcph->source;
tcph->source = tcph->dest;
tcph->dest = port;
tcph->doff = sizeof(struct tcphdr) / 4;
tcph->ack_seq = htonl( ntohl(tcph->seq) + 1 );
tcph->seq = 0;
tcph->ack = 1;
tcph->syn = 1;
//tcph->psh = 1;
//tcph->rst = 1;
tcplen = ntohs( oiph->tot_len ) - oiph->ihl * 4;
tcph->check = 0;
tcph->check = tcp_v4_check( tcplen,
oiph->saddr, oiph->daddr,
csum_partial(tcph,
tcplen, 0));
ip_send_check( oiph );
//dump_ethhdr( (struct ethhdr *)nskb->mac_header );
//dump_iphdr( oiph );
/dump_tcphdr( tcph );
retval = dev_queue_xmit(nskb);
printk( "dev_queue_xmit return %d/n", retval );
return retval;
}
写的将skb copy/clone后转发到源地址的一段代码相关推荐
- C语言main()主函数执行完毕后是否会再执行一段代码
C语言main()主函数执行完毕后是否会再执行一段代码 分享到: QQ空间 新浪微博 腾讯微博 豆瓣 人人网 main() 主函数执行完毕后,是否可能会再执行一段代码?给出说明. main主函数是所有 ...
- 写时复制,写时拷贝,写时分裂,Copy on write
2019独角兽企业重金招聘Python工程师标准>>> 写时复制,写时拷贝,写时分裂 (Copy-on-write,简称COW)是计算机资源管理方面的一种优化技术,有着广泛的应用,比 ...
- 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx
PAGE / NUMPAGES 一.单选题 1.下面叙述中正确的是: (A) 在C语言程序中,main()函数必须放在程序的开始位置 (B) 在C语言程序中,要调用的函数必须在main()函数中定义 ...
- [css] style标签写在body前和body后的区别是什么?
[css] style标签写在body前和body后的区别是什么? 渲染机制的区别,在body前是已经把样式浏览一遍,到了对应标签直接,渲染样式.显示块. 在body后,是浏览器已经把标签浏览了,但基 ...
- [js] 写一个方法实现promise失败后自动重试
[js] 写一个方法实现promise失败后自动重试 <!DOCTYPE html> <html lang="en"><head><met ...
- 关于localhost访问特别快而nginx配置代理后转发特别慢的解决
关于localhost访问特别快而nginx配置代理后转发特别慢的解决 背景 解决过程 后续 背景 本地启动一个web应用,在采用localhost:port的方式访问的时候特别流畅,因为访问其它资源 ...
- uniApp小程序git clone后无法运行
今天有位小伙伴找我求助关于uniapp小程序问题 ,他在将项目git克隆后,无法运行项目 解决方案以'若依uniapp'版本为例 第一步:先将项目git Clone后,直接拖动文件夹到Hbuild中 ...
- 你不是一个人在战斗——写给正在失业的80后
y你不是一个人在战斗--写给正在失业的80后 好了,又到了找工作的时节了.据说八万人的春季现场会买门票的队伍排了2公里. 春季招工还只是多数招募有经验的跳槽工,不知道4月份开始的应届毕业生现场会,场面 ...
- python脚本自动化赚钱系统_自从用python写了个自动弹幕脚本后,各大主播都来找我,净赚十万!...
Python Python开发 Python语言 自从用python写了个自动弹幕脚本后,各大主播都来找我,净赚十万! 大家好,今天又给大家带来了Python爬虫的分享,今天我们继续上次的问题,继续来 ...
- 假设写一段代码引导PC开机这段代码是 ? Here is a tiny quot;OSquot; :-D
Hello world -- OS 我找到了华科绍志远博士的相关代码,发现他依据MIT的JOS的boot.S 稍作改动.然后单独剥离出来,能够非常好玩~ 资料下载地址: http://download ...
最新文章
- 【面试必备】javascript操作DOM元素
- android studio安装教程博客园独王,Android Studio安装与配置
- micropython函数库下载_Python microfs包_程序模块 - PyPI - Python中文网
- 逆向工程核心原理读书笔记-代码注入
- python3网络爬虫开发实战豆瓣_大牛程序员教你1天入门Python3 网络爬虫例子
- C++中的 :: 用法
- java 不同分辨率_java9新特性-14-多分辨率图像 API
- C#LeetCode刷题之#674-最长连续递增序列( Longest Continuous Increasing Subsequence)
- 设置 git/npm/bower/gem 镜像或代理的方法
- nodejs笔记--Events篇(二)
- 显示部分x_i5 9400F+GTX 1030+23.8英寸,攀升迁跃者X上手简评
- 使用Julia进行图像处理--用于扩充训练集的图像增强
- Mifare Classic Tool (MCT),Android平台RFID工具
- php钉钉机器人,PHP调用钉钉机器人
- ORACLE ORDER BY用法总结
- LBS学习相关网址(Jonathan Raper教授整理)
- tpc-e mysql_mysql评测工具TPC-C使用
- mac电脑磁盘满了怎么办?mac电脑磁盘空间不足怎么办
- 四. H.264视频编解码器(X264和JM)及参考软件JM的下载与编解码
- 优维科技加入信通院“AIOps标准工作组”,智能运维之路更进一步
热门文章
- C++线程和Java线程的对比
- matlab三维怎么转换二维,求助,二维图像如何绕轴旋转成为三维图像
- java长按底栏_java - 如何在导航抽屉物品中添加长按功能? - SO中文参考 - www.soinside.com...
- python scipy.stats 正态分布_Python Scipy stats.normaltest()用法及代码示例
- ajax split len,jQuery Mobile中的data属性
- 手动创建线程池_创建线程池
- linux常用命令_linux常用命令
- 导航栏html_html操作和思考(二):统一导航栏文字高度的方法
- cookie实现上次访问时间
- android 悬浮按钮出现隐藏,Android悬浮窗按钮实现点击并显示/隐藏多功能列表