IPV6网管命令代理的设计与实现_第1页
IPV6网管命令代理的设计与实现_第2页
IPV6网管命令代理的设计与实现_第3页
IPV6网管命令代理的设计与实现_第4页
IPV6网管命令代理的设计与实现_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、IPV6网管命令代理的设计与实现1系统框架2各子系统之间的交互接口的定义2.1 oam4(主要是指rpu 的execute进程)与icp的接口主要有以下几种接口:事件型函数调用,rpc命令调用,同步1次命令,同步大包命令,异步命令。2.1.1 事件型函数调用事件型函数调用主要是完成icp链路打开,关闭,异步命令中断,设置 imi vty的一些参数的工作。以下是所有的事件函数extern IcpBreakAsynCmd(int channel);extern IcpOpenChannel(int channel, UINT8 mode);extern IcpCloseChannel(int ch

2、annel);extern IcpSetHostname(int channel, char * hostname);extern IcpSetVtyPara(int channel, UINT8 width, UINT8 height);事件型函数与icp之间采用的消息结构为:Icp_event消息发送方式:同步消息发送消息类型为:EXECUTE_ICP_EVENT消息结果的传递方式:不携带命令结果字符串,只是在消息体中填写返回码事件之间又用消息体中的u_char eventide 来区分,#define ICP_EVENT_OPEN_CHANNEL 1#define ICP_EVENT_C

3、LOSE_CHANNEL 2#define ICP_EVENT_VTY_PARA 3#define ICP_EVENT_HOSTNAME42.1.2 rpc命令调用所谓rpc命令,只是一种表象表现,即由icp部分提供一个函数,提供类似于ioctl一样的效果,用户只要按rpcid号调用函数,并提供缓冲区,就可以得到想要的数据或达到某种get或set或process的操作。实际的内部实现与同步命令无异。本来rpc命令可以和事件型的合并,但是因为两者之间还是有区别的,即事件型侧重于传递一些参数,而rpcid侧重于获得结果,基本上不需要给icp传参,所以两者在消息结构上不同rpc命令函数与icp之间采

4、用的消息结构为:MSG_COMM_OAM *消息发送方式:同步消息发送消息类型为:EXECUTE_ICP_NORMAL_RPC1消息结果的传递方式:在消息体中携带命令结果的数据extern IcpRpcCmdMultitimes(int channel, int rpcid, u_char * buff, int bufflen, int firsttime); extern IcpRpcCmdOnetime(int channel, int rpcid, u_char * buff, int bufflen);2.1.3 同步命令结果一次获取(即一般意义的同步命令)它是针对大多数命令而设计的

5、,即大多数命令只有少量的结果需要返回,所以用户发一次同步命令,就可以执行完命令,并把命令结果返回它与icp之间采用的消息结构为:MSG_COMM_OAM *消息发送方式:同步消息发送消息类型为:EXECUTE_ICP_NORMAL_SYNC2消息结果的传递方式:在消息体中携带命令结果的数据缓冲区指针。2.1.4 同步命令结果多次获取(即异步大包命令)它是针对那些如show ipv6 route 的命令,这些命令有大量的输出,由于结果庞大,oam4不能一次接收完结果,所以采用分批接收的办法,oam4发一次同步消息,就返回一批数据,当它处理完后,再发一次同步消息请求下一批数据,直到结果完毕。它与i

6、cp之间采用的消息结构为:MSG_COMM_OAM *消息发送方式:多次同步消息发送消息类型为:EXECUTE_ICP_NORMAL_SYNC1消息结果的传递方式:在消息体中携带命令结果的数据2.1.5 异步命令它是针对如ping6,还可以是telnet6之类的命令,这类命令的特点是执行时间不定,执行结果返回的多少及时间不定,所以对这类命令采用发一个ros异步消息,通知执行一个命令,然后oam4就可以接收到由icp发过的ros异步消息,当命令执行完毕,icp也是用异步消息通知oam4的(即在消息中的lastpacket字段中填ture便可)它与icp之间采用的消息结构为:MSG_COMM_OA

7、M *消息发送方式:一次ros异步消息发送要求执行命令,多少异步消息接收命令执行结果消息类型为:EXECUTE_ICP_NORMAL_ASYN消息结果的传递方式:在消息体中携带命令结果的数据2.2 icp与imi的接口2.2.1 它们之间的接口的特点:icp作为telnet6 client,imi作为telnet6 server,icp是登录到imi vty上的,所以它们的关系就是telnet6客户服务器的关系,只不过对imi vty作了一些改造,使它能为icp提供特殊的服务,用以充分的实现两者信息的交流。它们之间当然是tcp6连接,但是不再使用telnet协议,而是使用一套类似于telnet

8、协议的信令。两种协议之间的区别在于:telnet协议的控制信息总是以IAC开头,而icp信令,并没有以固定的IAC开头,而是可以以字符从128至254的任何字符开始,这是可行的原因是imi vty所有命令的执行结果都是128的字符,所以128以上的字符用于信令是可行的,这比telnet协议的好处在它可以用一个字符表达一种信息,而telnet协议至少需要两个字符。我把这种定义暂且称为icp协议,若为单字符,就叫信令,若为多个字符,则称为信令消息。2.2.2 从icp到 imi vty的信令这些信令指示一条命令随后输入,中断命令执行,或通告imi vty这是由icp登录过来,请切换到icp协议来交

9、互,或是指示随后有一个信令消息输入#define ICP_ZEBOS_CMD_STRING_INPUT_SIGNAL ICP_ZEBOS_SIGNAL+1/*命令串输入*/#define ICP_ZEBOS_MSG_SIGNAL方向的信令消息体标识*/ ICP_ZEBOS_SIGNAL+2/*由icp到zebos#define ICP_ZEBOS_CMD_BREAK_SIGNAL ICP_ZEBOS_SIGNAL+3#define ICP_ZEBOS_ICP_TELNET_SIGNAL ICP_ZEBOS_SIGNAL+4/*由icp登录上来的信令*/为什么要定义这些信令?ICP_ZEBOS_

10、CMD_STRING_INPUT_SIGNAL这个信令不定义也可以,这是因为用户输入的字符串当以回车结束时,telnet server自然会把它当作一条命令处理,之所以定义它则是为了把tcp字符流的字符序列的意义更加明确化,即明确告诉对端,下面是一条命令,请作好接收工作。实际上,紧跟这个信令的字符是一个命令序列号,每次传一条命令都要求序列号不同,以便对方识别或同步命令,只是我在实现时,发现这种必要性在这种特殊环境下不是很必要,所以序号就全部填成了1,总的来说,这个信令是可有可无的设计。ICP_ZEBOS_MSG_SIGNAL这条信令是必须的,为了从icp向zebos传一条消息,而定义了这个信令

11、,它指示imi vty转入消息处理,而不是把字符流当命令ICP_ZEBOS_CMD_BREAK_SIGNAL这条信令是必须的,它一般是在命令执行中由icp发出,来告诉imi vty中断命令的执行。它的效果就好象是用户在telnet 客户端按ctrl+c来中断命令执行。实现上,这条信令是一个无害信令,它可以在任何时候发出,在命令不执行期间发出,则imi vty会自动忽略它。ICP_ZEBOS_ICP_TELNET_SIGNAL这条信令是必须的,因为imi vty同时支持telnet协议和我定义的icp协议,则此信令就是告诉imi vty使用icp协议。正因为有两种协议,所以用户也可以用telne

12、t6 客户端工具直接登录imi vty进行配置管理,而不走oam4icpimi vty流程2.2.3 从imi vty 到icp的信令这些信令指示一条命令结果数据流的开始,结束,数据流中出现more开屏(即需要用户交互响应一下,以便继续输出结果),或在imi vty刚打时指示用户可以输入命令#define ZEBOS_ICP_CMD_RESULT_BEGIN_SIGNAL ZEBOS_ICP_SIGNAL+2/*命令执行结果开始输出*/#define ZEBOS_ICP_CMD_RESULT_END_SIGNAL ZEBOS_ICP_SIGNAL+3/*命令执行结果结束输出*/#define

