欢迎来到天天文库
浏览记录
ID:33689695
大小:64.93 KB
页数:15页
时间:2019-02-27
《ppp驱动程序的基本原理》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、ppp驱动程序的基木原理1)ppp设备是指在点对点的物理链路之间使用ppp帧进行分组交换的内核网络接口设备,由于Linux内核将串行设备作为终端设备來驱动,于是引入PPP终端规程來实现终端设备与PPP设备的接口.根据终端设备的物理传输特性的不同,PPP规程分为异步规程(N_PPP)和同步规程(N_SYNC_PPP)两种,对于普通串口设备使用异步PPP规程.2)在PPP驱动程序中,每一tty终端设备对应于一条PPP传输通道(chanell),每一ppp网络设备対应于一个PPP接口单元(unit).从终端设备上接收到的数据流通过PPP
2、传输通道解码后转换成PPP帧传递到PPP网络接口单元,PPP接口单元再将PPP帧转换为PPP设备的接收帧.反Z,当PPP设备发射数据帧时,发射帧通过PPP接口单元转换成PPP帧传递给PPP通道,PPP通道负责将PPP帧编码后写入终端设备.在配置了多链路PPP时(CONFIG_PPP_MULTILINK),多个PPP传输通道可连接到同一PPP接口单元.PPP接口单元将PPP帧分割成若干个片段传递给不同的PPP传输通道,反乙PPP传输通道接收到的PPP帧片段被PPP接口单元重组成完整的PPP帧.3)在Linux-2.4屮,应用程序可通
3、过字符设备/dev/ppp监控内核PPP驱动程序.用户可以用ioctl(PPPIOCATTACH)将文件绑定到PPP接口单元上,来读写PPP接口单元的输出帧,也可以用ioctl(PPPIOCATTCHAN)将文件绑定到PPP传输通道上,来读写PPP传输通道的输入帧.4)PPP传输通道用channel结构描述,系统屮所有打开的传输通道在all_channels链表屮.PPP接口单元用ppp结构描述,系统中所有建立的接口单元在all_ppp_units链表中.当终端设备的物理链路连接成功后,用户使用ioctl(TIOCSETD)将终端
4、切换到PPP规程.PPP规程初始化时,将建立终端设备的传输通道和通道驱动结构.对于界步PPP规程來说,通道驱动结构为asyncppp,它包含通道操作表async_ops.传输通道和接口单元各自包含自己的设备文件(/dev/ppp)参数结构(ppp.file).;drivers/char/tty_io.c:inttty_register_ldisc(intdisc,structttyjdisc*new_ldisc){if(disc5、6、disc>=NR_LDISCS)return-EINVAL;if(newjdisc){l7、discsfdiscl=*new」disc;ldiscs[disc].flags8、=LDISC_FLAG_DEFINED;ldiscs[disc].num=disc;}elsememset(&ldiscs[disc],0,sizeof(structttyjdisc));return0;inttty_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg){structtty_struct*tty,*real_tty;intretval;tty=(9、structtty_struct*)file->private_data;if(tty_paranoia_check(tty,inode->i_rdev,ntty_ioctlu))return-EINVAL;real_tty=tty;if(tty->driver.type==TTY_DRIVER_TYPE_PTY&&tty->driver.subtype==PTY_TYPE_MASTER)real_tty=tty->link;switch(cmd){•••caseTIOCGETD:returnput_user(tty->ldisc10、.num,(int*)arg);caseTIOCSETD:returntiocsetd(tty,(int*)arg);•••}if(tty->drive匚ioctl){intretval=(tty->driver.ioctl)(tty,file,cmd,arg);if(retval!=-ENOIOCTLCMD)returnretval;}if(tty->ldisc.ioctl){intretval=(tty->ldisc.ioctl)(tty,file,cmd,arg);讦(retval!=-ENOIOCTLCMD)returnr11、etval;}return-EINVAL;staticinttiocsetd(structtty_struct*tty,int*arg){intretval,ldisc;retval=get_user(ldisc,arg);if(retval)re
5、
6、disc>=NR_LDISCS)return-EINVAL;if(newjdisc){l
7、discsfdiscl=*new」disc;ldiscs[disc].flags
8、=LDISC_FLAG_DEFINED;ldiscs[disc].num=disc;}elsememset(&ldiscs[disc],0,sizeof(structttyjdisc));return0;inttty_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg){structtty_struct*tty,*real_tty;intretval;tty=(
9、structtty_struct*)file->private_data;if(tty_paranoia_check(tty,inode->i_rdev,ntty_ioctlu))return-EINVAL;real_tty=tty;if(tty->driver.type==TTY_DRIVER_TYPE_PTY&&tty->driver.subtype==PTY_TYPE_MASTER)real_tty=tty->link;switch(cmd){•••caseTIOCGETD:returnput_user(tty->ldisc
10、.num,(int*)arg);caseTIOCSETD:returntiocsetd(tty,(int*)arg);•••}if(tty->drive匚ioctl){intretval=(tty->driver.ioctl)(tty,file,cmd,arg);if(retval!=-ENOIOCTLCMD)returnretval;}if(tty->ldisc.ioctl){intretval=(tty->ldisc.ioctl)(tty,file,cmd,arg);讦(retval!=-ENOIOCTLCMD)returnr
11、etval;}return-EINVAL;staticinttiocsetd(structtty_struct*tty,int*arg){intretval,ldisc;retval=get_user(ldisc,arg);if(retval)re
此文档下载收益归作者所有