在uclinux上使用pppoe拨号

本文详细介绍了在uCLinux上使用pppoe拨号的全过程,包括实验环境搭建、内核配置、软件编译、配置文件准备、ramdisk制作、拨号过程及故障排查等关键步骤。

在uclinux上使用pppoe拨号

早年写的笔记,压箱底了,翻出来晒晒


目          录

在uclinux上使用pppoe拨号...1

实验环境...1

配置uclinux内核...2

编译pppd和ra-pppoe.3

编译pppd.3

编译ra-pppoe.4

准备配置文件...5

制作ramdisk.5

准备文件...5

开始制作ramdisk.6

在IXDP425上启动pppoe.7

使用pppoe拨号的摸索...8

建立windows xp pppoe server8

查看syslogd日志来debug系统自带pppoe.10

用\ \代替编译选项空格...12

使用strip减小程序...14

strip同名文件...14

编译rp-pppoe.14

运行pppd.16

加入打印信息__FUNCTION__,__FILE__,__LINE__.17

清空syslogd.17

板子实际连接modem..18

 

实验环境

u  IXDP425 266Mhz 64M ram16M flash

u  FC4: kernel 2.6.11-1.1369_FC4smp(FC6 也行),安装在虚拟机上

u  arm-linux-tools-20051123.tar.gz: gcc 3.4.4编译器

u  snapgear-3.5.0.tar.gz:snapgear 发布的uClinux 包

u  snapgear-modules-20071004.sh: snapgear 发布的uClinux 包

u  Kernel files in /home/linuxuser/snapgear

u  编译器在/home/linuxuser/usr/

u  rp-pppoe-3.10.tar.gz

u  ppp-2.4.4.tar.gz

u  RASPPPOE_098B.ZIP

 

 

配置uclinux内核

       先按照前面几章的内容配置内核,需要加上以太网的支持。在此基础上添加ppp的选项。uclinux2.4和uclinux2.6的配置非常的类似,下面的实验以uclinux2.6为例。

 

1.     选择Kernel/Library/Defaults Selection ---> Customize Kernel Settings (NEW)

2. 选择Device Drivers  --->Network device support  --->PPP(point-to-point protocol) support --->PPP (point-to-point protocol) support。选中之后会出现很多ppp的选项,在此全部选中就行了。

选择好以后编译内核就行了,得到ramdisk和zImage。

 

编译pppd和ra-pppoe

       在snapgear-3.5.0.tar.gz的uclinux里面,本来是自带了pppd和ra-pppoe的,但是版本非常的老旧,在做模拟实验的过程中,经常有pppoe选项不支持。最新版的uclinux里面带的这两个程序是比较新的版本,但是这里以snapgear-3.5.0.tar.gz作为基础进行实验。

 

编译pppd

1.     解压ppp-2.4.4.tar.gz到/home/linuxuser/pppoe/ppp-2.4.4good

2.     进入/home/linuxuser/pppoe/ppp-2.4.4good目录,执行

./configure --host=arm-linux--build=i686-pc-linux-gnu --target=arm-linux

3.     修改makefile

利用configure生成的makefile都不适用于交叉编译。所以需要作出修改。

如果需要全部编译的话,一共有9个makefile文件需要修改,虽然最后实际上只需要pppd文件和chat文件。

ppp-2.4.4good/

ppp-2.4.4good/chat

ppp-2.4.4good/pppd/plugins

ppp-2.4.4good/pppd/plugins/rp-pppoe

ppp-2.4.4good/pppd/plugins/radius

ppp-2.4.4good/pppd/plugins/pppoatm

ppp-2.4.4good/pppd

ppp-2.4.4good/pppstats

ppp-2.4.4good/pppdump

       修改的方法非常简单,就是在每个makefile里面加入以下语句

C_FLAGS +=-mbig-endian  -Wall -Wstrict-prototypes-O -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32-D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps

 

CC=/home/linuxuser/snapgear/tools/ucfront-gccarm-linux-gcc

CC+=$(C_FLAGS)

 

需要注意的是,一般情况下将这段语句复制到makefile最前面,但是如果在makefile里面发现C_FLAGS=或者CC的定义,那么必须将这段话复制到这些定义的后面。因为这些定义会把新加入的语句覆盖掉。

 

4.     编译

执行下面两个命令

#cd /home/linuxuser/pppoe/ppp-2.4.4good

#make

 

编译完之后会在ppp-2.4.4good/chat/下生成chat,在ppp-2.4.4good/pppd/下面得到pppd。

 

编译ra-pppoe

1.     解压rp-pppoe-3.10.tar.gz到/home/linuxuser/pppoe/rp-pppoe-3.10good

2.     进入/home/linuxuser/pppoe/rp-pppoe-3.10good/src目录,执行

./configure --host=arm-linux--build=i686-pc-linux-gnu --target=arm-linux

3.     修改makefile:

一共有两个makefile需要修改,分别在

/rp-pppoe-3.10good/src/libevent

/rp-pppoe-3.10good/src

 

在/rp-pppoe-3.10good/src/makefile会发现下面的指令

pppoe: pppoe.o if.o debug.o common.o ppp.odiscovery.o

       gcc-o pppoe pppoe.o if.o debug.o common.o ppp.o discovery.o

将两个makefile里所有的类似的语句里的gcc全部替换成$(CC)。

 

然后加入下面的语句:

C_FLAGS +=-mbig-endian  -Wall -Wstrict-prototypes-O -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32-D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps

 

CC=/home/linuxuser/snapgear/tools/ucfront-gccarm-linux-gcc

CC+=$(C_FLAGS)

注意的事项和pppd的一样,一般情况下将这段语句复制到makefile最前面,但是如果在makefile里面发现C_FLAGS=或者CC的定义,那么必须将这段话复制到这些定义的后面。因为这些定义会把新加入的语句覆盖掉。

编译完之后在/rp-pppoe-3.10good/src会得到chat文件。

 

准备配置文件

       配置文件包括chap-secrets, options,pap-secrets, resolv.conf。在此假设拨号的用户名和密码都是ucppp

1.     在/home/linuxuser/pppoe/ppp-2.4.4good/etc.ppp会发现chap-secrets, options,pap-secrets三个文件。打开chap-secrets和pap-secrets,在两个文件的最后面加上"ucppp" *"ucppp"。

两个文件的内容应该如下

chap-secrets:

/********************************************/

# Secrets forauthentication using CHAP

# client    server  secret          IP addresses

"ucppp"* "ucppp"

/********************************************/

pap-secrets

/********************************************/

# Secrets forauthentication using PAP

# client    server  secret          IP addresses

"ucppp"* "ucppp"

/********************************************/

2.     新建resolv.conf,内容如下

/********************************************/

#MADE-BY-RP-PPPOE

nameserver202.106.46.151

/********************************************/

202.106.46.151是DNS的地址,要根据实际的情况修改。

 

制作ramdisk

经过上面的步骤,得到了三个可执行文件pppd, chat, pppoe。需要对这些文件进行strip以节省空间。还有一些配置文件,也需要放到ramdisk里。

准备文件

1.执行以下命令:

#cd /home/linuxuser/pppoe/ppp-2.4.4good/

#mkdir prepare_ramdisk

#mkdir 244bin

#cp /home/linuxuser/pppoe/rp-pppoe-3.10good/src/pppoe/home/linuxuser/pppoe/ppp-2.4.4good/244bin/pppoe

