netifd[4]-interface

5344 ワード

データ構造
/**
 * interface object
 */
struct interface {
    struct vlist_node node;
    struct list_head hotplug_list;
    enum interface_event hotplug_ev;

    const char *name;
    const char *ifname;

    bool available;
    bool autostart;
    bool config_autostart;
    bool device_config;
    bool enabled;
    bool link_state;
    bool force_link;
    bool dynamic;

    time_t start_time;
    enum interface_state state;
    enum interface_config_state config_state;
    enum interface_update_flags updated;

    struct list_head users;

    const char *parent_ifname;
    struct interface_user parent_iface;

    /* main interface that the interface is bound to */
    struct device_user main_dev;

    /* interface that layer 3 communication will go through */
    struct device_user l3_dev;

    struct blob_attr *config;

    /* primary protocol state */
    const struct proto_handler *proto_handler;
    struct interface_proto_state *proto;

    struct interface_ip_settings proto_ip;
    struct interface_ip_settings config_ip;
    struct vlist_tree host_routes;

    int metric;
    unsigned int ip4table;
    unsigned int ip6table;

    /* IPv6 assignment parameters */
    uint8_t assignment_length;
    int32_t assignment_hint;
    struct list_head assignment_classes;

    /* errors/warnings while trying to bring up the interface */
    struct list_head errors;

    /* extra data provided by protocol handlers or modules */
    struct avl_tree data;

    struct uloop_timeout remove_timer;
    struct ubus_object ubus;
};
enum interface_event {
    IFEV_DOWN,
    IFEV_UP,
    IFEV_UPDATE,
    IFEV_FREE,
    IFEV_RELOAD,
};

enum interface_state {
    IFS_SETUP,
    IFS_UP,
    IFS_TEARDOWN,
    IFS_DOWN,
};

enum interface_config_state {
    IFC_NORMAL,
    IFC_RELOAD,
    IFC_REMOVE
};

enum interface_update_flags {
    IUF_ADDRESS = (1 << 0),
    IUF_ROUTE   = (1 << 1),
    IUF_PREFIX  = (1 << 2),
    IUF_DATA    = (1 << 3),
};

struct interface_error {
    struct list_head list;

    const char *subsystem;
    const char *code;
    const char *data[];
};

/**
 * interface   
 */
struct interface_user {
    struct list_head list;
    struct interface *iface;
    void (*cb)(struct interface_user *dep, struct interface *iface, enum interface_event ev);
};

/**
 * interface ip     
 */
struct interface_ip_settings {
    struct interface *iface;
    bool enabled;
    bool no_defaultroute;
    bool no_dns;
    bool no_delegation;

    struct vlist_tree addr;
    struct vlist_tree route;
    struct vlist_tree prefix;

    struct vlist_simple_tree dns_servers;
    struct vlist_simple_tree dns_search;
};

struct interface_data {
    struct avl_node node;
    struct blob_attr data[];
};

struct interface_assignment_class {
    struct list_head head;
    char name[];
};
インターフェースの説明
/**
 *             interface object
 *
 * @param name interface name
 * @param config configure of interface object
 * @return interface object
 */
struct interface *interface_alloc(const char *name, struct blob_attr *config)
/**
 *      interface 
 *
 * @param iface interface object
 * @param config configure of interface object
 */
void interface_add(struct interface *iface, struct blob_attr *config)
/**
 *   interface object proto    
 *
 * @param iface interface object
 * @param state proto handler object
 */
void interface_set_proto_state(struct interface *iface, struct interface_proto_state *state)
/**
 *   interface object
 *
 * @param iface interface object
 * @return true - success false - failed
 */
int interface_set_up(struct interface *iface)

/**
 *   interface object
 *
 * @param iface interface object
 * @return true - success false - failed
 */
int interface_set_down(struct interface *iface)
/**
 *   interface   device  
 *
 * @param iface interface object
 * @param dev device object
 */
void interface_set_main_dev(struct interface *iface, struct device *dev)

/**
 *   interface  3 device  
 *
 * @param iface interface object
 * @param dev device object
 */
void interface_set_l3_dev(struct interface *iface, struct device *dev)
/**
 *   interface object  
 *
 * @param dep interface reference object
 * @param iface interface object
 */
void interface_add_user(struct interface_user *dep, struct interface *iface)

/**
 *   interface object  
 *
 * @param dep interface reference object
 */
void interface_remove_user(struct interface_user *dep)
/**
 *
 */
int interface_add_link(struct interface *iface, struct device *dev)

/**
 *
 */
int interface_remove_link(struct interface *iface, struct device *dev)

/**
 *
 */
int interface_handle_link(struct interface *iface, const char *name, bool add)
注意
interfaceオブジェクトavl treeチェーンは、keep_oldno_deleteのフラグを設定し、毎回config_を実行する.init_allの時はまずvlist_udateはavl treeチェーンのヘッダの接合点のversionフラグをプラスし、UCIによってinterfaceチェーンのオブジェクトを更新すると、各nodeのversionは、ヘッダの結点versionと一致したままで、その後vlist_を行う.flash時にnodeのversionがあったら、頭の結点versionと一致しないものは削除されますが、netifdはあるinterfaceを削除する時、実際には対応する対象をavl treeチェーンから削除しませんでした.次のretartまたはreloadを待ってからです.