From 4e5fb4b60c59db3248fd12db2bc6f0424d798122 Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Sun, 25 Apr 2010 20:12:34 +0200 Subject: [PATCH] Skip LSA host<->network endianity conversions on big endians. --- proto/ospf/lsalib.c | 6 ++++-- proto/ospf/lsalib.h | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/proto/ospf/lsalib.c b/proto/ospf/lsalib.c index 53c25623..c932fe04 100644 --- a/proto/ospf/lsalib.c +++ b/proto/ospf/lsalib.c @@ -87,6 +87,7 @@ ospf_age(struct proto_ospf *po) } } +#ifndef CPU_BIG_ENDIAN void htonlsah(struct ospf_lsa_header *h, struct ospf_lsa_header *n) { @@ -138,6 +139,7 @@ ntohlsab(void *n, void *h, u16 len) for (i = 0; i < (len / sizeof(u32)); i++) hid[i] = ntohl(nid[i]); } +#endif /* little endian */ /* void @@ -184,7 +186,7 @@ lsasum_calculate(struct ospf_lsa_header *h, void *body) // log(L_WARN "Checksum %R %R %d start (len %d)", h->id, h->rt, h->type, length); htonlsah(h, h); - htonlsab(body, body, length - sizeof(struct ospf_lsa_header)); + htonlsab1(body, length - sizeof(struct ospf_lsa_header)); /* char buf[1024]; @@ -198,7 +200,7 @@ lsasum_calculate(struct ospf_lsa_header *h, void *body) // log(L_WARN "Checksum result %4x", h->checksum); ntohlsah(h, h); - ntohlsab(body, body, length - sizeof(struct ospf_lsa_header)); + ntohlsab1(body, length - sizeof(struct ospf_lsa_header)); } /* diff --git a/proto/ospf/lsalib.h b/proto/ospf/lsalib.h index a799de31..f98a1bd3 100644 --- a/proto/ospf/lsalib.h +++ b/proto/ospf/lsalib.h @@ -10,10 +10,22 @@ #ifndef _BIRD_OSPF_LSALIB_H_ #define _BIRD_OSPF_LSALIB_H_ +#ifdef CPU_BIG_ENDIAN +static inline void htonlsah(struct ospf_lsa_header *h, struct ospf_lsa_header *n) { *n = *h; }; +static inline void ntohlsah(struct ospf_lsa_header *n, struct ospf_lsa_header *h) { *h = *n; }; +static inline void htonlsab(void *h, void *n, u16 len) { memcpy(n, h, len); }; +static inline void ntohlsab(void *n, void *h, u16 len) { memcpy(h, n, len); }; +static inline void htonlsab1(void *h, u16 len) { }; +static inline void ntohlsab1(void *n, u16 len) { }; +#else void htonlsah(struct ospf_lsa_header *h, struct ospf_lsa_header *n); void ntohlsah(struct ospf_lsa_header *n, struct ospf_lsa_header *h); void htonlsab(void *h, void *n, u16 len); void ntohlsab(void *n, void *h, u16 len); +static inline void htonlsab1(void *h, u16 len) { htonlsab(h, h, len); }; +static inline void ntohlsab1(void *n, u16 len) { ntohlsab(n, n, len); }; +#endif + void lsasum_calculate(struct ospf_lsa_header *header, void *body); u16 lsasum_check(struct ospf_lsa_header *h, void *body); #define CMP_NEWER 1