网络层上所有的协议由一个hash表inet_protos管理,每个表项是inet_protocol 结构体。inet_add_protocol()可以向这个表注册一个新的传输层协议。它的参数为inet_protocol 结构体。在该结构体中的handler字段是一个函数指针,如tcp中,这里赋值为tcp_v4_rcv(). id字段用于识别这个协议。如果一个IP包中的protocol field的值为此id,则IP包被转发给这个协议处理。
inet_del_protocol()删除这个协议。
下面是增加一个新的4层协议的方法。
整个代码需要在模块中实现。
需要的头文件有
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/skbuff.h>
#include <linux/in.h>
#include <net/protocol.h>
要实现init_module(void)、cleanup_module(void),而inet_add_protocol在init_module函数中,inet_del_protoclo在cleanup_module中。
需要定义inet_protocol 结构体,需要定义该协议的处理函数。