BCM 交换机开发
转:http://blog.chinaunix.net/uid-23782786-id-3839602.html
最近搞这玩样,真是折腾,网上的资料都是片段,而且很少。折腾了4、5还没明白其整个的工作流程。眼看时间一天天地流失,内心哪个捉急啊!
于是,豁出去了,从Makefile开始看。并且在源码中添加调用栈打印,终于搞明白了流程;
现摘记出来供后来人参考。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
前提:
芯片:bcm56142
编译:(kernel model)
1. cd system/linux/kernel/x86-generic-2_6/
2. make
程序的连接使用的是 -static 选项,所以 nsl,m,c,pthread等库只能使用静态库(*.a),否则链接过程会提示找不到库 :
/usr/bin/ld: cannot find -lnsl 之类的错误。
编译完成后,进行安装;
insmod linux-kernel-bde.ko
insmod linux-uk-proxy.ko
insmod linux-bcm-diag-full.ko
mknod /dev/linux-uk-proxy c 125 0
1. BCM配置命令操作?
我们在shell中执行 ./bcm.user.proxy,就启动了BCM的命令行用户界面。
这时候,用户就可以使用命令了,比如配置Vlan,端口使能等。
2. 当在开发新产品时,该怎么使用这个SDK呢?
当然了,如果不使用这个SDK也是可以的,直接操作设备文件,但是这个是有工作量,需要花时间的...
我们在执行了 ./bcm.user.proxy时,实际启动的是一个用户空间程序,
对应文件 systems/linux/kernel/user/bcm-diag-proxy/bcm-diag-proxy.c里的main()函数。
main()
(
1. 首先打开设备文件 /dev/linux-uk-proxy。
2. 启动一个读线程,用于从内核 _service_list(name "BCM DIAG SHELL")的sndqueue发送队列
读取内核执行命令后的输出信息。
3. 当前进程则将用户输入定向到标准输入,如果用户输入了字符,则将其发送到
内核_service_list(name "BCM DIAG SHELL")rcvqueue 接收队列
)
当我们在 BCM> 提示符下输入一条命令,比如 show pci
命令"show pci"被传送到了内核_service_list(name "BCM DIAG SHELL")rcvqueue接收队列上。
那么show pci命令怎么被执行了呢?
回到前面的 insmod linux-bcm-diag-full.ko
当这个模块被插入内核时,其初始化函数会调用 _init()
/* systems/linux/kernel/modules/shared/gmodule.c */
int __init init_module() //内核模块加载函数,即insmod时会调用的函数,module_init()最终也是掉这个函数
{
_gmodule = gmodule_get();
......
if(_gmodule->init)
{
if((rc = _gmodule->init()) < 0) //调用 _init()
{
}
}
}
/* systems/linux/kernel/modules/bcm-diag-full/bcm-diag-full.c */
_init()
{
最重要的活就是创建了一个处理shell命令的内核线程:_bcm_shell()
}
/* systems/linux/kernel/modules/bcm-diag-full/bcm-diag-full.c */
_bcm_shell()
{
调用函数 diag_shell(),这个就是最重要的函数了。
}
/* src/appl/diag/system.c */
diag_shell()
{
diag_init(); // 这个没啥好说的,自己看代码,初始化了一些链表,并打印BCM相关信息
sysconf_init();
sysconf_probe();//这里去探测系统中存在的BCM家族的芯片,主要是通过读PCI配置空间的ID
sysconf_attach(); //这里就是将探测到的设备对应的函数安装到对应的钩子上
while(1)
{
sh_process(-1, "BCM", TRUE); //这个东东就一直轮询用户的输入,并执行用户的命令了。
}
}
/* src/appl/diag/shell.c */
sh_process()
{
while(1)
{
sal_readline(); //关注一下这个函数,这个函数就是
// 去从内核_service_list(name "BCM DIAG SHELL")rcvqueue接收队列上取用户的命令
}
......
if( cur_mode == BCMX_CMD_MODE )
sh_process_command(); //看到没,这时候才是真正的去执行用户输入的命令了。
}
/* src/sal/appl/io.c */
sal_readline()
{
sal_console_gets();
}
/* src/sal/appl/linux/console.c */
sal_console_gets()
{
tty_gets();
}
/* systems/linux/kernel/modules/bcm-diag-full/bcm-diag-full.c */
tty_gets()
{
while(!(rc >= 0))
{
rc=linux_uk_proxy_recv(); //直接从内核_service_list(name "BCM DIAG SHELL")rcvqueue队列上
// 取用户的命令
}
}
/* systems/linux/kernel/modules/uk-proxy/linux-uk-proxy.c */
linux_uk_proxy_recv()
{
return _list_op(&s->recv_q.data, &s->recv_q.free, data, len, _LIST_OP_F_GET | _LIST_OP_F_KERN);
}
从以上分析可以看出,linux-bcm-diag-full.ko 是很重要的模块,用于接口用户的,执行bcm 命令。
写这篇文档,一是记录下,日后自己再做BCM的开发,可以省时省力些;二来给像我一样刚接触BCM开发的后来者以参考,少走弯路。
当然,要向了解所有的,最好还是看下他的makefile工程,虽然可能会花上一两天时间,但是对你看代码很有帮助的,
因为代码里好多一样的文件名和函数名,不看Makefile你不知道调哪个了.
对于开发BCM应用:
1. 你可以修改 bcm-diag-proxy.c的main线程,将其的输入重定向一个文件,然后你懂的...
2. 直接操作 /dev/linux-uk-proxy文件(open,ioctl,对应内核的模块linux-uk-proxy.c 中的_ioctl)
BCM 交换机开发的更多相关文章
- 快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示
在上一篇的最后,编写了一个C#驱动RabbitMQ的简单栗子,了解了C#驱动RabbitMQ的基本用法.本章介绍RabbitMQ的四种Exchange及各种Exchange的使用场景. 1 direc ...
- PISCES: A Programmable, Protocol-Independent Software Switch
Name of article:PISCES: A Programmable, Protocol-Independent Software Switch Origin of the article:S ...
- H3C S6800交换机 BCM shell命令
H3C S6800交换机 BCM shell命令 http://wgli978.blog.163.com/blog/static/13592877220172315858831/ <H3C> ...
- Ryu控制器编程开发——packet_in和packet_out简易交换机实现
Ryu控制器二次开发,实现一个简单的只能够简单地广播数据包的交换机. from ryu.base import app_manager from ryu.controller import ofp_e ...
- 开发人员必读openstack网络基础2:交换机、路由器、DHCP
我们在使用openstack的过程中,会遇到创建虚拟机路由器.交换机等,那么1.他们的作用到底是什么?2.DHCP为什么会产生,它的作用是什么? 个人总结:交换机:一般用在同一网段,工作在数据链路层, ...
- maven实战(01)_搭建开发环境
一 下载maven 在maven官网上可下载maven:http://maven.apache.org/download.cgi 下载好后,解压.我的解压到了:D:\maven\apache-mave ...
- 开发人员必读openstack网络基础
云计算中的网络非常复杂,需要对网络的基础理论有一定的认识和了解,转载网上针对openstack中涉及到网络概念的文章 开发人员必读openstack网络基础1:什么是L2.L3 开发人员必读opens ...
- nagios二次开发(四)---nagios监控原理和nagios架构简介
nagios监控原理 下面根据上面摘自网络的原理图对nagios的监控原理进行一下简单的说明: 1.nagios通过nsca进行被动监控.那么什么是被动监控呢?被动监测:就是指由被监测的服务器主动上传 ...
- 【WP 8.1开发】推送通知测试服务端程序
所谓推送通知,用老爷爷都能听懂的话说,就是: 1.我的服务器将通知内容发送到微软的通知服务器,再由通知服务器帮我转发消息. 2.那么,微软的推送服务器是如何知道我的服务器要发消息给哪台手机呢?手机客户 ...
随机推荐
- win10实现移动热点共享WIFI
电脑有线上网有WIFI网卡,想共享WIFI给手机还在为下载猎豹WIFI.360WIFI.WIFI共享精灵?担心密码泄露?担心网络安全?现在一切都不用烦恼.windows10系统自带热点共享 工具/原料 ...
- 关于PHP.INI中的错误ERROR报告级别设置
最近在写php的过程中发现php提示php notice:………………的字样,虽然这个只是php的提示内容,并没有什么大的影响,但是出于安全性和美观方面的考虑,小弟还是想把这个东西去掉. 那么,怎么办 ...
- 第一百七十九节,jQuery-UI,知问前端--按钮 UI-图标
jQuery-UI,知问前端--按钮 UI 学习要点: 1.使用 button 按钮 2.修改 button 样式 3.button()方法的属性 4.button('action', param) ...
- Web Services 平台元素
Web Services 拥有三种基本的元素:SOAP.WSDL 以及 UDDI. 什么是 SOAP? 基本的 Web services 平台是 XML + HTTP. SOAP 指简易对象访问协议 ...
- Eclipse 生成jar包
Eclipse 生成jar包 打开 Jar 文件向导 Jar 文件向导可用于将项目导出为可运行的 jar 包. 打开向导的步骤为: 在 Package Explorer 中选择你要导出的项目内容.如果 ...
- hdu 4576(概率dp+滚动数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576 思路:由于每次从某一位置到达另一位置的概率为0.5,因此我们用dp[i][j]表示第i次操作落在 ...
- (int)()和int()强制类型转换
(int)()这个是c语言的强制转换,众所知周 int(),这种理解靠谱点 Class A { A(int i){} } 调用int类型的构造函数然后转换的 其实都可以转换.
- IOS学习笔记(五)——UI基础UIWindow、UIView
在PC中,应用程序多是使用视窗的形式显示内容,手机应用也不例外,手机应用中要在屏幕上显示内容首先要创建一个窗口承载内容,iOS应用中使用UIWindow.UIView来实现内容显示. UIWindow ...
- bloom filter + murmurhash
是一种hash方法,其实核心思想就是,将一个字符串通过多个普通hash函数映射到hash表上,然后再进行检索的时候同样计算hash函数,如果全都都hash表上出现过,那么说明有极大的可能出现过,如果没 ...
- iOS 多线程之 GCD 的基本使用
什么是GCD 全称Grand Central Dispatch 中暑调度器 纯C语言 提供了很多强大的函数 GCD 的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU ...