0

我正在尝试在 Ubuntu GNU/Linux 机器上创建一个软件模拟,它将像 PPPoE 一样工作。我希望这个模拟器能够接收传出数据包,剥离以太网报头,插入 PPP 标志(7E、FF、03、00 和 21)并将 IP 层信息放入 PPP 数据包中。我在处理数据的 FCS 时遇到了问题。据我所知,我使用的蜂窝调制解调器有一个使用 CRC16-CCITT 方法的 2 字节 FCS。我找到了几个可以计算这个校验和的软件,但是它们都没有产生从串行线路出来的东西(我有一个串行线路“嗅探器”,它可以显示调制解调器正在发送的所有内容)。

我一直在研究 pppd 的来源和 linux 内核本身,我可以看到它们都有一个在数据中添加 FCS 的方法。这似乎很难实现,因为我没有内核黑客的经验。有人能想出一种简单的方法(最好是在 Python 中)来计算与内核产生的 FCS 匹配的 FCS 吗?

谢谢。

PS 如果有人愿意,我可以将我得到的数据输出样本添加到串行调制解调器。

4

3 回答 3

1

使用了简单的 python 库 crcmod。

import crcmod   #pip3 install crcmod
fcsData = "A0 19 03 61 DC"
fcsData=''.join(fcsData.split(' '))
print(fcsData)
crc16 = crcmod.mkCrcFun(0x11021, rev=True,initCrc=0x0000, xorOut=0xFFFF)
print(hex(crc16(bytes.fromhex(fcsData))))
fcs=hex(crc16(bytes.fromhex(fcsData)))
于 2020-10-12T05:16:58.167 回答
0

我最近在测试代码以终止 ppp 连接时做了类似的事情。这对我有用:

# RFC 1662 Appendix C

def mkfcstab():
    P = 0x8408

    def valiter():
        for b in range(256):
            v = b
            i = 8
            while i:
                v = (v >> 1) ^ P if v & 1 else v >> 1
                i -= 1

            yield v & 0xFFFF

    return tuple(valiter())

fcstab = mkfcstab()

PPPINITFCS16 = 0xffff  # Initial FCS value
PPPGOODFCS16 = 0xf0b8  # Good final FCS value

def pppfcs16(fcs, bytelist):
    for b in bytelist:
        fcs = (fcs >> 8) ^ fcstab[(fcs ^ b) & 0xff]
    return fcs

要获取值:

fcs = pppfcs16(PPPINITFCS16, (ord(c) for c in frame)) ^ 0xFFFF

并交换字节(我使用了 chr((fcs & 0xFF00) >> 8), chr(fcs & 0x00FF))

于 2011-01-12T17:16:20.897 回答
0

mbed.org PPP-Blinky 得到这个:

// http://www.sunshine2k.de/coding/javascript/crc/crc_js.html - Correctly calculates
// the 16-bit FCS (crc) on our frames (Choose CRC16_CCITT_FALSE)

int crc;

void crcReset()
{
    crc=0xffff;   // crc restart
}

void crcDo(int x) // cumulative crc
{
    for (int i=0; i<8; i++) {
        crc=((crc&1)^(x&1))?(crc>>1)^0x8408:crc>>1; // crc calculator
        x>>=1;
    }
}

int crcBuf(char * buf, int size) // crc on an entire block of memory
{
    crcReset();
    for(int i=0; i<size; i++)crcDo(*buf++);
    return crc;
}
于 2017-04-24T06:06:09.940 回答