13、ZEBOS_ICP_CMD_RESULT_MORE_SIGNAL ZEBOS_ICP_SIGNAL+4/*命令执行结果中出现MORE*/为什么要定义这些信令?ZEBOS_ICP_CMD_RESULT_BEGIN_SIGNALZEBOS_ICP_CMD_RESULT_END_SIGNAL这两条信令是必须的,这两条信令在命令执行结果的首和尾,正好把命令执行结果包围在中间,从而使icp能识别出命令执行结果的数据,并判断出命令什么时候开始返回结果和什么时候命令执行完毕,方便了icp的状态同步。ZEBOS_ICP_CMD_RESULT_MORE_SIGNAL这条信令是必须的,由于在对imi vty 改造

14、时,并未动imi vty的设计框架,所以imi vty的命令结果输出具有分屏的效果,而当出现分屏时,用户就必须给imi vty一个回车或键入别的字符,以便继续显示。我在改造imi vty时,是这样设计的,当用telnet协议时,分屏的提示串为原来的MORE-,当用icp协议时,则只是把提示串换成了这个信令字符,所以当icp收到这个信令时,icp就会自动回应一个回车字符,让imi vty继续输出,从而保证了命令结果的正常和不断的返回。2.2.4 从icp到imi vty的消息主要是设置imi vty的一些参数,如终端窗口大小,模式,hostname等,要设置的参数类型以msgid来区别typed

15、ef struct tagIcp_zebos_msgu_char msgid;/*信息体的标识*/u_char msgsubid;u_char width;/*窗口尺寸*/u_char height;u_char mode;/*同步模式,直接设置*/u_char privilege;char hostname20;Icp_zebos_msg;为什么要定义这些信令消息?由于imi 命令没有提供或虽然提供了相关的参数设置命令,但使用不方便,所以专门定义这个信令消息,以方便快捷的对imi vty进行必要的设置。2.2.5 从imi vty 到icp的消息用于在每次imi vty执行命令结束后,向ic

16、p通告目前imi vty所处的模式,以便icp完成模式同步/*定义icp与zebos交换信息的信息体*/*方向是从zebos到icp*/typedef struct tagZebos_icp_msgu_char msgid;/*信息体的标识*/u_char msgsubid; u_char mode;/*zebos现在所处的模式*/ u_char privilege;/*zebos现在所处的级别*/Zebos_icp_msg;为什么要定义这些信令消息?为了icp更加简单,所以对于oam4和imi vty都要执行的一些模式切换命令如exit,enable,disable,conf t等命令采用o

17、am4不通知icp,即imi vty在icp协议下不需执行的方式 ,所以必然会引起oam4与imi vty的模式失步现象的发生,为了使两边的模式能及时同步起来,所以设计了在每一条命令执行前,由icp进行模式同步工作,这种模式同步的设置由Icp_zebos_msg来完成,但要进行模式同步,icp 就必须知道imi vty的当前模式,用以判断是否发生了模式失步,所以在imi vty每执行一条命令结束后,会立刻发一条消息给icp,以告诉icp命令执行结束后,imi vty处理什么模式,icp会记下这个模式信息,并在模式失步判断中使用总之,定义icp协议是为了让icp与imi vty充分的进行信息的交

18、互。以便icp控制imi vty的行为。3icp的实现3.1 icp的进程模型icp进程是ros进程,同时它又采用了zebos的线程模型,关于zebos的线程模型的工作原理这里不详细说明。只简单说明zebos线程模型的创建方法1 线程初始化(1)。定义全局变量struct lib_globals *icpm = NULL;memory_init ();icpm = lib_start ();(2)。创建线程icpm->master = thread_master_create ();(3)。为自己的进程创建线程事件函数1)线程事件的定义typedef enum tagICP_THREAD

19、_EVENTICP_EVENT_ASYN_READ,ICP_EVENT_TELNET6_CLIENT_READ,ICP_EVENT_MAX,ICP_THREAD_EVENT;2)线程事件函数void * icp_thread_event (struct lib_globals *zg, ICP_THREAD_EVENT event, int sock,void *arg)struct thread * thread_ret;switch (event)case ICP_EVENT_ASYN_READ:thread_ret = thread_add_read_high (zg, icp_read

20、_zebos_asyn, arg, sock); break;case ICP_EVENT_TELNET6_CLIENT_READ:thread_ret = thread_add_read_high (zg, icp_read_telnet6_client, arg, sock); break;default:break;return thread_ret;3)。接下来,用户就可以用这个函数来随心随时挂接线程了,但注意线程是消耗性,所以要实现类似循环,再次执行线程,就必须再次挂接线程此函数有4个参数,第1个zg是线程模型的主控变量,第2个变量event是线程事件,用户可根据自己的情况随心定义,

