知识大全 在Linux下使用ISDN拨号上网
Posted 文件
篇首语:哪里有天才,我是把别人喝咖啡的功夫,都用在工作上的。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在Linux下使用ISDN拨号上网相关的知识,希望对你有一定的参考价值。
在Linux下使用ISDN拨号上网 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
作 者 张中华 任务 在一台Linux机器上 通过ISDN拨号上网 经过尝试 我成功地做到了这一点 我的配置为 蓝点Linux Kernel isdn linux v pre 上海贝尔生产的ISDN内置卡 型号为SBT 下面介绍具体做法 介绍顺序为 内核 >isdn linux安装 >拨号配置 >测试 内核 上海贝尔SBT 型ISDN内置卡 使用的芯片为Winbond W 这是一种与西门子HiSax驱动程序兼容的芯片 该卡是即插即用的 无需手工设定中断请求号和I/O地址 要Linux内核支持这种卡 在编译内核时 必须选中下列选项 ISDN Support Support synchronous PPP (多数ISDN设备拨号上网都是使用同步PPP方式) Hisax SiemensChipset driver support Hisax Support for DSS (绝大多数ISDN设备使用的协议都是DSS ) Hisax Support for Winbond W 但我不必急于编译内核 如果现有的内核已经包含这些选项了 我又何必重复一遍呢 那我怎么知道现有内核是否已经包含这些选项了呢?看内核编译配置文件/usr/src/nfig(注意 文件名以 开头的文件是隐藏文件 要用ls a才可看到 )我看到其中有下面这 行内容 对应于刚才的 个选项 CONFIG_ISDN=m CONFIG_ISDN_PPP=y CONFIG_ISDN_DRV_HISAX=m CONFIG_HISAX_EURO=y CONFIG_HISAX_W =y =y 表示内核直接支持(代码已链入内核中) =m 表示模块支持(代码在另外的内核中 可由内核载入) 于是这就表明 蓝点Linux 的原有内核已包含这些选项了 我就不用重新编译内核啦 isdn linux安装 欲配置ISDN 要用到isdn linux这一套软件 isdn linux的主要文件有isdnctrl ipppd等 获取isdn linux源码的地址为 取得的文件为isdn k utils v pre tar gz 放于/usr/src目录下 进入/usr/src目录中 开始安装过程 进入/usr/src cd /usr/src 解开压缩文件 tar xzvf isdn k utils v pre tar gz 命令完成后多了一个子目录isdn k utils isdn linux的源码文件就在其中 进入该子目录 cd isdn k utils 该目录中的README文件详细介绍了如何安装isdn linux 照章行事即可 进行配置 make config 不做任何改变 用缺省的即可 开始编译 make 未能通过 失败原因是linux/autoconf h文件或目录不存在 这个文件就是/usr/include/linux/autoconf h文件 一查确实不存在 它是在编译内核的时候生成的 而我并未编译内核 所以当然没有了 好吧 想办法生成它吧 到linux目录并进行配置 cd /usr/src/linux make menuconfig 不做任何改变 退出 保存即可 此时一看 /usr/include/linux/autoconf h文件出来了 这就够了 不必真的去编译内核 回到isdn linux目录再编译 cd /usr/src/isdn k utils make 刚才的问题没有了 但还是未能通过 失败原因是capi /capi c文件中下面几个符号未定义 CAPI_GET_FLAGS CAPI_SET_FLAGS CAPI_CLR_FLAGS CAPI_NCCI_GETUNIT CAPI_NCCI_OPENCOUNT 对应的一段源代码为 int capi ext_get_flags(unsigned ApplID unsigned *flagsptr) if (ioctl(applid fd(ApplID) CAPI_GET_FLAGS flagsptr) < ) return CapiMsgOSResourceErr; return CapiNoError; int capi ext_set_flags(unsigned ApplID unsigned flags) if (ioctl(applid fd(ApplID) CAPI_SET_FLAGS &flags) < ) return CapiMsgOSResourceErr; return CapiNoError; int capi ext_clr_flags(unsigned ApplID unsigned flags) if (ioctl(applid fd(ApplID) CAPI_CLR_FLAGS &flags) < ) return CapiMsgOSResourceErr; return CapiNoError; char * capi ext_get_tty_devname(unsigned applid unsigned ncci char *buf size_t size) int unit; unit = ioctl(applid fd(applid) CAPI_NCCI_GETUNIT &ncci); if (unit < 0) return 0; snprintf(buf, size, "/dev/capi/%d", unit); return buf; char * capi20ext_get_raw_devname(unsigned applid, unsigned ncci, char *buf, size_t size) int unit; unit = ioctl(applid2fd(applid), CAPI_NCCI_GETUNIT, &ncci); if (unit < 0) return 0; snprintf(buf, size, "/dev/capi/r%d", unit); return buf; int capi20ext_ncci_opencount(unsigned applid, unsigned ncci) return ioctl(applid2fd(applid), CAPI_NCCI_OPENCOUNT, &ncci); 作者未定义它们,我也不知道这几个常量该是多少,怎么办?我从capi20/capi20.h文件中发现,这几个函数是" extentions functions (no standard functions)",扩展的非标准函数,我猜测,这几个函数即使功能不正确,也不会影响ISDN的使用,那么,我就可以把那几个未定义的符号注解起来,使编译通过。.wiNgwIT.Com修改源码如下: int capi20ext_get_flags(unsigned ApplID, unsigned *flagsptr) // if (ioctl(applid2fd(ApplID), CAPI_GET_FLAGS, flagsptr) < 0) // return CapiMsgOSResourceErr; return CapiNoError; int capi20ext_set_flags(unsigned ApplID, unsigned flags) // if (ioctl(applid2fd(ApplID), CAPI_SET_FLAGS, &flags) < 0) // return CapiMsgOSResourceErr; return CapiNoError; int capi20ext_clr_flags(unsigned ApplID, unsigned flags) // if (ioctl(applid2fd(ApplID), CAPI_CLR_FLAGS, &flags) < 0) // return CapiMsgOSResourceErr; return CapiNoError; char * capi20ext_get_tty_devname(unsigned applid, unsigned ncci, char *buf, size_t size) int unit; // unit = ioctl(applid2fd(applid), CAPI_NCCI_GETUNIT, &ncci); if (unit < 0) return 0; snprintf(buf, size, "/dev/capi/%d", unit); return buf; char * capi20ext_get_raw_devname(unsigned applid, unsigned ncci, char *buf, size_t size) int unit; // unit = ioctl(applid2fd(applid), CAPI_NCCI_GETUNIT, &ncci); if (unit < 0) return 0; snprintf(buf, size, "/dev/capi/r%d", unit); return buf; int capi20ext_ncci_opencount(unsigned applid, unsigned ncci) // return ioctl(applid2fd(applid), CAPI_NCCI_OPENCOUNT, &ncci); return 0; 再次编译: make 通过了,接着安装: make install 命令完成后,isdnctrl和ipppd被拷到/sbin目录下。 3、 拨号配置 我看了一些别人写的介绍文章,取用他们写好的例子,修改其中的电话号码,用户名等必须修改的相关内容,然后运行。不幸的是,通常都不能成功。因为这些例子都比较完善而复杂,因此难免和我的配置情况不符合而出错。我决定从简单入手,只进行最基本最必要的配置,先不写成shell文件,而是一条命令一条命令地输入执行,仔细理解其意义,查看其执行结果。等全部试验成功后,再写成shell文件。现在看来,这种做法非常有效,我会同样来处理类似的问题。 echo 1 > /proc/sys/net/ipv4/ip_dynaddr 拨号上网大部分都是使用动态IP地址,比如我上163网,只知道拨打163号码,并不知道远程服务器(即中国电信机房内的163拨号服务器)的IP地址是多少,也不知道它会给我的机器分配什么IP地址。往/proc/sys/net/ipv4/ip_dynaddr中写入"1",就是告诉内核要使用动态IP地址。 modprobe hisax type=36 protocol=2 装入ISDN卡的驱动程序。前面已经说过,上海贝尔SBT6021型ISDN内置卡中使用的芯片W6692是由HiSax驱动程序驱动的,type=36指明了是使用W6692芯片,protocol=2指明了ISDN协议是用DSS1,详细内容可看/usr/src/linux/Documentation/isdn/README.HiSax文件。 isdnctrl addif ippp0 ISDN通过同步PPP方式上网,其对应的Interface会是/dev/ippp0, /dev/ippp1, ...等。这条命令告诉内核,加入ippp0这个Interface,换句话说,告诉内核我有个ISDN设备,准备通过同步PPP方式上网。从此以后,ippp0就代表了我的ISDN设备。 isdnctrl addphone ippp0 out 163 指明拨出的电话号码,我拨出的是163,在中国大陆,通过中国电信上网的大部分也都是163。 isdnctrl eaz ippp0 3382460 指明我自己这台ISDN的电话号码为3382460。 cha138/Article/program/Oracle/201311/16512相关参考