2. 将resolv.conf复制到/home/linuxuser/pppoe/ppp-2.4.4good/prepare_ramdisk。

3. 在/home/linuxuser/pppoe/ppp-2.4.4good/prepare_ramdisk新建rc文件,内容如下:

/********************************************/

hostname IXDP425

mount -t procproc /proc

mount -oremount,rw /dev/root /

ifconfig lo127.0.0.1

insmod/lib/modules/2.6.19-uc1/kernel/ixp425/ixp400-2.4/ixp400.ko

cat/etc/IxNpeMicrocode.dat > /dev/ixNpe

insmod/lib/modules/2.6.19-uc1/kernel/ixp425/net-2.4/ixp400_eth.ko

ifconfig ixp0 up

#ifconfig eth0192.168.1.220 broadcast 192.168.1.255 netmask 255.255.255.0

#ifconfig ixp0192.168.1.220 broadcast 192.168.1.255 netmask 255.255.255.0

route add -net127.0.0.0 netmask 255.255.255.0 lo

#dhcpcd &

cat /etc/motd

/********************************************/

4. 复制/home/linuxuser/pppoe/ppp-2.4.4good/etc.ppp文件夹到/home/linuxuser/pppoe/ppp-2.4.4good/prepare_ramdisk

 

开始制作ramdisk

       经过以上的步骤,ramdisk和zImage都已经在/tftpboot里了。

在/home/linuxuser/pppoe/ppp-2.4.4good/新建pppramdisk文件,内容如下:

/********************************************/

umount tmp

rm -rframdisk.gz

rm -rf ramdisk

make clean

make

rm -rf tmp

mkdir tmp

cp -f/tftpboot/ramdisk.gz ramdisk.gz

gunzip ramdisk

mount -o loopramdisk tmp

 

rm -rf./prepare_ramdisk/stripped

mkdir./prepare_ramdisk/stripped

cp -rf./chat/chat ./prepare_ramdisk/stripped/chat

cp -rf./pppd/pppd ./prepare_ramdisk/stripped/pppd

cp -rf./244bin/pppoe ./prepare_ramdisk/stripped/pppoe

/home/linuxuser/usr/local/arm-linux/bin/strip./prepare_ramdisk/stripped/*

/home/linuxuser/usr/local/arm-linux/bin/strip-R .comment -R .note ./prepare_ramdisk/stripped/*

cp -rf./prepare_ramdisk/stripped/* ./tmp/bin/

 

cp -rf./prepare_ramdisk/ppp ./tmp/etc/

cp -rf./prepare_ramdisk/rc ./tmp/etc/rc

cp -rf./prepare_ramdisk/resolv.conf ./tmp/etc/resolv.conf

chmod +x./tmp/etc/rc

umount tmp

gzip ramdisk

cp -rframdisk.gz /tftpboot/ramdisktest.gz

rm -rf tmp

/********************************************/

       执行pppramdisk之后,新的ramdisk就是/tftpboot/ramdisktest.gz。将ramdisktest.gz和zImage用一下命令下载到板子上。

 

load -r -v -b0x00800000 ramdisktest.gz

load -r -v -b0x01600000 zImage       

exec

 

在IXDP425上启动pppoe

将IXDP425的以太网口接上ADSLmodem,设置modem为bridge模式, 启动IXDP425后在IXDP425上执行如下命令。

#/bin/pppdpty  '/bin/pppoe -I ixp0' user ucpppdebug defaultroute&

这里ucppp是用户名,一定要用运营商提供的正确的用户名替代,否则认证会出问题。chap-secrets和pap-secrets的相应配置也一定要正确。

正确启动之后,会出现ppp0的设备。使用ifconfig命令,结果应该如下:

ixp0      Link encap:Ethernet  HWaddr 00:02:B3:01:01:01 

          UP BROADCAST RUNNING MULTICAST  MTU:1500 Metric:1

          RX packets:1983 errors:0 dropped:0overruns:0 frame:0

          TX packets:1569 errors:0 dropped:0overruns:0 carrier:0

          collisions:0 txqueuelen:256

         

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          UP LOOPBACK RUNNING  MTU:16436 Metric:1

          RX packets:0 errors:0 dropped:0overruns:0 frame:0

          TX packets:0 errors:0 dropped:0overruns:0 carrier:0

          collisions:0 txqueuelen:0

         

ppp0      Link encap:Point-to-Point Protocol 

          inet addr:x.x.x.x  P-t-P: x.x.x.x  Mask:255.255.255.255

          UP POINTOPOINT RUNNING NOARPMULTICAST  MTU:1492  Metric:1

          RX packets:1952 errors:0 dropped:0 overruns:0frame:0

          TX packets:1528 errors:0 dropped:0overruns:0 carrier:0

          collisions:0 txqueuelen:3

 

inet addr:x.x.x.x就是运营商给盒子分配的IP地址,P-t-P: x.x.x.x是对端的IP地址这个会根据实际的情况有所不同。这个时候应该已经可以上网了。 

 

 

使用pppoe拨号的摸索

建立windows xp pppoe server

用windowXP建立一个PPPOE服务器,然后使用直连线目标板和XP服务器连接起来,在目标板上对XP进行拨号测试。拨号成功后,我们再使用modern拨ISP。当然拨XP服务器和拨ISP的方法基本上是一样的。

 

1 下载RASPPPOE_098B组件

 

2 右击网上邻居,选属性,点安装,选择协议,添加,从磁盘安装,然后选择RASPPPOE_098B的目录

 

安装好组件后,你便可以在本地连接中看到ppp oever ethernet prototal

 

3, 建立一个基于ppp的传入连接(我们的目标板拨号连接XP的pppoe服务器,靠的就是这个连接)

 

1)新建网络连接->选择设置高级连接->接受传入的连接->选择REALTEK ....(这是windows网卡,各台机器不同)->允许虚拟连接

 

2)在这里你可以选择或新建一个用户用来被客户端拨号使用

 

3)一路next。

 

Windows里指定IP分配。

右键点击incomingconnections->properties.

 

注意,建立pppoeserver的机器最好只有一张网卡启用,否则可能会造成错误。

查看syslogd日志来debug系统自带pppoe

因为uclinux自带pppoe所以选中了pppd,ra-pppoe,chat。然后选上了Kernel Settings-->Device Drivers ---> Network device support --->PPP (point-to-point protocol) support  --->PPP (point-to-point protocol) support的一些选项。

准备了chap-secrets, pap-secrets, options集成在ramdisk根目录下。这个是当时受了说明的误导,后面再解释。chap-secrets和pap-secrets中的用户名和密码都是ucppp。

编译完下载到板子上运行。出错Couldn't set tty to PPP discipline: Invalid argument。

这是在内核里需要有一个pppoe的tty选项选上。选上之后编译,执行/bin/pppd出现乱码,说明成功移植了。

执行/bin/pppd pty '/bin/pppoe' user ucppp.

系统中有syslogd运行,可以通过cat /var/log/message来查看出错信息。

       错误如下:

pppoe usesobsolete (PF_INET,SOCK_PACKET)

 

5>Jan  1 00:01:12 pppd[21]: pppd 2.3.8started by (unknown), uid 0

<6>Jan  1 00:01:12 pppd[21]: Using interface ppp0

<5>Jan  1 00:01:12 pppd[21]: pppd create pidfile/var/run/ppp0.pid

