FRR

frr新增模块流程

Posted by Dandan on May 21, 2020

前言

来到新的公司后,一直在关注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: