我用的开发板是s3c2410,系统是arm-linux,内核是"2.4.18-rmk7-hzh-yaffs.tar.bz2"。adsl modem是硬置modem,IP是192.168.1.1。
刚开始时用rp-pppoe-3.6无法获得IP,adsl modem不识别我所发送的PADI包。经过检查发现2410与PC对int等数据所占的内存字节数的规定好像并不相同,所以我发送的PADI包总是在中间多出两个字节,导致adsl modem不识别这个包。后来我将pppoe.h中的结构体
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]; /* A bit of room to spare */
} PPPoEPacket;
修改了一下。其中struct ethhdr ethHdr是系统定义的以太网包头。我重新写了一个结构体来替换原来的:
typedef struct PPPoEPacketStruct {
u_int8_t h_dest[ETH_ALEN];
u_int8_t h_source[ETH_ALEN];
u_int16_t h_proto;
#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]; /* A bit of room to spare */
} PPPoEPacket;
这里只是重新规定了以太网包头各类数据所占的字节数,其他都没有修改,发现问题解决了!终于可以从ISP服务商那里分配到IP了。
但当我ping一些网站时,发现modem有响应,也有数据的交换,但目标板却接收不到数据包。我用一个抓包工具来抓包,发现目标板的网卡上也有adsl modem所发送过来的数据包。我怀疑这可能又是哪里没定义好,导致目标板的网卡对adsl modem所发送过来的数据包不识别。
好郁闷啊,先是adsl modem不识别数据包,现在目标板又犯同样的问题,我都不知道该怎么办了。哪位高手帮我解答一下呀! |