当前位置: 技术问答>linux和unix
一个linux数据结构的问题!(大家帮我啊)
来源: 互联网 发布时间:2015-09-25
本文导语: linux在route cache里用ip_route_input(net/ipv4/route.c)查找匹配路由的时候,用 rtable->u.rt_next找到下一个rtable结构,如果找到匹配的路由则要对rtable->u.dst进行一些操作。u的定义如下: union { struct dst_entry dst; struct rtable *rt_...
linux在route cache里用ip_route_input(net/ipv4/route.c)查找匹配路由的时候,用
rtable->u.rt_next找到下一个rtable结构,如果找到匹配的路由则要对rtable->u.dst进行一些操作。u的定义如下:
union
{
struct dst_entry dst;
struct rtable *rt_next;
} u;
怎么才能又用u.rt_next招下一个rtable,又用u.dst保存路由信息呢?
rtable->u.rt_next找到下一个rtable结构,如果找到匹配的路由则要对rtable->u.dst进行一些操作。u的定义如下:
union
{
struct dst_entry dst;
struct rtable *rt_next;
} u;
怎么才能又用u.rt_next招下一个rtable,又用u.dst保存路由信息呢?
|
问题的关键在 dst_entry中的next上
struct dst_entry
{
struct dst_entry *next;
....
}
union 是两个数据占用一块内存
union
{
struct dst_entry dst;
struct rtable *rt_next;
} u;
dst 假如占100字节,rt_next只占用4个字节,即 union u 共100个字节。rt_next只占用前四个字节,和struct dst_entry中next域是重叠的,不影响struct dst_entry中的其他域。这样struct dst_entry中的next域是无效的(这个地址应该放的是struct rttable 的指针,而不是ds_entry的指针
struct dst_entry
{
struct dst_entry *next;
....
}
union 是两个数据占用一块内存
union
{
struct dst_entry dst;
struct rtable *rt_next;
} u;
dst 假如占100字节,rt_next只占用4个字节,即 union u 共100个字节。rt_next只占用前四个字节,和struct dst_entry中next域是重叠的,不影响struct dst_entry中的其他域。这样struct dst_entry中的next域是无效的(这个地址应该放的是struct rttable 的指针,而不是ds_entry的指针
|
rtable 同时存在指向KEY 和 U 的指针,是在交叉使用,你可以参考参考struct rt_key 的结构,是几个指针组合。
|
看看tcp/ip详解2
|
u.dst.next和u.rt_next实际上用的是同一个内存地址,表示不同的东西而已。