<5>Jan  1 00:01:12 pppd[21]: Connect: ppp0 <-->/dev/ttyp0

<6>Jan  1 00:01:12 kernel: pppoe uses obsolete(PF_INET,SOCK_PACKET)

<3>Jan  1 00:01:12 pppoe[22]: ioctl(SIOCGIFHWADDR):No such device

<4>Jan  1 00:01:12 pppd[21]: Will not do PAP for userucppp

<4>Jan  1 00:01:12 pppd[21]: Will not do CHAP foruser ucppp

<5>Jan  1 00:01:12 pppd[21]: Modem hangup

<5>Jan  1 00:01:12 pppd[21]: Connection terminated.

<6>Jan  1 00:01:12 pppd[21]: Exit.

 

网卡找不到,先打开IXP网卡,还是出错。.

<5>Jan  1 00:01:40 pppd[37]: pppd 2.3.8started by (unknown), uid 0

<3>Jan  1 00:01:40 pppoe[38]: ioctl(SIOCGIFHWADDR):No such device

<3>Jan  1 00:01:40 pppd[37]: Couldn't get channelnumber: Input/output error

<3>Jan  1 00:01:40 pppd[37]: ioctl(PPPIOCGFLAGS): Badfile descriptor

<6>Jan  1 00:01:40 pppd[37]: Exit.

 

想起来pppoe可以指定用于拨号的网卡,可能默认的是eth0而不是ixp0。执行命令:

/bin/pppdpty  '/bin/pppoe -I ixp0' user ucppp&

 

出现如下信息:

<5>Jan  1 00:06:39 pppd[52]: pppd 2.3.8started by (unknown), uid 0

<6>Jan  1 00:06:39 pppd[52]: Using interface ppp0

<5>Jan  1 00:06:39 pppd[52]: pppd create pidfile/var/run/ppp0.pid

<5>Jan  1 00:06:39 pppd[52]: Connect: ppp0 <-->/dev/ttyp0

<7>Jan  1 00:06:39 pppoe[53]: PADS: Service-Name: ''

<7>Jan  1 00:06:39 pppoe[53]: PPP session is 15

<4>Jan  1 00:06:40 pppd[52]: Will not do PAP for userucppp

<4>Jan  1 00:06:40 pppd[52]: Will not do CHAP foruser ucppp

<6>Jan  1 00:06:40 pppoe[53]: Session terminated --received PADT from peer

<5>Jan  1 00:06:40 pppd[52]: Modem hangup

<5>Jan  1 00:06:40 pppd[52]: Connection terminated.

<6>Jan  1 00:06:40 pppd[52]: Exit.

 

没有什么头绪,发现pppoe有debug选项,打开再看看。输入

/bin/pppdpty  '/bin/pppoe -I ixp0' user ucpppdebug&

错误信息如下:

<7>Jan  1 02:33:40 pppd[46]: sent [LCP ConfReq id=0x1<mru 1492> <asyncmap 0x0> <magic 0x37689ca6> <pcomp><accomp>]

