Testpmd代码导读(二)-用户接口

作者简介:陆文卓,DPDK软件开发工程师,专注于PMD相关开发。

文章转载自DPDK与SPDK开源社区公众号

如前一篇testpmd代码导读(一)——基础功能,testpmd所使用的UI是命令行,显得比较古朴。作为一个轻量级的测试工具,testpmd的人机交互功能比较弱而有限,不需要复杂的图形界面就可以完成。因此使用CLI的好处也是比较明显的,可以控制项目的大小,防止在非核心的功能上花费过多的精力。

一般情况下,基于DPDK进行应用程序开发的使用者不需要对CLI有太多的了解,只需调用合适的API即可实现所需的功能。但是testpmd作为一个简单的应用程序,对实验性质的开发会有很大的帮助。在正式开发之前,通过简单修改CLI代码,可以方便的和testpmd程序交互,进行一些新功能的验证调试。

CLI使用说明

CLI的使用包含在testpmd的使用指南中。Testpmd的使用指南可以在dpdk官方网站上下载:http://core.dpdk.org/doc/

CLI的说明在这个文件中,doc\guides\testpmd_app_ug\testpmd_funcs.rst,开发者在testpmd中增加、修改、删除CLI命令时,应该更新此文件。文档生成工具可以根据此文件自动生成pdf文档。

CLI举例

CLI都是比较类似的,简单的说,实现的就是解析字符串并将其和某个API关联起来,然后执行API的过程。API可能会实现很复杂的功能,但是这些功能都是由其它的lib提供的,(由于testpmd是针对PMD的测试程序,这个lib一般是ethdev这个lib。当然,使用者可以随意的扩展CLI,调用任意的API,以达到不同的测试目的。)所以,CLI的代码看起来都会有一些相似。下面的一个例子基本上就可以了解CLI的代码实现。

端口信息显示

以一个简单的CLI为例,我们可以了解CLI相关的代码实现。下面是一个直观的“showport info”的例子。

数据结构介绍

在上一篇testpmd基础介绍中提到,当启动testpmd时,加入“-i”参数,testpmd将进入交互模式,此时用户可以使用CLI功能。

当用户在提示符后输入字符后,testpmd是如何处理字符串并执行相应的API的呢?

每个CLI都对应一个数据结构变量,这存在cmdline.c文件中。“show port info”的数据结构变量是:

我们可以看到“cmd_showport”包含四个部分:
1.f。应该是指function,即CLI所执行的函数。

2.data。除了CLI之外,可以传递给执行函数的参数。因为它不是通过CLI传递的,可以看做不是属于UI的一部分,一般也不使用,置为空。

3.help_str。帮助信息。从帮助信息看,此CLI承担的功能不仅仅是显示端口的信息,它还可以显示统计信息等,并且也能够清空统计信息等。当然,这只是帮助信息声称的功能,是不是真正是这些功能呢?下面的详细分析会进一步说明。

4.tokens。描述了构成CLI的各个字符串。我们可以看到,这个CLI由4个字符串构成。

  • cmd_showport_show有两种可能,“show”或者“clear”。
  • cmd_showport_port只能是“port”。
  • cmd_showport_what可以是以下任意一个,“info”、“stats”、“xstats”、“fdir”、“stat_qmap”、“dcb_tc”、“cap”
  • cmd_showport_portnum则必须是无符号整数。

CLI解析介绍

简单的说,当一串字符可以和上述的四个小字符串的组合即tokens匹配时,就执行f所指定的函数。但是,当用户输入一串字符后,testpmd是怎么知道它能够匹配某一个CLI的呢?

上述的变量cmd_showport被放在了数组main_ctx中。当用户输入一串字符后,程序将会遍历main_ctx数组中所有的变量,判断此字符串是否和数组中的某个变量匹配。这部分的工作实际上是由librte_cmdline完成的。大致的流程如下:

1.将获取的一串字符分拆成若干子字符串。在分拆时,一串字符中的一个或若干个连续的空格被视为子字符串的间隔。显然字符串的结束符‘\0’被视为结束。

2.将这些子字符串和main_ctx数组中的变量逐个匹配。实际上是将子字符串和变量的tokens域进行匹配。例如如下字符串都可能和cmd_showport匹配。
a. show port info 0
b. show port stats 1
c. clear port xstats 4
d. clear port fdir 5
e. …

3.当发现某个变量可以和输入的字符串匹配时,并不会停止,而是继续匹配剩下的变量。当发现还有另外一个变量可以和输入的字符串匹配时,将会报错——含义模糊的命令。
这就要求testpmd的代码实现者在设计CLI时要保证不要和已有的CLI雷同。

4.匹配工作完成后,如果只有一个变量和输入的字符串匹配,则通过变量的f域执行处理函数。对于“showport info”是函数cmd_showport_parsed。

如果没有任何变量匹配,则报错。

函数执行

当CLI的解析完成后,就进入函数执行的阶段。函数执行并不是机械的执行某个动作,实际上有一定的自由度,可以选择需要的操作。以“showport info”的执行函数为例,尽管变量cmd_showport中的token的组合有很多种,实际上只支持其中有意义的几种。

显示端口信息

如前所述,当用户输入适当的token组合后,testpmd就会进入到显示端口信息的处理。端口信息显示函数port_infos_display是testpmd实现的,通过调用rte_eth的API获取需要的信息,然后打印。

文章小结

CLI在testpmd中是一个庞大的部分,但原理并不复杂,实现一些功能也很简单快捷。Dpdk的使用者可以对其进行初步的了解,模仿现有的代码实现一些简单的调试命令,有助于快速调试功能,提升开发效率。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/22779.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于18-12-06
0