前言
来到新的公司后,一直在关注frr的东西,领导让搞一下在frr中新增一个模块,趁着这个机会整理一下整个流程。
下载openwrt+frr
- 文档链接 http://docs.frrouting.org/projects/dev-guide/en/latest/building-frr-for-openwrt.html
- 下载代码并设置frr编译环境
git clone https://github.com/openwrt/openwrt.git cd openwrt ./scripts/feeds update -a ./scripts/feeds install -a cd feeds/routing git fetch origin pull/319/head git read-tree --prefix=frr/ -u FETCH_HEAD:frr cd ../../package/feeds/routing/ ln -sv ../../../feeds/routing/frr . cd ../../..
新增模块涉及文件修改
模块名以devset为例。
修改模块文件
- 模块编译需要subdir.am、Makefile,内容例如:
- 项目编译需要Makefile.am和configure.ac,内容添加:
configure.ac:
Makefile.am:
进程文件
改到的文件有frr.in、frrcommon.sh.in, 。
其中进程的方式有:
1.启动进程zebra时自动开启进程,例如staticd模块;
2.修改文件damons,通过设置yes或no方式开启进程,例如ripd模块;
3.例如watchfrr一样,自动开启进程。
方式1
- 文件frr.in文件
添加
设置自动启动:
关闭进程:
- frrcommon.sh.in文件
- Frr-reload.py文件
- Daemons文件
添加新加模块:
方式2
- Frr.in文件
- Frrcommon.sh.in文件
- Daemons文件
方式3
待研究。
程序流程
- frr预初始化:
void frr_preinit(struct frr_daemon_info *daemon, int argc, char **argv);
- 传参处理
struct thread_master *frr_init(void)
- 模块其他功能的初始化操作。(需要则有)
- Vty初始化
- void frr_config_fork(void)
- 运行void frr_run(struct thread_master *master);
还需要在vtysh上添加模块。
文件vtysh.c
文件vtysh.h
openwrt编译文件修改
-
新增模块添加进menuconfig 在目录./tmp下的文件.config-package.in添加新模块:
执行make menuconfig将新模块添加进去。
-
frr的makefile添加编译项 Openwrt编译frr相关的文件有feeds/packages/net/frr/Makefile或feeds/routing/frr/Makefile。根据frr版本选择不同目录:
以feeds/routing/frr/Makefile为例
编译配置
执行make menuconfig
: