summaryrefslogtreecommitdiffstats
path: root/proto
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2010-04-25 20:12:34 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2010-04-25 20:12:34 +0200
commit4e5fb4b60c59db3248fd12db2bc6f0424d798122 (patch)
tree93596ccfa8c4d4cb3ffc607d21578417966bd3f8 /proto
parentc1b51598d49ff737b926bd8ad2e308a5a15ce3a2 (diff)
downloadbird-4e5fb4b60c59db3248fd12db2bc6f0424d798122.tar
bird-4e5fb4b60c59db3248fd12db2bc6f0424d798122.zip
Skip LSA host<->network endianity conversions on big endians.
Diffstat (limited to 'proto')
-rw-r--r--proto/ospf/lsalib.c6
-rw-r--r--proto/ospf/lsalib.h12
2 files changed, 16 insertions, 2 deletions
diff --git a/proto/ospf/lsalib.c b/proto/ospf/lsalib.c
index 53c2562..c932fe0 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 a799de3..f98a1bd 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