首页 > 其他分享 >udp的收发包的思考

udp的收发包的思考

时间:2024-05-31 15:12:01浏览次数:24  
标签:udp dst sock dev sk 收发 思考 skb iph

  在测试radius 性能时,想到一个问题,以前tcp报文在ip层处理时,涉及到路由查找,

对于tcp协议报文;skb中没有路由缓存,没有关联的sock;且非分片报文;ip_early_demux设置为true;则调用early_demux函数提前在IP层做established状态的sock查找,并负责将sock结构体成员sk_rx_dst的路由缓存赋值给skb成员_skb_refdst;

TCP入口路由缓存设置时间点如下:

a)作为服务端,三次握手完成时,在函数tcp_v4_syn_recv_sock中创建子sock时赋值;
b)作为客户端在函数tcp_finish_connect;
c)在函数tcp_rcv_established中sock处于established状态时,更新其值--->在tcp_rcv_established函数中已经将输入路由缓存在了sk_rx_dst中,所以early_demux可以通过一次sock查找,同时找到缓存的路由项;

复制代码
struct sock *tcp_v4_syn_recv_sock()
{
    newsk = tcp_create_openreq_child(sk, req, skb);
    inet_sk_rx_dst_set(newsk, skb);
}
void tcp_finish_connect()
{
    //IPv4v6两个回调函数inet_sk_rx_dst_set与inet6_sk_rx_dst_set
    if (skb)
        icsk->icsk_af_ops->sk_rx_dst_set(sk, skb);
}
void tcp_rcv_established()
{
    if (unlikely(!sk->sk_rx_dst))
        inet_csk(sk)->icsk_af_ops->sk_rx_dst_set(sk, skb);
}

对于UDP协议,对于先查找 对应目标的 sk,先关联skb 和sk,在判断DST_NOCACHE标志,如果成立,增加dst引用计数,设置skb的dst;否则,调用skb_dst_set_noref直接进行设置。

参考之前文章

目前radius 主机主要是处理本机到设备之间的udp报文。那是不是可以针对udp 1812 udp1813 做个特殊的定制???

udp_v4_early_demux 处理中提取针对udp 1812  1813的逻辑处理?其余的udp报文就走正常逻辑了!!

int udp_v4_early_demux(struct sk_buff *skb)
{
	struct net *net = dev_net(skb->dev);
	struct in_device *in_dev = NULL;
	const struct iphdr *iph;
	const struct udphdr *uh;
	struct sock *sk = NULL;
	struct dst_entry *dst;
	int dif = skb->dev->ifindex;
	int sdif = inet_sdif(skb);
	int ours;

	/* validate the packet */
	if (!pskb_may_pull(skb, skb_transport_offset(skb) + sizeof(struct udphdr)))
		return 0;

	iph = ip_hdr(skb);
	uh = udp_hdr(skb);

	if (skb->pkt_type == PACKET_MULTICAST) {
		in_dev = __in_dev_get_rcu(skb->dev);

		if (!in_dev)
			return 0;

		ours = ip_check_mc_rcu(in_dev, iph->daddr, iph->saddr,
				       iph->protocol);
		if (!ours)
			return 0;

		sk = __udp4_lib_mcast_demux_lookup(net, uh->dest, iph->daddr,
						   uh->source, iph->saddr,
						   dif, sdif);
	} else if (skb->pkt_type == PACKET_HOST) {
		sk = __udp4_lib_demux_lookup(net, uh->dest, iph->daddr,
					     uh->source, iph->saddr, dif, sdif);
	}

	if (!sk || !refcount_inc_not_zero(&sk->sk_refcnt))
		return 0;

	skb->sk = sk;
	skb->destructor = sock_efree;
	dst = READ_ONCE(sk->sk_rx_dst);

	if (dst)
		dst = dst_check(dst, 0);
	if (dst) {
		u32 itag = 0;

		/* set noref for now.
		 * any place which wants to hold dst has to call
		 * dst_hold_safe()
		 */
		skb_dst_set_noref(skb, dst);

		/* for unconnected multicast sockets we need to validate
		 * the source on each packet
		 */
		if (!inet_sk(sk)->inet_daddr && in_dev)
			return ip_mc_validate_source(skb, iph->daddr,
						     iph->saddr, iph->tos,
						     skb->dev, in_dev, &itag);
	}
	return 0;
}

 

