您的位置:首页 > 运维架构 > Linux

Linux内核协议栈(11)路由系统

2016-03-29 22:28 567 查看
/*
*	查询路由表
*
*	rp:路由表
*
*	dst:目的地址
*
*	src:源地址
*
*	tos:
*
*	oif:
*
*	protocol:协议
*/
static inline int ip_route_connect(struct rtable **rp, __be32 dst,
__be32 src, u32 tos, int oif, u8 protocol,
__be16 sport, __be16 dport, struct sock *sk,
int flags)
{
struct flowi fl = { .oif = oif,
.mark = sk->sk_mark,
.nl_u = { .ip4_u = { .daddr = dst,
.saddr = src,
.tos   = tos } },
.proto = protocol,
.uli_u = { .ports =
{ .sport = sport,
.dport = dport } } };

int err;
struct net *net = sock_net(sk);

if (inet_sk(sk)->transparent)
fl.flags |= FLOWI_FLAG_ANYSRC;

if (!dst || !src) {
err = __ip_route_output_key(net, rp, &fl);
if (err)
return err;
fl.fl4_dst = (*rp)->rt_dst;
fl.fl4_src = (*rp)->rt_src;
ip_rt_put(*rp);
*rp = NULL;
}
security_sk_classify_flow(sk, &fl);
return ip_route_output_flow(net, rp, &fl, sk, flags);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: