S3C2410拨号上网

S 3C 2410拨号上网

 

                                          ----------------李亚楠   2006-04-05

 

最近做嵌入式实时视频服务器,S 3C 2410系列,需要让视频服务器支持ADSL宽带接入。

有以下软硬件支持:

ARM920T(S 3C 2410系列)

Arm-linux- 2.4.18

Arm-linux-gcc-2.95.3

Arm-linux-gcc- 3.4.1

PPPoE-3.7

PPP- 2.4.1

 

很显然工作主要有两个:

1、  配置内核

2、  移植PPPoEPPP

 

一、配置内核

需要说明的是,PC桌面linux中已经默认的支持了PPP协议,并且系统中已经存在了pppd这个进程。但在所用的armlinux中默认并没有支持ppppppoe协议,所以需要自己配置内核,使其支持,当然工作也是很简单的。

       进入内核目录

       在终端执行:Make menuconfig,之后就会出现内核配置界面,选择network device support,出现network device support配置界面,为了保险起见选择ppp的所有选项,选择仅有的一个pppoe选项,当然你可以以选入内核或者以模块加载两种方式使用,我选用的是编入内核,应为pppoeppp的程序makefile默认生成的可执行程序,而不是“.o”模块文件。

       在终端执行:make dep,就是执行make文件关联,如果内核是第一次编译如果不执行此命令就会出错。

       在终端执行:make zImage,经过漫长的过程,生成内核的压缩文件,在arch/arm/boot目录下面

       把内核烧入开发板,这个办法很多啊,你可以在windows下面用超级终端,在linux下面有minicom,或者直接用网线下载(ztelnet.

二、移植PPP

我选用的PPP版本是 2.4.1linux-2.4.18内核配置帮助说明ppp的驱动是2.4.1的,所以我就选择了ppp-2.4.1

       当然先是解压缩:tar zxvf  ppp- 2.4.1 .tar.gz

       进入目录执行:./configure  配置需要文件夹下面的Makefile文件,实际上需要编译的文件夹只有四个:chatpppdumppppstatspppd,需要的可执行文件分别是:chatpppdumppppstatspppd,也就是各个目录下的生成文件

       你可以直接运行make CC=arm-liunx-gcc,当然起初选用的版本是2.95.3,你会发现出现很多的警告和错误,警告不要紧,可是那些错误就烦人了。然后进入各个文件夹执行:make CC=arm-linux-gcc,发现只有pppd文件夹的程序编译不通过,出现上面的问题,察看错误提示发现并核对编译器程序发现的确很多地方重复定义,试图修正一些,但太多了,还有一些莫名奇怪的错误,包括的头文件确实有这个东西,它却提示这个东西无定义,没办法,只好放弃2.95.3.试着采用arm-linux-gcc- 3.4.1 编译,哈哈,不错!顺利通过。赶紧把生成的四个可执行程序拷贝开发板上(/bin下就可以了,usr/sbin目录只是/bin的一个链接),还有etc.ppp目录下面的配置文件拷贝到/etc/ppp/下面,如果没有这个文件夹,就自己建了。运行./pppd--------------------------错误提示:glibc库版本不对。查资料发现的确,gcc的两个交叉编译器所用的版本好像一个是glibc-2.1,一个是glibc-2.3。无奈~~~~~~~~~~~~~~~~~了一天多啊。

不过没有过不无的桥,仔细观察发现大部分错误出现在程序包括的一个文件中<route.h>中,为什么 3.4.1 行,而2.95.3不行呢?把3.4.1route.h更名route_lyn.h,拷贝到2.95.5 <rouet.h>所在目录,修改pppd下包括头文件<route.h>的文件为包括<route_lyn.h>,重新编译,通过!!!!!

其实执行的时候有遇到一个地址族不支持协议的错误,重新编译内核选择IPv6支持就可以了。运行:发现与pc机现象相同,就是打印出一些乱码,姑且认为是移植成功了。

三、    移植PPPoE

       解压缩

       运行./go,在PC上自动编译、安装所需要的文件。在这里我们需要的可 

不是这些,当出现配置“配置参数”时,退出,然后进入src文件夹,PPPoE

源程序都在这里,修改makefile,将其中的gcc换成arm-linux-gcc

Ar换成arm-linux-ar。编译生成我们所需要的文件,然后将pppoe

pppoe-serverpppoe-sniffpppoe-relayconfigs文件夹下的东西

拷贝到开发板上,运行pppoe-setup进行配置,然后运行pppoe-start

开始拨号,很遗憾,不是我们想要的结果:Timeout for wait PADO packets

LCPTimeout for configs request等错误提示.无奈试了好几天:检查

所建立的设备文件、测试PADI保温是否发出等等,试了好多办法都无法

拨号。

       后来发现pppoe—PADI阶段采用SOCK_PACKET广播,最后写了个简单的

sniffer程序抓包(只针对pppoe包)。和PC机正确拨号的PADI包相比

多了两个字节:在以太网协议的类型的后面多了FF BF两个字节。马上想

PCarm两个操作系统中对PPPoE数据包结构体的大小解释不一样。

通过简单的程序验证,发现的确。PC机采用16-32位混合操作系统,可

以按照16位对齐,而arm采用纯32位操作系统,只能以32位对齐。

<if_ether.h>文件中定义的结构体:

struct ethhdr

{

    unsigned char   h_dest[ETH_ALEN];  

    unsigned char   h_source[ETH_ALEN];

    unsigned short  h_proto;

};

Pc中是占14个字节(16位对齐),arm中占16位字节(32位对齐)

 

于是将:pppoe.h中定义的结构体:

 

 

 

/* A PPPoE Packet, including Ethernet headers */

typedef struct PPPoEPacketStruct {

    struct ethhdr ethHdr;   /* Ethernet header */

#ifdef PACK_BITFIELDS_REVERSED

    unsigned int type:4;    /* PPPoE Type (must be 1) */

    unsigned int ver:4;     /* PPPoE Version (must be 1) */

#else

    unsigned int ver:4;     /* PPPoE Version (must be 1) */

    unsigned int type:4;    /* PPPoE Type (must be 1) */

#endif

    unsigned int code:8;    /* PPPoE code */

    unsigned int session:16;    /* PPPoE session */

    unsigned int length:16; /* Payload length */

    unsigned char payload[ETH_DATA_LEN]; //1500

} PPPoEPacket;

 

改为:

/* A PPPoE Packet, including Ethernet headers */

typedef struct PPPoEPacketStruct {

      unsigned char h_dest[ETH_ALEN];  

      unsigned char h_source[ETH_ALEN];

      unsigned short    h_proto;

#ifdef PACK_BITFIELDS_REVERSED

      unsigned int type:4;      /* PPPoE Type (must be 1) */

      unsigned int ver:4;       /* PPPoE Version (must be 1) */

    unsigned int ver:4;       /* PPPoE Version (must be 1) */

      unsigned int type:4;      /* PPPoE Type (must be 1) */

#endif

      unsigned int code:8;  /* PPPoE code */

      unsigned int session:16;  /* PPPoE session */

      unsigned int length:16;   /* Payload length */

      unsigned char payload[ETH_DATA_LEN];

} PPPoEPacket;

 

编译运行还是不行,跟踪程序(没法直接打印数出运行结果,只好写在文

件中):

发现:discovery.c

void  waitForPADO(PPPoEConnection *conn, int timeout)函数错误返

回:

if (ntohs(packet.length) + HDR_SIZE > len) {

        syslog(LOG_ERR, "Bogus PPPoE length field (%u)",

           (unsigned int) ntohs(packet.length));

        continue;

    }

导致无法解析PADO包,检查pppoe.hHDR_SIZE定义:

#define PPPOE_OVERHEAD 6  /* type, code, session, length */

#define HDR_SIZE (sizeof(struct ethhdr) + PPPOE_OVERHEAD)

 

哈哈,找到原因,在arm中应该-2才对:

#define HDR_SIZE (sizeof(struct ethhdr)-2 + PPPOE_OVERHEAD)

编译运行:

--------------------------提示.Connected!成功!!!!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值