21、它可以处理的线程类型有定时器事件,套口读写事件及可以立即执行的事件,具体的编写还是看zebos原代码。第3个变量sock,当为套口读写事件时,这个变量是必需的,第4个变量arg,是用户自己的变量,当线程激活时,用户可通过THREADARG再得到这个变量,以方便用户的程序处理。3.2 重要函数讲解由于函数较多,其中大部分较简单,这里只讲解一些较重要的函数的实现,3.2.1同步一次取结果命令,同步多次取结果,rpc命令的处理process_execute_icp_normal_sync1();process_execute_icp_normal_sync2();处理流程:1 获取同步消息2 获取i

22、cp控制块,若为NULL,则尝试自动打开链路3 进行icp状态同步4 进行icp模式同步5 向imi vty发送命令并提取数据,这里若是执行一条新命令,则发送命令给imi vty,若为非执行一条新命令,而是继续向icp要数据,则icp只从imi vty套口提取数据6 填写回执消息7 判断命令是否执行完毕,并进行相应的膳后处理为什么要进行icp状态同步?因为对于同步命令,当oam4中命令结果输出中,若被用户中断掉,oam4并不通知icp发生了命令中断,则此时oam4会回到命令接收状态,而icp仍处于命令执行中状态,还有就是oam4发同步消息,或异步消息可能失败或丢失,这也会引起两者状态不同步,所

23、以要进行状态同步。状态同步工作主要由icp_sync_icp_state()完成icp_sync_icp_state()主要根据消息中的CmdRestartFlag与 icp控制块的icpmaster->status来把情况分成4种情况为什么要进行模式同步?因为系统设计时,为了简化处理,oam4不把enable,disable,conf t ,exit等模式切换命令发给icp,是当oam4执行这些命令时,会引起oam4与imi vty的模式不同步,所以要进行模式同步进行模式同步的函数为:icp_sync_mode()icp_sync_mode()它会从同步或异步消息或根据rpcid推算出

24、当前要执行命令的oam4模式,然后查模式映射表,找到此时imi对应的模式,然后icp会发一个信令消息给imi,使imi的模式同步起来。3.2.2 异步命令的处理void process_execute_icp_normal_asyn()void icp_read_asyn(ICP_master *icpmaster)处理流程:1获取异步消息2获取icp控制块,若为NULL,则尝试自动打开链路3进行icp状态同步4进行icp模式同步5发送命令给imi vty6挂上异步读线程,然后接下来的工作便由icp_read_asyn来处理。只要套口可读,则说明imi vty有命令结果返回,则线程Icp_re

25、ad_asyn激活icp_read_asyn的工作就是接收数据,把数据打包发给oam4,若数据完毕,则处理膳后工作。3.2.3 事件处理void process_execute_icp_event()事件处理相对较简单,它会根据事件消息结构中的eventid来调不同的具体处理函数icp_read_telnet_begin_sync()它是当套口打开时,完成把imi vty设置成icp协议工作状态在这个过程中有个要注意的细节问题。因为当imi vty刚被打开时,imi vty处于telnet协议状态,它会发送路由器banner,命令提示符,telnet协商选项,然后imi vty才会沉默下来,等

26、待用户的命令输入。通过对imi代码调整,让imi在进入命令接收状态的最后时刻,发达IAC WILL ECHO协商,icp在接收数据时,会忽略数据直到检查到IAC WILL ECHO,这时icp会得出这个结论,即imi vty经进入命令接收状态,不会再有数据过来。此时icp要做的工作就是给imi vty发一个信令,通知imi vty这是Icp登录上来了,请将协议换到icp协议状态,从而imi vty就可以与icp用icp协议来交互了。icp_read_cmd_result()这是最重要的套口读写函数,它要从数据流中过滤出icp协议信令,然后根据信令设置icp控制块或与imi vty进行必要的交互

