Deklaration von struct iphdr



  • Guten Morgen,

    in der Header include/netinet/ip.h habe ich folgende Deklaration der struct iphdr gefunden:

    struct iphdr
      {
    #if __BYTE_ORDER == __LITTLE_ENDIAN
        unsigned int ihl:4;
        unsigned int version:4;
    #elif __BYTE_ORDER == __BIG_ENDIAN
        unsigned int version:4;
        unsigned int ihl:4;
    #else
    # error "Please fix <bits/endian.h>"
    #endif
        u_int8_t tos;
        u_int16_t tot_len;
        u_int16_t id;
        u_int16_t frag_off;
        u_int8_t ttl;
        u_int8_t protocol;
        u_int16_t check;
        u_int32_t saddr;
        u_int32_t daddr;
        /*The options start here. */
      };
    

    Hier wird je nach byte order ihl (internet header length) und version in unterschiedlicher Reihenfolge deklariert.
    Dies verwundert mich ein wenig. Zum einen kommen alle Pakete sowieso in network (big-endian) byte order. Zum anderen handelt es sich (zusammengefasst) bei den beiden Feldern um 1 Byte, welches durch ein bitfield
    aufgesplittet wurde. Seit wann hat die byte order Einfluss auf die Anordnung der Bits?

    Es wäre schön, wenn mich hier jemand aufklären könnte. Danke im Voraus.



  • Oder wird die network byte order DWORD-weise gebildet?



  • FrEEzE2046 schrieb:

    Seit wann hat die byte order Einfluss auf die Anordnung der Bits?

    Per Definition, hat sie Einfluss auf die Anordnung der einzelnen Bits. Sie gibt an, in welcher Reihenfolge die einzelnen Bits gespeichert/gesendet werden.

    Normalerweise musst du dich nur nicht um die Bit-Reihenfolge der einzelnen Bytes kümmern, weil das der Netzwerk-Treiber für dich übernimmt. Der dreht die Bits für jedes einzelne Byte in die richtige Reihenfolge.

    Wäre die Aufteilung in der struct nicht da, würden auf einer Little-Endian-Maschine die Bits vertauscht und damit würde dann die Reihenfolge nicht mehr stimmen.



  • ProgChild schrieb:

    Wäre die Aufteilung in der struct nicht da, würden auf einer Little-Endian-Maschine die Bits vertauscht und damit würde dann die Reihenfolge nicht mehr stimmen.

    Danke für deine Antwort. Meines Wissens nach ist es aber Compiler abhängig, ob er je nach byte order auch die Bit-Reihenfolge von Bitfeldern verändert.
    Ich hab aber mittlerweile in Erfahrung gebracht, dass GCC durchaus Rücksicht darauf nimmt.


Anmelden zum Antworten