标签:udp,dst,sock,dev,sk,收发,思考,skb,iph
From: https://www.cnblogs.com/codestack/p/18224610

相关文章

  • 大龄程序员思考
    视觉AI很难做近来一直在从事AI视觉检测方面的工作,外行人可能觉得挺厉害,实际上这钱挣得基本等于搬砖近两年以来,行业不景气、制造业利润上不去,那么在这个产业链中,老板就没有余钱来进行升级改造。老板们是否愿意花钱投入视觉检测,一是老板的认知、二是是否有足够的资金实力;就算最......
  • 三、Linux系统收发网络包
    学习自[小林coding]学习自小林coding仅用来学习。网络模型OSI网络模型:开放式系统互联通信参考模型使得多种设备能通过网络相互通信,和为了解决各种不同设备在网络互联中的兼容性问题。TCP/IP模型更为常见。应用层:负责向用户提供一组应用程序,如HTTP\DNS\FTP传输层:负责端到端......
  • 从 .NET 到 C++:集合处理的思考
    1.IEnumerable与List的比较在.NET中,IEnumerable和List是两种常用的集合类型,它们有各自的适用场景:IEnumerable<T>:优点:惰性求值,仅在迭代时计算,适用于大数据集或流式数据处理。缺点:不能进行索引访问,没有直接的添加或移除元素的方法。List<T>:优点:支持索引访问,具备......
  • stm8系列--usart收发
     voidmain(void){Init_UART1();Init_Timer4();enableInterrupts();while(1){if(myusart.reflag>0){Com_Handle();//收到什么回复什么;myusart.recount=0;myusart.reflag=0;......
  • 《计算机网络微课堂》5-3 UDP和TCP的对比
    本节课我们将从几个方面对比UDP和TCP。UDP和TCP是TCP/IP体系结构运输层中的两个重要协议,如图所示,这是我们之前课程中介绍过的TCP/IP体系结构,它的运输层有两个非常重要的协议UDP和TCP。在使用TCP/IP体系结构的网络通信中,这两个协议的使用频率仅次于往基层的IP协......
  • UDP网络聊天室(更)
    服务器端#include<header.h>typedefstructnode{ charname[20]; structsockaddr_incli_addr; structnode*next;}node,*node_p;typedefstructmsg{ chartype; charname[20]; chartext[128];}msg;node_pcreate_link(){ node_pH=(node_p)malloc(s......
  • TCP和UDP协议的特点和用途
    TCP(TransmissionControlProtocol):特点:面向连接、可靠传输、按序交付、流量控制、拥塞控制。用途:适用于需要高可靠性的数据传输,如网页浏览、电子邮件、文件传输等。优势:数据包顺序和完整性有保障,适合需要准确无误传输数据的场景。举例:在线购物网站的交易数据传输,确保每笔交易......
  • 关于ADT的一些思考
    ADT基本概念1.什么是ADT?抽象数据类型(AbstractDataType,ADT)是将数据对象,数据对象之间的关系和数据对象的基本操作封装在一起的一种表达方式,是用于简化描述抽象算法,分类与评价数据结构,形式描述程序设计语言的类型系统。在ADT设计时,首先要考虑对不可变类型的满足,虽然不可变类型......
  • 人生思考---公司不养闲人
    任何一家公司的辉煌不过20-30年,公司的辉煌皆存在时代属性,从公司到个人,个人的职业生涯同样如此;-------------------------------------------------------------------------------------------------------------------------------学习技术?技术的迭代是快速的,当前是以轻微的技......
  • LLCC68低功耗Sub-GHz LoRa射频收发器LLCC68IMLTRT
    目录·LLCC68简介·主要特性·射频开关参考原理图·应用领域LLCC68简介LLCC68是一款Sub-GHzLoRa射频收发器,适用于中距离室内以及室内到室外的无线应用。支持SPI接口。与SX1262的引脚兼容,专为延长电池寿命而设计,有效接收电流消耗低至4.2mA。SX1261、SX1262、SX1268和LLCC68是专......