27、操作。它还会把去掉的icp协议信令的数据作为命令结果拷贝到icp控制块的命令结果缓冲区,以便同步或异步命令消息处理函数把结果打包发回给oam4。工作流程:1 从套口提取一批数据2 分析数据,发现数据中的信令,并作出相应的处理3 把命令结果整理出来,拷贝到控制块的命令结果缓冲区。4imi的改造4.1 改造简介对imi的改造较简单,主要是让它能处理icp协议,imi改造后,对原有功能没有任何影响,用户仍可以直接登录imi vty进行配置。所有的代码都用条件宏ZEBOS_ICP括起来,所以可以方便恢复文件原貌所有的icp协议代码都通过定义在vty结构中的zebos_icp_telnet 标志来区别,

28、并执行不同的流程,(1) 增加 CLI_SCROLL, CLI_NO_CLEAR_BUFF,用于支持ping6(异步命令)的屏滚输出方式当vty_flush输出线程被激活后,它发现处于CLI_SCROLL状态,就会将缓冲区中的所有数据冲刷出去,而不会考虑分屏。CLI_NO_CLEAR_BUFF是用户中断命令后,向vty通知要不要清除输出缓冲区,这对ping6是有用的,因为当用户中断ping6命令时,会调用ping6命令挂在cli->callback上的回调函数,而此函数还要作一个统计数据输出给用户,所以当它将cli->status设成CLI_NO_CLEAR_BUFF时,在调用了c

29、li->callback后,vty_read()函数是不会清除输出缓冲区内内容的。(2) Struct vty结构中增加字段的说明char zebos_icp_cmd_sync_flag; char zebos_icp_cmd_sync_no;char zebos_icp_msg_flag;Icp_zebos_msg icp_zebos_msg;u_char zebos_icp_telnet;/*用于区别是从icp还是用户直接登录*/增加的字段都是用户支持icp协议的。zebos_icp_cmd_sync_flagzebos_icp_cmd_sync_no当icp进程发一条命令过来时,就

30、会在命令串前带一个ICP_ZEBOS_CMD_STRING_INPUT_SIGNAL信令,后紧跟一个命令序列号, zebos_icp_cmd_sync_flag用于标识现在进入命令输入串接收状态,zebos_icp_cmd_sync_no则是记录传过来命令序列号,不过这个设计已经意义不大,完全可以去掉。zebos_icp_msg_flagicp_zebos_msg;当icp进程发一条信令消息给imi vty时,会在消息前带一个ICP_ZEBOS_MSG_SIGNAL信令,zebos_icp_msg_flag就是标识现在进入信令消息接收状态,icp_zebos_msg;则是缓存整条消息的,便于消

31、息接收完的后序处理。zebos_icp_telnet当icp打开imi vty时,imi vty会立即推送出去banner,及一些telnet协商选项时,然后就处于命令接收状态,当icp进程收到IAC WILL ECHO协商选项时,便可推测出imi vty进入了命令接收状态,这时icp进程会立即发一个ICP_ZEBOS_ICP_TELNET_SIGNAL信令,当imi vty收到此信令后,就会将vty->zebos_icp_telnet置位,从而imi vty进入icp协议状态,不再使用telnet协议。(3) 各个信令或信令消息的处理其它注意问题1修改imi vty的端口号在zebos

32、中,修改imi vty的端口号在imi.h中定义为IMIVTYPORT,所以要修改IMIVTYPORTt的值,要同步修改ZEBOS_SERVER_PORT才能使网管代理工作正常。2关于调试版本的调试信息的输出 在ipv6_cmd_proxy中,定义了三个宏,#define ICP_PRINTF printf#define ICP_DEBUG_PRINTF printf#define ICP_ERROR_PRINTF printf其中当把ICP_DEBUG_PRINTF定义为空时,即#define ICP_DEBUG_PRINTF,则shell下就没有调试信息了,反之#define ICP_DEBUG_PRINTF printf则出现调试信息。请不要把#define ICP_PRI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论