从struct sock获取对网络接口的引用

时间:2015-07-19 16:03:00

标签: linux-kernel kernel

我正在努力跟踪每个进程的网络活动。为此,我在struct sock添加了一些字段,以便在创建套接字时跟踪PID。这将允许我在最终发送/接收数据时更新task_struct。但是,我很难确定正在使用哪个网络接口。

我发现struct sk_buff有一个引用网络接口的字段struct net_device *dev,但我不明白如何从struct sock引用它。

假设struct sock 绑定到接口是否有意义?如果是这样,是否有一种简单的方法可以引用正在使用的网络接口?

1 个答案:

答案 0 :(得分:1)

物理接口是动态确定的(有点)。套接字(假设为简单起见,假定为TCP会话)仅表示本地[IP,端口]和远程[IP,pot]之间的连接。因此,将数据发送到远程需要执行路由操作。这是通过查看内核路由表并确定下一跳的直接机器(例如,如果RemoteIP在本地子网中),或者通过查找回退("默认网关")来完成的。下一跳。从逻辑上讲,该操作是在逐个数据包的基础上完成的,尽管有一种缓存机制可以防止它真正逐包完成。

但可以想象,当连接正在进行时,正在使用的路由/接口可能会发生变化。例如,您可能已经使用一个接口建立了连接(由于默认网关设置),然后管理员可以将默认网关更改为指向不同的IP地址,这可能导致发往远程的数据包被定向出了一个不同的界面。

ip_queue_xmit看看这是否有效。所以,是的,通过sock->sk_dst_cache绑定到物理接口,提供包含struct dst_entry的{​​{1}}。但可以想象,在发送下一个数据包之前,该条目可以无效。