首页 > 其他分享 >发送IP封包到高层协议

发送IP封包到高层协议

时间:2023-06-01 10:34:57浏览次数:40  
标签:rt 封包 struct IP 发送 ip skb protocol net

int ip_local_deliver(struct sk_buff *skb) 

 { 

/* 

* 
 Reassemble IP fragments. 

*/ 

struct net *net = dev_net(skb->dev); 



if (ip_is_fragment(ip_hdr(skb))) { 

if (ip_defrag(net, skb, IP_DEFRAG_LOCAL_DELIVER)) 

return 0; 

} 



return NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_IN, 

      net, NULL, skb, skb->dev, NULL, 

      
 ip_local_deliver_finish); 
}

 struct rtable *rt_dst_alloc(struct net_device *dev,
   unsigned int flags, u16 type,
   bool nopolicy, bool noxfrm, bool will_cache)
 {
struct rtable *rt;


rt = dst_alloc(&ipv4_dst_ops, dev, 1, DST_OBSOLETE_FORCE_CHK,
      (will_cache ? 0 : (DST_HOST | DST_NOCACHE)) |
      (nopolicy ? DST_NOPOLICY : 0) |
      (noxfrm ? DST_NOXFRM : 0));


if (rt) {
rt->rt_genid = rt_genid_ipv4(dev_net(dev));
rt->rt_flags = flags;
rt->rt_type = type;
rt->rt_is_input = 0;
rt->rt_iif = 0;
rt->rt_pmtu = 0;
rt->rt_gateway = 0;
rt->rt_uses_gateway = 0;
rt->rt_table_id = 0;
INIT_LIST_HEAD(&rt->rt_uncached);


rt->dst.output = ip_output;
if (flags & RTCF_LOCAL)
rt->dst.input =  ip_local_deliver;
}


return rt;
 }
 static int ip_local_deliver_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
 {
__skb_pull(skb, skb_network_header_len(skb));


rcu_read_lock();
{
int protocol = ip_hdr(skb)->protocol;
const struct net_protocol *ipprot;
int raw;


resubmit:
raw = raw_local_deliver(skb, protocol);


ipprot = rcu_dereference(inet_protos[protocol]);
if (ipprot) {
int ret;


if (!ipprot->no_policy) {
if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
kfree_skb(skb);
goto out;
}
nf_reset(skb);
}
ret = ipprot->handler(skb);
if (ret < 0) {
protocol = -ret;
goto resubmit;
}
__IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
} else {
if (!raw) {
if (xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
__IP_INC_STATS(net, IPSTATS_MIB_INUNKNOWNPROTOS);
icmp_send(skb, ICMP_DEST_UNREACH,
 ICMP_PROT_UNREACH, 0);
}
kfree_skb(skb);
} else {
__IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
consume_skb(skb);
}
}
}
  out:
rcu_read_unlock();


return 0;
 }
static const struct net_protocol tcp_protocol  = {
.early_demux  = tcp_v4_early_demux,
.handler = tcp_v4_rcv,
.err_handler  = tcp_v4_err,
.no_policy  = 1,
.netns_ok  = 1,
.icmp_strict_tag_validation = 1,
 };


static const struct net_protocol udp_protocol = {
.early_demux = udp_v4_early_demux,
.handler = udp_rcv,
.err_handler = udp_err,
.no_policy =  1,
.netns_ok =  1,
 };


static const struct net_protocol icmp_protocol = {
.handler = icmp_rcv,
.err_handler = icmp_err,
.no_policy =  1,
.netns_ok =  1,
 };

标签:rt,封包,struct,IP,发送,ip,skb,protocol,net
From: https://blog.51cto.com/u_11860992/6392712

相关文章

  • proxifier 设置代理转发 对于IP地址的转发 也可以指定 这下C2裸IP的伪造可以做了
    proxifier支持应用名或者IP端口直接转发:如下是示例   例如在恶意代码分析实战的实验里,看到恶意软件使用svchost发送网络请求:  我的proxifier设置如下:  然后使用nc伪造c2即可!80的可以用inetsim。 ......
  • IPD
    原帖:https://blog.csdn.net/qq_39567970/article/details/125000167 一、原理介绍1.现有方法由于转子的初始位置是随机的,而且矢量控制对于转子的位置要求很高,所以初始位置的检测精度会影响伺服电机的启动效果。我们现有的的检测方法是基于HALL传感器将初始位置划分成了六......
  • 博学谷学习记录】超强总结,用心分享 | 发送邮件-yagmail
    【博学谷IT技术支持】一、介绍yagmail是一个GMAIL/SMTP客户端,旨在使发送电子邮件尽可能简单。在项目中或多或少都需要使用的它,比如监控,比如用户提示等。二、项目使用使用流程首先要安装yagmail其次链接邮箱服务器,这里要设置发件人的邮箱,发件人的邮箱授权码,发件服务器等参......
  • Eclipse的安装与使用
    相信大家在用记事本编译运行java程序的同时肯定心里有不少怨言吧,要是用这种工具编译一个复杂点的程序简直就有想死的心了,更不用说什么大的网站项目了。接下来阿Q就带领大家了解一个全新的编译工具Eclipse。Eclipse的安装首先进入eclipse的官方网站http://eclipse.org/(org是非盈利......
  • JavaScript原生实现《贪吃蛇》
    概述JavaScript原生实现《贪吃蛇》,每吃掉一个食物,蛇的身体会变长,食物会重新换位置。详细贪吃蛇大家都不陌生吧~简单做一个。一、思路1.让我们的小蛇动起来2.随机生成食物3.每吃掉一个食物,蛇的身体会变长,食物会重新换位置html界面<divclass="face"><!--小蛇移......
  • Javascript --常用技巧
    1)使用!!将变量转换成布尔类型有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将它们的值视为true。对于做这样的检查,你可以使用||(双重否定运算符),它能自动将任何类型的数据转换为布尔值,只有这些变量才会返回false:0,null,"",undefined或NaN,其他的都返回true。我们来看看......
  • JavaScript中几种 获取元素的方式
    1.根据id获取元素document.getElementById("id属性的值");2.根据标签名字获取元素document.getElementsByTagName("标签的名字");3.根据name属性的值获取元素document.getElementsByName("name属性的值");4.根据类样式的名字获取元素document.getElementsByClassName("类样式的名......
  • javascript 的 事件类型(事件)
    事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行。事件是文档或者浏览器窗口中发生的,特定的交互瞬间。事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字。事件是javaScript和DOM之间交互的桥梁。你若触发,我便执行——事件发生,调用......
  • 启动HBase时提示SLF4J: Class path contains multiple SLF4J bindings的解决方法
    启动hbase报错:“SLF4J:ClasspathcontainsmultipleSLF4Jbindings.”解决方法cd/home/opt/hbase-2.2.3/lib/client-facing-thirdpartymvslf4j-log4j12-1.7.25.jarslf4j-log4j12-1.7.25-copy修改了hbase中的文件名,保留了hadoop的,这个会有问题,一个当启动hbase的reg会报错这......
  • GZIPUtils工具类
    GZIPUtils.java工具类importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.util.zip.GZIPInputStream;importjava.util.zip.GZIPOutputStream;importorg.apache.commons.codec.binary.StringUtils;pub......