2010-11-29 30 views
0

J'essaye de créer une simulation de logiciel sur une machine d'Ubuntu GNU/Linux qui fonctionnera comme PPPoE. Je voudrais que ce simulateur prenne les paquets sortant, dépouille l'en-tête d'Ethernet, insère les drapeaux de PPP (7E, FF, 03, 00, et 21) et place les informations de couche d'IP dans le paquet de PPP. J'ai des problèmes avec le FCS qui va après les données. D'après ce que je peux dire, le modem cellulaire que j'utilise a un FCS de 2 octets utilisant la méthode CRC16-CCITT. J'ai trouvé plusieurs logiciels qui vont calculer cette somme de contrôle, mais aucun d'entre eux ne produit ce qui sort de la ligne série (j'ai une ligne de série "sniffer" qui me montre tout ce que le modem est en train d'envoyer).Comment créer un FCS pour les paquets PPP?

J'ai examiné la source de pppd et le noyau Linux lui-même, et je peux voir que les deux ont une méthode d'ajout d'un FCS aux données. Cela semble assez difficile à mettre en œuvre, car je n'ai aucune expérience dans le kernel hacking. Quelqu'un peut-il trouver un moyen simple (de préférence en Python) de calculer un FCS correspondant à celui produit par le noyau?

Merci.

P.S. Si quelqu'un le veut, je peux ajouter un échantillon de la sortie de données que je reçois au modem série.

Répondre

0

J'ai récemment fait quelque chose comme ça alors que le code de test pour tuer une connexion PPP .. Cela a fonctionné pour moi:

# 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 

Pour obtenir la valeur:

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

et remplacez les octets (j'ai utilisé chr ((SVF) >> & 0xFF00 8), chr (SVF) & 0x00ff)

0

obtenu ceci de 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; 
}