📄 mydatagram.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 + -