Как мне создать FCS для пакетов PPP? - PullRequest
0 голосов
/ 30 ноября 2010

Я пытаюсь создать программную симуляцию на машине с Ubuntu GNU / Linux, которая будет работать как PPPoE.Я хотел бы, чтобы этот симулятор принимал исходящие пакеты, удалял заголовок Ethernet, вставлял флаги PPP (7E, FF, 03, 00 и 21) и помещал информацию уровня IP в пакет PPP.У меня проблемы с ФТС, которая идет после данных.Из того, что я могу сказать, сотовый модем, который я использую, имеет 2-байтовую FCS, используя метод CRC16-CCITT.Я нашел несколько программ, которые будут вычислять эту контрольную сумму, но ни одна из них не выдает то, что выходит из последовательной линии (у меня есть последовательная строка «анализатор», которая показывает мне все, что модем отправляет).

Я искал источник pppd и само ядро ​​linux, и я вижу, что у них обоих есть метод добавления FCS к данным.Это кажется довольно сложным для реализации, так как у меня нет опыта взлома ядра.Может кто-нибудь придумать простой способ (желательно на Python) для вычисления FCS, который соответствует тому, который производит ядро?

Спасибо.

PS Если кто-то захочет, я могу добавить примериз вывода данных я получаю к последовательному модему.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2017

Получил это от 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;
}
0 голосов
/ 12 января 2011

Я недавно сделал что-то подобное во время тестирования кода, чтобы уничтожить соединение 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))

...