UNP学习 路由套接口
一、概述
在路由套接口中支持三种类型的操作:
1.进程能通过写路由套接口想内核发消息。举例:路径就是这样增加和删除的。
2.进程能在路由套接口上从内核读消息。
3.进程可以用sysctl函数得到路由表或列出所有已配置的接口
二、数据链路套接口地址结构
路由套接口上返回的一些消息中包含数据链路套接口地址结构。它是在<net/if_dl.h>中定义的
struct sockaddr_dl { uint8_t sdl_len; sa_family_t sdl_family; /* AF_LINK */ uint16_t sdl_index; /* system assigned index, if > 0 */ uint8_t sdl_type; /* IFT_ETHER, ect. from <net/if_types.h> */ uint8_t sdl_nlen; /* name length, starting in sdl_data[0] */ uint8_t sdl_alen; /* link-layer address length */ uint8_t sdl_slen; /* link-layer selector length */ char sdl_data[12]; /* minimun work area,can be larger; contains i/f name and link-layer address */ };
每个接口都有一个唯一的大于0的索引号
三、读和写
进程在创建路由套接口后,可以通过读和写套接口向内核发命令或从核心读信息。它在<net/route.h>中定义
上图中对吼一列所示:rt_msghdr、if_msghdr和ifa_msghdr:
struct rt_msghdr { /* from <net/route.h> */ u_short rtm_msglen; /* to skip over non-understood messages */ u_char rtm_version; /* funture binary compatibility */ u_char rtm_type; /* message type */ u_short rtm_index; /* index for associated ifp */ int rtm_flags; /* flags, incl. kern & message, e.g. , DONE */ int rtm_addrs; /* bitmask identifying sockaddrs in msg */ pid_t rtm_pid; /* identify sender */ int rtm_seq; /* for sender to identify action */ int rtm_errno; /* why failed */ int rtm_lnits; /* from rtentry */ u_long rtm_inits; /* which metrics we are initializing */ struct rt_metrics rtm_rmx; /* metrics themselves */ }; struct if_msghdr { /* from <net/if.h> */ u_short ifm_msglen; /* to skip over non-understood messages */ u_char ifm_version; /* future binary compatibility */ u_char ifm_type; /* message type */ int ifm_addrs; /* like rtm_addrs */ int ifm_flags; /* value of if_flags */ u_short ifm_index; /* index for associated ifp */ struct if_data ifm_data; /* statistics and other data about if */ }; struct ifa_msghdr { /* from <net/if.h> */ u_short ifam_msglen; /* to skip over non-understood messages */ u_char ifam_version; /* future binary compatibility */ u_char ifam_type; /* message type */ int ifam_addrs; /* link rtm_addrs */ int ifam_flags; /* value of ifa_flags */ u_short ifam_index; /* index for associated ifp */ int ifam_metric; /* value of ifa_metric */ };
rtm_addrs、ifm_addrs和ifam_addrs成员时位掩码,用来指明消息后的套接口地址结构时八种可能的类型中的哪一种。
在<net/route.h>头文件中为该位掩码定义的各常值的值。
三、sysctl操作
#include <sys/param.h> #include <sys/sysctl.h> int sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen); 返回:成功0,出错-1
name:指定名字的一个整数值
namelen:数组中的元素数目
oldp:需指向一个缓冲区,让内核存放该值
oldenp:是一个值-结果参数
newp:指向一个大小为newlen的缓冲区,如果没有指定新值,newp应为一个空指针,newlen应为0
对路由套接口的兴趣是对sysctl函数检查路由表和接口表。
四、接口名和索引函数
#include <net/if.h> unsigned int if_nametoindex(const char *ifname); 返回:成功时为正的接口索引,出错为0 char *if_indextoname(unsigned int ifindex, char *ifname); 返回:成功时为指向接口名的指针,出错NULL struct if_nameindex *if_nameindex(void); 返回:成功时为非空指针,出错为NULL void if_freenameindex(struct if_nameindex *ptr);
无欲速,无见小利。欲速,则不达;见小利,则大事不成。