connector 中重要的数据结构
connector 中有几个重要的数据结构:
- cn_queue_dev
- cn_callback_id
- cn_callback_entry
- cn_dev
cn_queue_dev 与 cn_dev
cn_queue_dev 与 cn_dev 结构体中都有一个指向 struct sock 的指针,使用这个指针与网络模块关联起来。
cn_callback_entry 与 cn_callback_id
cn_callback_entry 是 connector 内部提供的注册事件回调函数的事件抽象,其中有一个指向一个 struct cn_queue_dev 的指针,使用这个指针来绑定到一个 cn_queue_dev 上。同时每一个 callback_entry本身需要唯一标识,这是通过 cn_callback_id 结构体来完成的。
在注册一个新的 callback_entry 的时候会先确定是否已经注册,如果已经注册则返回错误,否则继续完成注册的过程。
具体的结构体定义如下:
struct cn_queue_dev {
atomic_t refcnt;
unsigned char name[CN_CBQ_NAMELEN];
struct list_head queue_list;
spinlock_t queue_lock;
struct sock *nls;
};
struct cn_callback_id {
unsigned char name[CN_CBQ_NAMELEN];
struct cb_id id;
};
struct cn_callback_entry {
struct list_head callback_entry;
refcount_t refcnt;
struct cn_queue_dev *pdev;
struct cn_callback_id id;
void (*callback) (struct cn_msg *, struct netlink_skb_parms *);
u32 seq, group;
};
struct cn_dev {
struct cb_id id;
u32 seq, groups;
struct sock *nls;
void (*input) (struct sk_buff *skb);
struct cn_queue_dev *cbdev;
};
connector 驱动的源码
connector 驱动主要由两个源文件实现:
- connector.c
- cn_queue.c
connector.c 中写的是 connector 模块的初始化与解初始化代码以及封装后的标准的 netlink 消息发送函数以及添加、删除、执行 connector 事件回调函数的
功能。
cn_queue.c 中写的是对 cn_queue_dev 的相关操作的代码。