<7>Jan  1 02:33:40 pppd[46]: rcvd [LCP ConfReq id=0x0<mru 1492> <auth chap 81> <magic 0x76bd6a17> < 0d 03 06> < 11 04 06 4e>< 

<7>Jan  1 02:33:40 pppd[46]: lcp_reqci: rcvd unknownoption 13

<7>Jan  1 02:33:40 pppd[46]: lcp_reqci: rcvd unknownoption 17

<7>Jan  1 02:33:40 pppd[46]: lcp_reqci: rcvd unknownoption 19

<7>Jan  1 02:33:40 pppd[46]: lcp_reqci: rcvd unknownoption 23

<7>Jan  1 02:33:40 pppd[46]: lcp_reqci: returningCONFREJ.

<7>Jan  1 02:33:40 pppd[46]: sent [LCP ConfRej id=0x0<auth chap 81> < 0d 03 06> < 11 04 06 4e> < 13 17 01 02 93fe c4 24 eb 4a 

<7>Jan  1 02:33:40 pppd[46]: rcvd [LCP ConfRej id=0x1<pcomp> <accomp>]

<7>Jan  1 02:33:40 pppd[46]: sent [LCP ConfReq id=0x2<mru 1492> <asyncmap 0x0> <magic 0x37689ca6>]

<7>Jan  1 02:33:40 pppd[46]: rcvd [LCP TermReq id=0x1"v\275j\027\000<\315t\000\000\003\227"]

<7>Jan  1 02:33:40 pppd[46]: sent [LCP TermAckid=0x1]

<6>Jan  1 02:33:40 pppoe[47]: Session terminated --received PADT from peer

<5>Jan  1 02:33:40 pppd[46]: Modem hangup

<5>Jan  1 02:33:40 pppd[46]: Connection terminated.

<6>Jan  1 02:33:40 pppd[46]: Exit

 

发现是有几个field程序无法识别,估计是版本太低或者编译的时候出的问题。

通过wireshark抓包看到这几个选项的含义。

option 13:callback

option 17:stac electronics LZS

option 19:multilink endpoint discriminator

option 23:link discriminator for BACP

 

查看snapgear里的pppd源码,lcp.h里面有定义,只支持以下的选项:

#define CI_MRU     1   /*Maximum Receive Unit */

#defineCI_ASYNCMAP 2   /* Async Control Character Map */

#defineCI_AUTHTYPE 3   /* Authentication Type */

#defineCI_QUALITY 4   /* Quality Protocol */

#defineCI_MAGICNUMBER 5   /* Magic Number */

#defineCI_PCOMPRESSION 7   /* Protocol Field Compression */

#defineCI_ACCOMPRESSION 8 /* Address/ControlField Compression */

#defineCI_CALLBACK 13  /* callback */

所以根本不可能握手,支持的协议有差别,options13, 17, 19, 23根本不支持,而且也不是配置的问题了。

       检查最新的uclinux,发现有最新版的pppd2.4。也许这个能支持新的option. 先检查源码。另外rp-pppoe也有版本的问题.

 

而在uclinux2007里面,发现了lcp.h的定义

#defineCI_VENDOR  0   /* Vendor Specific */

#define CI_MRU     1   /*Maximum Receive Unit */

#define CI_ASYNCMAP 2   /*Async Control Character Map */

#defineCI_AUTHTYPE 3   /* Authentication Type */

#defineCI_QUALITY 4   /* Quality Protocol */

#defineCI_MAGICNUMBER 5   /* Magic Number */

#defineCI_PCOMPRESSION 7   /* Protocol Field Compression */

#define CI_ACCOMPRESSION8 /* Address/Control Field Compression */

#defineCI_FCSALTERN   9   /* FCS-Alternatives */

#define CI_SDP     10  /*Self-Describing-Pad */

#defineCI_NUMBERED 11  /* Numbered-Mode */

#defineCI_CALLBACK 13  /* callback */

#define CI_MRRU    17  /*max reconstructed receive unit; multilink */

#define CI_SSNHF   18  /*short sequence numbers for multilink */

#defineCI_EPDISC  19  /* endpoint discriminator */

#defineCI_MPPLUS  22  /* Multi-Link-Plus-Procedure */

#define CI_LDISC   23  /*Link-Discriminator */

#define CI_LCPAUTH 24  /* LCPAuthentication */

#define CI_COBS    25  /*Consistent Overhead Byte Stuffing */

#defineCI_PREFELIS 26  /* Prefix Elision */

#defineCI_MPHDRFMT 27  /* MP Header Format */

#define CI_I18N    28  /*Internationalization */

#define CI_SDL     29  /*Simple Data Link */

 

所以这个版本应该是支持的。尝试直接编译这个新版的pppd。

投机取巧的方法,在uclinx-dist-20080808下,打了uclinx-dist-20080808-20090302.patch补丁的情况下编译了全部的代码。从ramdisk里面提取了pppd, pppoe, chat可执行文件。尝试一下. 程序崩溃,应该是uclibc不一致的原因。看来必须独立编译了.

 

用\ \代替编译选项空格

       将uclinx-dist-20080808的pppd复制出来编译。修改makefile

CFLAG = -mbig-endian-I/home/linuxuser/snapgear/linux-2.6.x/include -Wall -Wstrict-prototypes -O -fno-strict-aliasing -fno-common -Uarm-fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale-malignment-traps

       执行

make CC=/home/linuxuser/snapgear/tools/ucfront-gcc\\arm-linux-gcc

       因为使用uclibc库的原因,ucfront-gcc和arm-linux-gcc有空格,必须用\ \才行。

make[1]:Entering directory `/home/linuxuser/pppoe/ppp2311/pppd/build/pppd'

/home/linuxuser/snapgear/tools/ucfront-gccarm-linux-gcc -mbig-endian -I/home/linuxuser/snapgear/linux-2.6.x/include -Wall -Wstrict-prototypes -O-fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32-D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps  -DHAVE_PATHS_H -DIPX_CHANGE -DHAVE_MMAP-I../include '-DDESTDIR="/usr/local"' -DCHAPMS=1 -DHAVE_CRYPT_H=1-DUSE_CRYPT=1 -DHAVE_MULTILINK -DUSE_TDB=1 -DPLUGIN -DMAXOCTETS -DUSE_LASTLOG-mbig-endian -I/home/linuxuser/snapgear/linux-2.6.x/include  -Wall -Wstrict-prototypes -O-fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32-D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps  -DHAVE_PATHS_H -DIPX_CHANGE -DHAVE_MMAP-I../include '-DDESTDIR="/usr/local"' -DCHAPMS=1 -DHAVE_CRYPT_H=1-DUSE_CRYPT=1 -DHAVE_MULTILINK -DUSE_TDB=1 -DPLUGIN -DMAXOCTETS-DUSE_LASTLOG   -c -o sys-linux.osys-linux.c

In file includedfrom /home/linuxuser/snapgear/include/include-linux/linux/netdevice.h:28,

                 from/home/linuxuser/snapgear/linux-2.6.x/include/net/dst.h:11,

                 from/home/linuxuser/snapgear/linux-2.6.x/include/net/route.h:27,

                 from sys-linux.c:109:

/home/linuxuser/snapgear/include/include-linux/linux/if.h:26:1:warning: "IFNAMSIZ" redefined

In file includedfrom sys-linux.c:107:

/home/linuxuser/snapgear/uClibc/include/net/if.h:130:1:warning: this is the location of the previous definition

In file includedfrom /home/linuxuser/snapgear/include/include-linux/linux/netd

 

原因在于,应用程序根本不应该include kernel的文件。实际上sys-linux.c想-I../include而已,刚好有个文件和kernel的一个include文件相同。因为CFLAGS也是复制过来,没有仔细检查。make的时候会建立build文件夹。因为担心uclinx-dist-20080808对pppd做了修改以编译集成编译,而且pppd的readme也讲到独立源码包的编译方法,所以从pppoe的官方网站上下了了最新的稳定版本ppp-2.4.4.tar.gzhttp://ppp.samba.org/ppp/download.html

结果对比发现,源码和uclinx-dist-20080808打了补丁后的一样。但是uclinx-dist-20080808修改了配置,编译器起来很不方便,决定采用ppp-2.4.4.tar.gz

uclinx-dist-20080808里包含的pppd编译的时候会先生成build文件夹,实际的编译在这里面完成。而下载的源码包不会这样。顶层的makefile文件里${Mflag}也没有任何内容,不能向各个makefile传递编译参数,所以直接修改了各个层次的makefile。

pppd下自带了rp-pppoe。问题在于rp-pppoe的编译,按照正常编译完只能生成pppoe-discovery,并不能生成pppoe文件。怀疑是uclinux编译的时候仅仅改了名字而已,但是对比ramdisk里的和rp-pppoe下面的这个两个文件,发现大小不一样,不能确认。也许是strip的原因。

使用strip减小程序

       strip经常用来去除目标文件中的一些符号表、调试符号表信息,以减小程序的大小,在rpmbuild包的最后就用到。无论是静态库(libcmp.a)还是动态库(libcmp.so)还是可执行文件(test),去掉一些符号信息后都减小了很多,但如果这时再链接 这两个库的话是编不过的,因此,如果不是指定特殊的strip选项的话,还是尽量不要对库文件strip,只对链接后的可执行文件strip就可以了(如果也不调试)。

 

使用file命令将ramdisk下编译的文件和/home/linuxuser/snapgear/user进行对比,发现如下差别:

 

#from ramdisk

./new/chat:  ELF 32-bit MSB executable, ARM, version 1(ARM), dynamically linked (uses shared libs), stripped

./new/pppd:  ELF 32-bit MSB executable, ARM, version 1(ARM), dynamically linked (uses shared libs), stripped

./new/pppoe: ELF32-bit MSB executable, ARM, version 1 (ARM), dynamically linked (uses sharedlibs), stripped

 

#from build folder

/home/linuxuser/pppoe/uc07ppd/buildbin/chat:           ELF 32-bit MSB executable, ARM,version 1 (ARM), dynamically linked (uses shared libs), not stripped

/home/linuxuser/pppoe/uc07ppd/buildbin/pppd:           ELF 32-bit MSB executable, ARM,version 1 (ARM), dynamically linked (uses shared libs), not stripped

/home/linuxuser/pppoe/uc07ppd/buildbin/pppoe-discovery:ELF 32-bit MSB executable, ARM, version 1 (ARM), dynamically linked (usesshared libs), not stripped

strip同名文件

       交叉编译中注意的是,交叉编译器有sttrip,host系统也有,所以注意使用arm-linux-strip或者使用/home/linuxuser/usr/local/arm-linux/bin/strip来指定。

编译rp-pppoe

在编译uclinux的时候发现打印信息:

make[2]:Entering directory `/home/linuxuser/skyeye/uClinux-dist/user/rp-pppoe'

romfs-inst.sh /bin/pppoe

原来系统使用的pppoe并不是从/home/linuxuser/skyeye/uClinux-dist/user/rp-pppoe里面拿到的,而是单独的有rp-pppoe目录。找到/rp-pppoe/changes和rp-pppoe.spec文件检查版本显示为2.3.。官方网站的链接也有。在其他一些网站上找到的有3.5,3.7和3.8版本。到sourceforge上去找最新的rp-pppoe.。最新的版本为3.1,并且有官方网站的链接证明。决定先使用3.1版本的试试。

执行:

./configure--host=arm-linux --build=i686-pc-linux-gnu --target=arm-linux

       修改rp-pppoe-3.10good/src下的makefile。gcc全部替换成$(CC)。然后加入下面的语句:

C_FLAGS +=-mbig-endian  -Wall -Wstrict-prototypes-O -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32-D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps

 

CC=/home/linuxuser/snapgear/tools/ucfront-gccarm-linux-gcc

CC+=$(C_FLAGS)

之后编译发现如下错误:

make[1]:Entering directory `/home/linuxuser/pppoe/rp-pppoe-3.10/src/libevent'

gcc -g -O2 -Wall-Wstrict-prototypes -I..  -c -o event.oevent.c

gcc -g -O2 -Wall-Wstrict-prototypes -I..  -c -oevent_tcp.o event_tcp.c

gcc -g -O2 -Wall-Wstrict-prototypes -I..  -c -o hash.ohash.c

gcc -g -O2 -Wall-Wstrict-prototypes -I..  -c -oevent_sig.o event_sig.c

rm -f libevent.a

ar -cqlibevent.a event.o event_tcp.o hash.o event_sig.o

ranlib libevent.a

make[1]: Leavingdirectory `/home/linuxuser/pppoe/rp-pppoe-3.10/src/libevent'

/home/linuxuser/snapgear/tools/ucfront-gccarm-linux-gcc -mbig-endian -Wall-Wstrict-prototypes -O -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe-mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps-o pppoe-server  pppoe-server.o if.odebug.o common.o md5.o   -Llibevent-levent

/home/linuxuser/skyeye/usr/local/bin/../lib/gcc/arm-linux/3.4.4/../../../../arm-linux/bin/ld:skipping incompatible libevent/libevent.a when searching for -levent

/home/linuxuser/skyeye/usr/local/bin/../lib/gcc/arm-linux/3.4.4/../../../../arm-linux/bin/ld:cannot find -levent

collect2: ldreturned 1 exit status

make: ***[pppoe-server] Error 1

makefile has notbeen changed.

 

原来在src下还有一个子目录libevent,那里面也有一个makefile,一起修改完之后就编译通过。

运行pppd

       运行是发生如下错误。

<5>Jan  100:02:43 pppd[38]: pppd 2.4.4 started by root, uid 0

<7>Jan  100:02:43 pppd[38]: using channel 1

<6>Jan  100:02:43 pppd[38]: Using interface ppp0

<5>Jan  100:02:43 pppd[38]: Connect: ppp0 <--> /dev/ttyp0

<7>Jan  100:02:43 pppoe[39]: PADS: Service-Name: ''

<6>Jan  100:02:43 pppoe[39]: PPP session is 13 (0xd)

<7>Jan  100:02:44 pppd[38]: sent [LCP ConfReq id=0x1 <mru 1492> <asyncmap0x0> <magic 0xbfd31e15> <pcomp> <accomp>]

<7>Jan  100:02:44 pppd[38]: rcvd [LCP ConfReq id=0x0 <mru 1492> <auth chapMS-v2> <magic 0x1ece5b17> <callback CBCP> <mrru 1614><endpoint [local:21.ea.01.40.37.ca.42.35.99.a2.a4.ef.b8.80.b9.f9.00.00.00.00]>< 17 04 00 05>]

<7>Jan  100:02:44 pppd[38]: No auth is possible

<7>Jan  100:02:44 pppd[38]: sent [LCP ConfRej id=0x0 <auth chap MS-v2><callback CBCP> <mrru 1614> < 17 04 00 05>]

<7>Jan  100:02:44 pppd[38]: rcvd [LCP ConfRej id=0x1 <pcomp> <accomp>]

<7>Jan  100:02:44 pppd[38]: sent [LCP ConfReq id=0x2 <mru 1492> <asyncmap0x0> <magic 0xbfd31e15>]

<7>Jan  100:02:44 pppd[38]: rcvd [LCP TermReq id=0x1 1e ce 5b 17 00 3c cd 74 00 00 0397]

<7>Jan  100:02:44 pppd[38]: sent [LCP TermAck id=0x1]

<6>Jan  100:02:44 pppoe[39]: Session 13 terminated -- received PADT from peer

<6>Jan  100:02:44 pppoe[39]: Sent PADT

<5>Jan  100:02:44 pppd[38]: Modem hangup

<5>Jan  100:02:44 pppd[38]: Connection terminated.

<7>Jan  100:02:44 pppd[38]: Script /bin/pppoe finished (pid 39), status = 0x0

<6>Jan  100:02:44 pppd[38]: Exit.

 

对比发现,有一个理解错误。

mrru 1614.而在协议上显示,而在omnipeek上看到的是stac electronics LZS

auth chap MS-v2, 这个可能是reject的关键原因。

No auth is possible.

那么开启auth。还有[LCPConfRej id=0x1 <pcomp> <accomp>],使用nopcomp noaccomp。重新执行:

/bin/pppdpty  '/bin/pppoe' user ucppp mtu 1492 mru1492 debug nopcomp noaccomp&

果然,rcvd [LCPConfAck id=0x1 <mru 1492> <asyncmap 0x0> <magic 0x909e2063>]。

说明板子送给服务器的request已经被ack。唯一的问题就在于auth.

 

加入receive-all, 还是同样的错误。

看到源码里面

    ao->neg_chap = 1;

    ao->chap_mdtype = chap_mdtype_all;

    ao->neg_upap = 1;

ao->neg_eap = 1;

还有一处:

    case CI_AUTHTYPE:

        if(cilen < CILEN_SHORT ||

        !(ao->neg_upap || ao->neg_chap ||ao->neg_eap)) {

        /*

         *Reject the option if we're not willing to authenticate.

         */

        dbglog("No auth is possible");

        orc = CONFREJ;

        break;

        }

另外一处发现

//Length of eachtype of configuration option (in octets)

#defineCILEN_SHORT 4   /* CILEN_VOID + 2 */.

加入打印信息__FUNCTION__,__FILE__,__LINE__

所以可能的原因有两个,ao->neg_upap,ao->neg_chap,ao->neg_eap在初始化的时候已经赋值为1,那么cilen的问题了。

在源码里面加入打印语句。使用__FUNCTION__,__FILE__,__LINE__来帮助显示。__FUNCTION__,__FILE__,__LINE__在LINUX下的C/C++编程中,这3个变量分别为当前函数名(char *),当前文件(char *),当前行号(int)。

打印显示结果:

<7>Jan  1 00:02:22 pppd[36]: No auth is possible

<7>Jan  1 00:02:22 pppd[36]: ln 1597 cilen:5, neg_upap= 0, neg_chap = 0, neg_eap = 0

说明不是cilen的问题,不知道为什么auth的赋值都没有打开。

清空syslogd

可以使用cat null>/var/log/messages清空syslogd,让后面的信息更加明显。

 

最后只能猜测,也许是配置文件放的位置不对,因为这个是最后一个和auth相关的。查阅man手册,看到如下语句:

 

Pppd storessecrets for use in authentication in secrets files (/etc/ppp/pap-secrets forPAP, /etc/ppp/chap-secrets for CHAP, MS-CHAP, MS-CHAPv2, and EAP MD5-Challenge,and /etc/ppp/srp-secrets for EAP SRP-SHA1).

 

将ppp文件夹从ramdisk根目录移动到/etc/ppp,全部运行正常。

板子实际连接modem

/bin/pppd pty  '/bin/pppoe -I ixp0' user xxx mtu 1492 mru 1492debug&

xxx这里是实际的ADSL用户名。

# cat/var/log/messages                            

<7>Jan  1 00:11:22 pppd[59]: rcvd [LCP EchoReq id=0x3magic=0x2005401]

<7>Jan  1 00:11:22 pppd[59]: sent [LCP EchoRep id=0x3magic=0xc9901b9d]

<7>Jan  1 00:11:32 pppd[59]: rcvd [LCP EchoReq id=0x4magic=0x2005401]

<7>Jan  1 00:11:32 pppd[59]: sent [LCP EchoRep id=0x4magic=0xc9901b9d]

<7>Jan  1 00:11:42 pppd[59]: rcvd [LCP EchoReq id=0x5magic=0x2005401]

<7>Jan  1 00:11:42 pppd[59]: sent [LCP EchoRep id=0x5magic=0xc9901b9d]

<7>Jan  1 00:11:52 pppd[59]: rcvd [LCP EchoReq id=0x6magic=0x2005401]

<7>Jan  1 00:11:52 pppd[59]: sent [LCP EchoRep id=0x6magic=0xc9901b9d]

<5>Jan  1 00:11:57 pppd[68]: pppd 2.4.4 started byroot, uid 0

<7>Jan  1 00:11:58 pppd[68]: using channel 3

<6>Jan  1 00:11:58 pppd[68]: Using interface ppp1

<5>Jan  1 00:11:58 pppd[68]: Connect: ppp1 <-->/dev/ttyp1

<7>Jan  1 00:11:58 pppoe[69]: PADS: Service-Name: ''

<6>Jan  1 00:11:58 pppoe[69]: PPP session is 8526(0x214e)

<7>Jan  1 00:11:58 pppd[59]: rcvd [LCP ConfReq id=0x0<mru 1492> <auth pap> <magic 0x2004922>]

<4>Jan  1 00:11:58 pppd[59]: Warning - secret file/etc/ppp/pap-secrets has world and/or group access

<7>Jan  1 00:11:58 pppd[59]: sent [LCP ConfReq id=0x3<mru 1492> <asyncmap 0x0> <magic 0x2ddcec01> <pcomp><accomp>]

<7>Jan  1 00:11:58 pppd[59]: lcp_reqci, ln10:f->unit = 0

<7>Jan  1 00:11:58 pppd[59]: ln 1544 cilen:4

<7>Jan  1 00:11:58 pppd[59]: sent [LCP ConfNak id=0x0<auth eap>]

<7>Jan  1 00:11:58 pppd[68]: rcvd [LCP ConfReq id=0x0<mru 1492> <auth pap> <magic 0x2004922>]

<4>Jan  1 00:11:58 pppd[68]: Warning - secret file/etc/ppp/pap-secrets has world and/or group access

<7>Jan  1 00:11:58 pppd[68]: sent [LCP ConfReq id=0x1<mru 1492> <asyncmap 0x0> <magic 0x2851e7e> <pcomp> <accomp>]

<7>Jan  1 00:11:58 pppd[68]: lcp_reqci, ln10:f->unit = 0

<7>Jan  1 00:11:58 pppd[68]: ln 1544 cilen:4

<7>Jan  1 00:11:58 pppd[68]: sent [LCP ConfNak id=0x0<auth eap>]

<7>Jan  1 00:11:58 pppd[59]: rcvd [LCP ConfRej id=0x3<asyncmap 0x0> <pcomp> <accomp>]

<7>Jan  1 00:11:58 pppd[59]: sent [LCP ConfReq id=0x4<mru 1492> <magic 0x2ddcec01>]

<7>Jan  1 00:11:58 pppd[68]: rcvd [LCP ConfRej id=0x3<asyncmap 0x0> <pcomp> <accomp>]

<7>Jan  1 00:11:58 pppd[59]: rcvd [LCP ConfReq id=0x1<mru 1492> <magic 0x2004922>]

<7>Jan  1 00:11:58 pppd[59]: lcp_reqci, ln10:f->unit = 0

<7>Jan  1 00:11:58 pppd[59]: ln 1544 cilen:4

<7>Jan  1 00:11:58 pppd[59]: sent [LCP ConfAck id=0x1<mru 1492> <magic 0x2004922>]

<7>Jan  1 00:11:58 pppd[68]: rcvd [LCP ConfReq id=0x1<mru 1492> <magic 0x2004922>]

<7>Jan  1 00:11:58 pppd[68]: lcp_reqci, ln10:f->unit = 0

<7>Jan  1 00:11:58 pppd[68]: ln 1544 cilen:4

<7>Jan  1 00:11:58 pppd[68]: sent [LCP ConfAck id=0x1<mru 1492> <magic 0x2004922>]

<7>Jan  1 00:11:58 pppd[59]: rcvd [LCP ConfRej id=0x1<asyncmap 0x0> <pcomp> <accomp>]

<7>Jan  1 00:11:58 pppd[59]: rcvd [LCP ConfAck id=0x4<mru 1492> <magic 0x2ddcec01>]

<7>Jan  1 00:11:58 pppd[59]: sent [CCP ConfReq id=0x2<deflate 15> <deflate(old#) 15> <bsd v1 15>]

<7>Jan  1 00:11:58 pppd[59]: sent [IPCP ConfReqid=0x2 <compress VJ 0f 01> <addr 0.0.0.0>]

<7>Jan  1 00:11:58 pppd[68]: rcvd [LCP ConfRej id=0x1<asyncmap 0x0> <pcomp> <accomp>]

<7>Jan  1 00:11:58 pppd[68]: sent [LCP ConfReq id=0x2<mru 1492> <magic 0x2851e7e>]

<7>Jan  1 00:11:58 pppd[68]: rcvd [LCP ConfAck id=0x4<mru 1492> <magic 0x2ddcec01>]

<7>Jan  1 00:11:58 pppd[59]: rcvd [LCP ConfReq id=0x2<mru 1492> <auth pap> <magic 0x2004922>]

<4>Jan  1 00:11:58 pppd[59]: Warning - secret file/etc/ppp/pap-secrets has world and/or group access

<7>Jan  1 00:11:58 pppd[59]: sent [LCP ConfReq id=0x5<mru 1492> <asyncmap 0x0> <magic 0x6965ba9e> <pcomp><accomp>]

<7>Jan  1 00:11:58 pppd[59]: lcp_reqci, ln10:f->unit = 0

<7>Jan  1 00:11:58 pppd[59]: ln 1544 cilen:4

<7>Jan  1 00:11:58 pppd[59]: sent [LCP ConfNak id=0x2<auth eap>]

<7>Jan  1 00:11:58 pppd[68]: rcvd [LCP ConfReq id=0x2<mru 1492> <auth pap> <magic 0x2004922>]

<7>Jan  1 00:11:58 pppd[68]: lcp_reqci, ln10:f->unit = 0

<7>Jan  1 00:11:58 pppd[68]: ln 1544 cilen:4

<7>Jan  1 00:11:58 pppd[68]: sent [LCP ConfNak id=0x2<auth eap>]

<6>Jan  1 00:11:58 pppoe[60]: Session 8526 terminated-- received PADT from peer

<6>Jan  1 00:11:58 pppoe[60]: Sent PADT

<5>Jan  1 00:11:58 pppd[59]: Modem hangup

<5>Jan  1 00:11:58 pppd[59]: Connection terminated.

<6>Jan  1 00:11:58 pppoe[69]: Session 8526 terminated-- received PADT from peer

<6>Jan  1 00:11:58 pppoe[69]: Sent PADT

<5>Jan  1 00:11:58 pppd[68]: Modem hangup

<5>Jan  1 00:11:58 pppd[68]: Connection terminated.

<7>Jan  1 00:11:58 pppd[59]: Script /bin/pppoe -Iixp0 finished (pid 60), status = 0x0

<6>Jan  1 00:11:58 pppd[59]: Exit.

<7>Jan  1 00:11:58 pppd[68]: Script /bin/pppoe -Iixp0 finished (pid 69), status = 0x0

<6>Jan  1 00:11:58 pppd[68]: Exit.

 

错误点的出现

rcvd [LCP ConfReq id=0x0<mru 1492> <auth pap> <magic 0x2004922>]

对方一直坚持使用PAP,而不是windows实验用的chap,而在pap-secrets里没有写入账户名,所以修改一下.将ADSL密码写入到pap-secrets。重试之后链接成功。

Ifconfig结果

ppp0     Link encap:Point-to-Point Protocol 

         inet addr:xxxxxxxxxxxx  P-t-P:114.240.64.1  Mask:255.255.255.255

         UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492  Metric:1

         RX packets:40 errors:0 dropped:0 overruns:0 frame:0

         TX packets:5 errors:0 dropped:0 overruns:0 carrier:0

         collisions:0 txqueuelen:3

 

但是此时发现不能ping通别的IP,查看route发现没有defaultgateway。也没有DNS。

Ping以下网址不通

www.google.com

64.233.189.104

www.sina.com

202.108.33.32.

 

以下是windows下的拨号信息,作为参考。

PPP adapter cnc:

 

        Connection-specific DNS Suffix  . :

        Description . . . . . . . . . . . : WAN(PPP/SLIP) Interface

        Physical Address. . . . . . . . . :

        Dhcp Enabled. . . . . . . . . . . : No

        IP Address. . . . . . . . . . . . :xxxxxxxxx

        Subnet Mask . . . . . . . . . . . :255.255.255.255

        Default Gateway . . . . . . . . . :125.33.19.65

        DNS Servers . . . . . . . . . . . :202.106.195.68

                                           202.106.46.151

        NetBIOS over Tcpip. . . . . . . . : Disabled

 

查到要使用defaultroute参数。另外需要在ramdisk里添加/etc/resolve,内容如下

#MADE-BY-RP-PPPOE

nameserver202.106.46.151

在盒子上启动

# /bin/pppd pty  '/bin/pppoe -I ixp0' user username debugdefaultroute&

启动之后没有问题。查看route如下

# route              

Kernel IProuting table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

125.33.0.1      *               255.255.255.255 UH    0     0        0 ppp0

127.0.0.0       *               255.255.255.0   U    0      0        0lo

172.17.0.0      *               255.255.0.0     U    0      0        0 ath1

default         *               0.0.0.0         U    0      0        0 ppp0

 

连接外网正常:


 

 


上一页 第 1 2 3 4 页 下一页 八、再发布路由协议   九、TCP/IP症状和原因   症状 原因   本地主机不能与远程主机通讯 1) DNS工作不正常2) 没有到远程主机的路由3) 缺少缺省网关4) 管理拒绝(ACL)   某个应用程序不能正常工作 1) 管理拒绝(ACL)2) 网络没有正常配置以处理该应用程序   启动失败 1) BootP服务器没有MAC地址的实体2) 缺少IP helper-address3) ACL4) 修改NIC或MAC地址5) 重复的IP地址6) 不正常的IP配置   不能ping远程主机 1) ACL2) 没有到远程主机的路由3) 没有设置缺省网关4) 远程主机down   缺少路由 1) 没有正确配置路由协议2) 发布列表3) 被动接口4) 没有通告路由的邻居5) 路由协议版本不一致6) 邻居关系没有建立   相邻关系没有建立 1) 不正确的路由协议配置2) 不正确的IP配置3) 没有配置network或neighbor语句4) hello间隔不一致5) 不一致的area ID   高的CPU利用率 1) 不稳定的路由更新2) 没有关闭debug3) 进程过重   路由触发活跃模式 1) 不一致的间隔2) 硬件问题3) 不稳定的链路   十、TCP/IP症状和行动计划   问题 行动计划   DNS工作不正常 1)配置DNS主机的配置和DNS服务器,可以使用nslookup校验DNS服务器的工作   没有到远程主机的路由 1) 用ipconfig /all检查缺省网关2) 用show ip route查看是否相应路由3) 如果没有该路由,用show ip route查看是否有缺省网关4) 如有网关,检查到目标的下一跳;如无网关,修正问题   ACL 有分离的问题与ACL相关,必须分析ACL、或重写ACL并应用。   网络没有配置以处理应用程序 查看路由器配置   Booting失败 1) 查看DHCP或BootP服务器,并查看是否存在故障机的MAC实体2) 使用debug ip udp校验从主机接收的包3) 校验helper-address正确配置4) 查看ACL是否禁用包   缺少路由 1) 在第1台路由器上用show ip route查看所学到的路由2)校验相邻路由器3)有正确的路由network和neighbor语句4) 对OSPF,校验通配符掩码5) 检查应用到接口上的distribute list6)验证邻居的IP配置7) 如果路由被再发布,验证度量值8) 验证路由被正常的再发布   没有构成相邻关系 1) 用show ip protocol neighbors列表已构成的相邻关系2) 查看没有构成相邻关系的协议配置3)检查路由配置中的network语句4)用show ip protocol/interface查看特定的接口信息,如Hello间隔 第7章 处理串行线路和帧中继连接故障   一、处理串行线路故障   1、HDLC封装   High-level Data Link Control(HDLC)是用于串行链路的一种封装方法,HDLC是Cisco路由器串行接口的缺省封装方法。   处理串行链路故障的第一步就是查看链路两端要使用相同的封装类型。   Show interface serial 1 ;查看接口信息   Clear counters serial number ;复位接口的计数器到0   正常情况下,接口和line都是up的。   线缆故障、载波故障和硬件故障都可导致接口down,通过校验电缆连接、更换硬件(包括电缆)、检查载波信令定位问题。   接口up,line down:CSU/DSU故障、路由器接口问题、CSU/DSU或载波的时间不一致、没有从远端路由器接收到keepalive信令、载波问题。应验证本地接口和远端接口的配置。   接口重启的原因:   ? 数秒内排队的包没有被发送;   ? 硬件问题(路由器接口、线缆、CSU/DSU);   ? 时钟信令不一致   ? 环路接口   ? 接口关闭   ? 线协议down且接口定期重启   show controllers serial 0 ;显示接口状态、是否连有线缆、时钟速率   show buffers ;查看系统buffer池,接口buffer设置   debug serial interface ;显示HDLC或Frame Relay通信信息   2、CSU/DSU环路测试   有四种类型的环路测试:   ? 在本地CSU/DSU上测试本地环路;   ? 在远端CSU/DSU上测试本地环路;   ? 从本地NIU到远端CSU/DSU测试远端环路;   ? 从远端NIU到本地CSU/DSU测试远端环路;   用PPP封装的串行链路上,PPP用协商Magic Number检测环回网络。   3、串行线中总结:   1) 症状和问题:   症状或情形 问题   Interface is administratively down;line protocol is down 1) 接口被从命令行关闭2) 不允许重复的IP地址,两个使用相同IP地址的接口将down   Interface is down;line protocol is down 1) 不合格的线缆2) 没有本地提供商的信令3) 硬件故障(接口或CSU/DSU、线缆)4) 时钟   Interface is up;line protocol is down 1) 未配置的接口:本地或远程2) 本地提供商问题3) Keepalive序号没有增加4) 硬件故障(本地或远端接口、CSU/DSU)5) 线路杂音6) 时钟不一致7) 第2层(如LMI)   Interface is up;line protocol is up(looped) 链路在某处环路   Incrementing carrier transition counter 1) 来自本地提供商的信号不稳定2) 线缆故障3) 硬件故障   Incrementing interface resets 1) 线缆故障,导致CD信号丢失2) 硬件故障3) 线路拥塞   Input drops,errors,CRC,and framing errors 1) 线路速率超过接口能力2) 本地提供商问题3) 线路杂音4) 线缆故障5) 不合格线缆6) 硬件故障   Output drops 接口传输能力超过线路速率   2) 问题和行动   问题 解决行动方案   本地提供商问题 1) 检查CSU/DSU的CD信号和其它信号,看链路是否在发送和接收信息2) 如果没有CD信号或有其它问题,联系本地提供商处理故障   不合格或故障的线缆 1) 使用符合设备要求的线缆2) 使用breakout盒检查3) 交换故障线缆   未配置的接口 1) 使用show running-config校验接口配置2) 确认链路两端使用相同的封装类型   Keepalive问题 1) 验证keepalive被发送2) 配置了keepalive发送,debug keepalive3) 验证序号在增加4) 如果序号不增加,运行环路测试5) CSU/DSU环路,序号仍不增,则硬件故障   硬件故障 1)更换硬件   接口在环路模式 1) 检查接口配置2) 如果在接口配置有环路,移除3) 如果接口配置被清除,清除CSU/DSU环路模式4) 如CSU/DSU不在环路模式,可能是提供商置环   接口administratively down 1) 检查是否有重复的IP地址2) 进行接口配置模式,执行no shutdown   线路速率大于接口能力 1) 使用hold-queue减少进入的队列尺寸2) 增加输出的队列尺寸   接口速率大于线路速率 1) 减少广播流量2) 增加输出的队列3) 如有需要,使用队列算法 二、处理帧中继故障   DLCI用于在帧中继中标识虚拟链路,DLCI仅仅是本地信令,DLCI与第3层IP地址相映射。   处理帧中继的步骤:   1) 检查物理层,线缆或接口问题;   2) 检查接口封装;   3) 检查LMI类型;   4) 校验DLCI到IP的映射;   5) 校验Frame Delay的PVC;   6) 校验Frame Delay的LMI;   7) 校验Frame Delay映射;   8) 校验环路测试;   1、帧中继的show命令   show interface   show frame-relay lmi ;显示LMI相关信息(LMI类型、更新、状态)   show frame-relay pvc ;输出PVC信息、每条DLCI的LMI状态、…)   show frame-relay map ;提供DLCI号信息和所有FR接口的封装   2、帧中继的debug命令   debug frame-relay lmi ;显示LMI交换信息   debug frame-relay events ;显示协议和应用程序使用DLCI的细节   3、帧中继总纳   1) 症状和问题   症状或情形 相关问题   Frame Realy link is down 1) 线缆故障2) 硬件故障3) 本地服务商问题4) LMI类型不一致5) Keepalive没有被发送6) 封装类型不一致7) DLCI不一致   从Frame Delay网络不能ping远端主机 1) DLCI指定了错误的接口2) 封装类型不一致3) ACL问题4) 接口配置错误   2) 问题和行动   问题 解决行动方案   线缆故障 1) 检查线缆并测试接头2) 更换线缆   硬件故障 1) 执行环路测试,以分离硬件2) 将线缆连接到路由器的另一同样配置的接口,如OK,则需更换硬件   本地服务提供商问题 1) 如环路测试使LMI状态up,但不能连接远端着站点,联系本地载波2) 包含载波问题,就好象FR配置错误,如DLCI不一致或封装不一致。   LMI类型不一致 1) 校验路由器的LMI类型与PVC上的每个设备都一致2) 如使用公共提供商网络,不能访问LMI,与提供商联系   Keepalive问题 1) 使用show interface查看是否keepalive被禁用,或校验keepalive被正常配置2) 如果keepalive设置错误,进入配置模式并在接口上指定keepalive间隔   封装类型 1) 校验两端路由器的封装方式相同,如有非Cisco路由器,必须用IETF。用show frame-relay命令显示封装信息2)用encapsulation frame-relay ietf更换封装方式,与可用frame-relay map设置某个PVC的封装。   DLCI不一致 1) 用show running-config和show frame-relay pvc显示指派给某接口的DLCI号2) 如DLCI号配置正常,联系供应商校验FR交换机是否了相同的DLCI   ACL问题 1) 使用show ip interface显示应用到接口上的ACL2) 分析ACL,如有需要,删除或修改它 第8章 处理ISDN故障   一、ISDN基本原理   二、常见ISDN故障   ISDN问题分成3类:配置不当的路由器、物理线缆和ISDN协议、配置不当的交换机。   1、配置不当的路由器   配置不当由于不同原因:typographical错误、从服务供应商提供的错误信息、本路由器配置不正确   1) SPID(Service Profile Identifiers):如SPID和LDN配置错误,将有ISDN连接问题。SPID仅用于北美,只有服务供应商要求时才设置。   2) CHAP:CHAP认证在使用PPP封装的接口上使用。两端路由器的CHAP配置一定要相同。在PPP中,用户名和口令是大小写敏感的。   3) Dialer Map实体:Dialer map关联高层地址到相关的电话号码。每种协议需要一条dialer map语句。   4) 访问列表:ACL可用于ISDN连接以阻止某类型流量触发连接。   5) PPP:   2、物理层连接   1) BRI:在现有电话线上提供数字服务。   2) ISDN BRI信道:2B+D(2*64+16+48=192kbps);ISDN BRI的物理帧为48bits,链路每秒发送4000帧。   3) 本地环路:客户和CO之间的链路,连接ISDN设备到ISDN交换机。   4) 物理层:参考点(R、S、T、U);设备(LT/ET、NT1、NT2、TE1、TE2、TA)   三、配置不当的电话交换机   在新安装ISDN时,必须考虑服务供应商ISDN交换机配置错误的可能性。   1、第2层故障处理:   ISDN第2层故障处理的目标:q.921协议和PPP。   1) q.921:ISDN的第2层在q.921中定义。Q.921信令在D信道上用LAPD协议传输。处理q.921故障最常用命令是debug isdn q921,问题常与TEI(terminal endpoint identifier)、SAPI(service access point identifier)和SABME(set asynchronous balanced mode extended)有关。   TEI=127表示广播;TEI=64-126保留用于动态分配。   SAPI=0表示当前第3层信令;63表示用于TEI值分配的管理SAPI;64为呼叫控制。   2) PPP:PPP使用LCP设置和维护链路;NCP配置和维护网络层协议。   2、第3层故障处理:   ISDN第3层也叫q.931,使用debug isdn q931命令可查看call setup、connect、release、cancel、status、disconnect和、user information。   ISDN第3层连接在本地路由器(TE)和远端ISDN交换机(ET)之间。   ISDN呼叫建立的过程:   1) SETUP:在本地TE和远端ET之间发送信息   2) CALL_PROC:呼叫处理信令   3) ALERT:   4) CONNECT   5) CONNECT_ACK:   3、交换机类型:   配置ISDN时,必须用isdn switch-type命令指定本地环路的交换机。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值