zoukankan      html  css  js  c++  java
  • 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);
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    常用问题处理
    modelsim仿真中遇到的问题
    modelsim编译altera的库
    verilog系统函数用法
    123
    MATLAB实现截位的问题
    加减与有符号和无符号库
    状态机中的RAM注意的问题--减少扇出的办法
    串口的时序
    L230 RF可靠性测试-RF指标
  • 原文地址:https://www.cnblogs.com/ch122633/p/8589642.html
Copyright © 2011-2022 走看看