⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mydatagram.c

📁 一个基于linux的TCP/IP协议栈的实现
💻 C
字号:
static inline int myip_route_connect(struct rtable **rp, u32 dst,				   u32 src, u32 tos, int oif, u8 protocol,				   u16 sport, u16 dport, struct sock *sk){	struct flowi fl = { .oif = oif,			    .nl_u = { .ip4_u = { .daddr = dst,						 .saddr = src,						 .tos   = tos } },			    .proto = protocol,			    .uli_u = { .ports =				       { .sport = sport,					 .dport = dport } } };	int err;	if (!dst || !src) {		err = __myip_route_output_key(rp, &fl);		if (err)			return err;		fl.fl4_dst = (*rp)->rt_dst;		fl.fl4_src = (*rp)->rt_src;		ip_rt_put(*rp);		*rp = NULL;	}	return myip_route_output_flow(rp, &fl, sk, 0);}int myip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len ){	struct inet_sock *inet = inet_sk(sk);	struct sockaddr_in *usin = (struct sockaddr_in *) uaddr;	struct rtable *rt;	u32 saddr;	int oif;	int err;	if (addr_len < sizeof(*usin)) 	  	return -EINVAL;	if (usin->sin_family != MY_AF_INET) 	  	return -EAFNOSUPPORT;		sk_dst_reset(sk);	oif = sk->sk_bound_dev_if;	saddr = inet->saddr;	if (MULTICAST(usin->sin_addr.s_addr)) {		if (!oif)			oif = inet->mc_index;		if (!saddr)			saddr = inet->mc_addr;	}	err = myip_route_connect(&rt, usin->sin_addr.s_addr, saddr,					RT_CONN_FLAGS(sk), oif,					sk->sk_protocol,					inet->sport, usin->sin_port, sk);	if( err )		return err;	if( (rt->rt_flags & RTCF_BROADCAST) && !sock_flag(sk, SOCK_BROADCAST) ){		ip_rt_put(rt);		return -EACCES;	}	if (!inet->saddr)		inet->saddr = rt->rt_src;	if (!inet->rcv_saddr)		inet->rcv_saddr = rt->rt_src;	inet->daddr = rt->rt_dst;	inet->dport = usin->sin_port;	sk->sk_state = TCP_ESTABLISHED;	inet->id = jiffies;	sk_dst_set(sk, &rt->u.dst);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -