Make endianity swapping simpler.
This commit is contained in:
parent
be86240662
commit
c15e569065
3 changed files with 42 additions and 192 deletions
|
@ -105,7 +105,7 @@ htonlsah(struct ospf_lsa_header *h, struct ospf_lsa_header *n)
|
||||||
n->sn = htonl(h->sn);
|
n->sn = htonl(h->sn);
|
||||||
n->checksum = htons(h->checksum);
|
n->checksum = htons(h->checksum);
|
||||||
n->length = htons(h->length);
|
n->length = htons(h->length);
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ntohlsah(struct ospf_lsa_header *n, struct ospf_lsa_header *h)
|
ntohlsah(struct ospf_lsa_header *n, struct ospf_lsa_header *h)
|
||||||
|
@ -120,150 +120,29 @@ ntohlsah(struct ospf_lsa_header *n, struct ospf_lsa_header *h)
|
||||||
h->sn = ntohl(n->sn);
|
h->sn = ntohl(n->sn);
|
||||||
h->checksum = ntohs(n->checksum);
|
h->checksum = ntohs(n->checksum);
|
||||||
h->length = ntohs(n->length);
|
h->length = ntohs(n->length);
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
htonlsab(void *h, void *n, u16 type, u16 len)
|
htonlsab(void *h, void *n, u16 type, u16 len)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
u32 *hid = h;
|
||||||
|
u32 *nid = n;
|
||||||
switch (type)
|
int i;
|
||||||
{
|
|
||||||
case LSA_T_RT:
|
|
||||||
{
|
|
||||||
struct ospf_lsa_rt *hrt, *nrt;
|
|
||||||
struct ospf_lsa_rt_link *hrtl, *nrtl;
|
|
||||||
u16 links;
|
|
||||||
|
|
||||||
nrt = n;
|
|
||||||
hrt = h;
|
|
||||||
|
|
||||||
#ifdef OSPFv2
|
|
||||||
links = hrt->links;
|
|
||||||
nrt->options = htons(hrt->options);
|
|
||||||
nrt->links = htons(hrt->links);
|
|
||||||
#else /* OSPFv3 */
|
|
||||||
nrt->options = htonl(hrt->options);
|
|
||||||
links = (len - sizeof(struct ospf_lsa_rt)) /
|
|
||||||
sizeof(struct ospf_lsa_rt_link);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nrtl = (struct ospf_lsa_rt_link *) (nrt + 1);
|
|
||||||
hrtl = (struct ospf_lsa_rt_link *) (hrt + 1);
|
|
||||||
for (i = 0; i < links; i++)
|
|
||||||
{
|
|
||||||
#ifdef OSPFv2
|
|
||||||
nrtl[i].id = htonl(hrtl[i].id);
|
|
||||||
nrtl[i].data = htonl(hrtl[i].data);
|
|
||||||
nrtl[i].type = hrtl[i].type;
|
|
||||||
nrtl[i].notos = hrtl[i].notos;
|
|
||||||
nrtl[i].metric = htons(hrtl[i].metric);
|
|
||||||
#else /* OSPFv3 */
|
|
||||||
nrtl[i].type = hrtl[i].type;
|
|
||||||
nrtl[i].padding = 0;
|
|
||||||
nrtl[i].metric = htons(hrtl[i].metric);
|
|
||||||
nrtl[i].lif = htonl(hrtl[i].lif);
|
|
||||||
nrtl[i].nif = htonl(hrtl[i].nif);
|
|
||||||
nrtl[i].id = htonl(hrtl[i].id);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case LSA_T_NET:
|
|
||||||
case LSA_T_SUM_NET:
|
|
||||||
case LSA_T_SUM_RT:
|
|
||||||
case LSA_T_EXT:
|
|
||||||
#ifdef OSPFv3
|
|
||||||
case LSA_T_LINK:
|
|
||||||
case LSA_T_PREFIX:
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
u32 *hid, *nid;
|
|
||||||
|
|
||||||
nid = n;
|
|
||||||
hid = h;
|
|
||||||
|
|
||||||
for (i = 0; i < (len / sizeof(u32)); i++)
|
for (i = 0; i < (len / sizeof(u32)); i++)
|
||||||
{
|
nid[i] = htonl(hid[i]);
|
||||||
*(nid + i) = htonl(*(hid + i));
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
bug("(hton): Unknown LSA");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ntohlsab(void *n, void *h, u16 type, u16 len)
|
ntohlsab(void *n, void *h, u16 type, u16 len)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
u32 *nid = n;
|
||||||
switch (type)
|
u32 *hid = h;
|
||||||
{
|
int i;
|
||||||
case LSA_T_RT:
|
|
||||||
{
|
|
||||||
struct ospf_lsa_rt *hrt, *nrt;
|
|
||||||
struct ospf_lsa_rt_link *hrtl, *nrtl;
|
|
||||||
u16 links;
|
|
||||||
|
|
||||||
nrt = n;
|
|
||||||
hrt = h;
|
|
||||||
|
|
||||||
#ifdef OSPFv2
|
|
||||||
hrt->options = ntohs(nrt->options);
|
|
||||||
links = hrt->links = ntohs(nrt->links);
|
|
||||||
#else /* OSPFv3 */
|
|
||||||
hrt->options = ntohl(nrt->options);
|
|
||||||
links = (len - sizeof(struct ospf_lsa_rt)) /
|
|
||||||
sizeof(struct ospf_lsa_rt_link);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nrtl = (struct ospf_lsa_rt_link *) (nrt + 1);
|
|
||||||
hrtl = (struct ospf_lsa_rt_link *) (hrt + 1);
|
|
||||||
for (i = 0; i < links; i++)
|
|
||||||
{
|
|
||||||
#ifdef OSPFv2
|
|
||||||
hrtl[i].id = ntohl(nrtl[i].id);
|
|
||||||
hrtl[i].data = ntohl(nrtl[i].data);
|
|
||||||
hrtl[i].type = nrtl[i].type;
|
|
||||||
hrtl[i].notos = nrtl[i].notos;
|
|
||||||
hrtl[i].metric = ntohs(nrtl[i].metric);
|
|
||||||
#else /* OSPFv3 */
|
|
||||||
hrtl[i].type = nrtl[i].type;
|
|
||||||
hrtl[i].padding = 0;
|
|
||||||
hrtl[i].metric = ntohs(nrtl[i].metric);
|
|
||||||
hrtl[i].lif = ntohl(nrtl[i].lif);
|
|
||||||
hrtl[i].nif = ntohl(nrtl[i].nif);
|
|
||||||
hrtl[i].id = ntohl(nrtl[i].id);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case LSA_T_NET:
|
|
||||||
case LSA_T_SUM_NET:
|
|
||||||
case LSA_T_SUM_RT:
|
|
||||||
case LSA_T_EXT:
|
|
||||||
#ifdef OSPFv3
|
|
||||||
case LSA_T_LINK:
|
|
||||||
case LSA_T_PREFIX:
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
u32 *hid, *nid;
|
|
||||||
|
|
||||||
hid = h;
|
|
||||||
nid = n;
|
|
||||||
|
|
||||||
for (i = 0; i < (len / sizeof(u32)); i++)
|
for (i = 0; i < (len / sizeof(u32)); i++)
|
||||||
{
|
|
||||||
hid[i] = ntohl(nid[i]);
|
hid[i] = ntohl(nid[i]);
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
bug("(ntoh): Unknown LSA");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
void
|
||||||
buf_dump(const char *hdr, const byte *buf, int blen)
|
buf_dump(const char *hdr, const byte *buf, int blen)
|
||||||
|
|
|
@ -389,17 +389,28 @@ struct ospf_lsa_header
|
||||||
|
|
||||||
struct ospf_lsa_rt
|
struct ospf_lsa_rt
|
||||||
{
|
{
|
||||||
|
#ifdef CPU_BIG_ENDIAN
|
||||||
u16 options; /* VEB flags only */
|
u16 options; /* VEB flags only */
|
||||||
u16 links;
|
u16 links;
|
||||||
|
#else
|
||||||
|
u16 links;
|
||||||
|
u16 options; /* VEB flags only */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ospf_lsa_rt_link
|
struct ospf_lsa_rt_link
|
||||||
{
|
{
|
||||||
u32 id;
|
u32 id;
|
||||||
u32 data;
|
u32 data;
|
||||||
|
#ifdef CPU_BIG_ENDIAN
|
||||||
u8 type;
|
u8 type;
|
||||||
u8 notos;
|
u8 padding;
|
||||||
u16 metric;
|
u16 metric;
|
||||||
|
#else
|
||||||
|
u16 metric;
|
||||||
|
u8 padding;
|
||||||
|
u8 type;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ospf_lsa_net
|
struct ospf_lsa_net
|
||||||
|
@ -438,9 +449,15 @@ struct ospf_lsa_rt
|
||||||
|
|
||||||
struct ospf_lsa_rt_link
|
struct ospf_lsa_rt_link
|
||||||
{
|
{
|
||||||
|
#ifdef CPU_BIG_ENDIAN
|
||||||
u8 type;
|
u8 type;
|
||||||
u8 padding;
|
u8 padding;
|
||||||
u16 metric;
|
u16 metric;
|
||||||
|
#else
|
||||||
|
u16 metric;
|
||||||
|
u8 padding;
|
||||||
|
u8 type;
|
||||||
|
#endif
|
||||||
u32 lif; /* Local interface ID */
|
u32 lif; /* Local interface ID */
|
||||||
u32 nif; /* Neighbor interface ID */
|
u32 nif; /* Neighbor interface ID */
|
||||||
u32 id; /* Neighbor router ID */
|
u32 id; /* Neighbor router ID */
|
||||||
|
@ -481,8 +498,13 @@ struct ospf_lsa_link
|
||||||
|
|
||||||
struct ospf_lsa_prefix
|
struct ospf_lsa_prefix
|
||||||
{
|
{
|
||||||
|
#ifdef CPU_BIG_ENDIAN
|
||||||
u16 pxcount;
|
u16 pxcount;
|
||||||
u16 ref_type;
|
u16 ref_type;
|
||||||
|
#else
|
||||||
|
u16 ref_type;
|
||||||
|
u16 pxcount;
|
||||||
|
#endif
|
||||||
u32 ref_id;
|
u32 ref_id;
|
||||||
u32 ref_rt;
|
u32 ref_rt;
|
||||||
u32 rest[];
|
u32 rest[];
|
||||||
|
@ -514,57 +536,6 @@ static inline unsigned lsa_net_count(struct ospf_lsa_header *lsa)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
struct ospf_lsa_ext_etos
|
|
||||||
{
|
|
||||||
#ifdef CPU_BIG_ENDIAN
|
|
||||||
u8 ebit:1;
|
|
||||||
u8 tos:7;
|
|
||||||
u8 padding1;
|
|
||||||
u16 padding2;
|
|
||||||
#else
|
|
||||||
u16 padding2;
|
|
||||||
u8 padding1;
|
|
||||||
u8 tos:7;
|
|
||||||
u8 ebit:1;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct ospf_lsa_sum_tos
|
|
||||||
{
|
|
||||||
#ifdef CPU_BIG_ENDIAN
|
|
||||||
u8 tos;
|
|
||||||
u8 padding1;
|
|
||||||
u16 padding2;
|
|
||||||
#else
|
|
||||||
u16 padding2;
|
|
||||||
u8 padding1;
|
|
||||||
u8 tos;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
union ospf_lsa_sum_tm
|
|
||||||
{
|
|
||||||
struct ospf_lsa_sum_tos tos;
|
|
||||||
u32 metric;
|
|
||||||
};
|
|
||||||
|
|
||||||
union ospf_lsa_ext_etm
|
|
||||||
{
|
|
||||||
struct ospf_lsa_ext_etos etos;
|
|
||||||
u32 metric;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ospf_lsa_ext_tos
|
|
||||||
{
|
|
||||||
union ospf_lsa_ext_etm etm;
|
|
||||||
ip_addr fwaddr;
|
|
||||||
u32 tag;
|
|
||||||
};
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct ospf_lsreq_header
|
struct ospf_lsreq_header
|
||||||
{
|
{
|
||||||
u32 type;
|
u32 type;
|
||||||
|
|
|
@ -211,7 +211,7 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length)
|
||||||
ln->data = (ifa->iface->addr->flags & IA_UNNUMBERED) ?
|
ln->data = (ifa->iface->addr->flags & IA_UNNUMBERED) ?
|
||||||
ifa->iface->index : ipa_to_u32(ifa->iface->addr->ip);
|
ifa->iface->index : ipa_to_u32(ifa->iface->addr->ip);
|
||||||
ln->metric = ifa->cost;
|
ln->metric = ifa->cost;
|
||||||
ln->notos = 0;
|
ln->padding = 0;
|
||||||
i++;
|
i++;
|
||||||
master = 1;
|
master = 1;
|
||||||
}
|
}
|
||||||
|
@ -226,7 +226,7 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length)
|
||||||
ln->id = ipa_to_u32(ifa->drip);
|
ln->id = ipa_to_u32(ifa->drip);
|
||||||
ln->data = ipa_to_u32(ifa->iface->addr->ip);
|
ln->data = ipa_to_u32(ifa->iface->addr->ip);
|
||||||
ln->metric = ifa->cost;
|
ln->metric = ifa->cost;
|
||||||
ln->notos = 0;
|
ln->padding = 0;
|
||||||
i++;
|
i++;
|
||||||
master = 1;
|
master = 1;
|
||||||
}
|
}
|
||||||
|
@ -241,7 +241,7 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length)
|
||||||
ln->id = neigh->rid;
|
ln->id = neigh->rid;
|
||||||
ln->data = ipa_to_u32(ifa->iface->addr->ip);
|
ln->data = ipa_to_u32(ifa->iface->addr->ip);
|
||||||
ln->metric = ifa->cost;
|
ln->metric = ifa->cost;
|
||||||
ln->notos = 0;
|
ln->padding = 0;
|
||||||
i++;
|
i++;
|
||||||
master = 1;
|
master = 1;
|
||||||
}
|
}
|
||||||
|
@ -268,7 +268,7 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length)
|
||||||
ln->id = ipa_to_u32(a->prefix);
|
ln->id = ipa_to_u32(a->prefix);
|
||||||
ln->data = ipa_to_u32(ipa_mkmask(a->pxlen));
|
ln->data = ipa_to_u32(ipa_mkmask(a->pxlen));
|
||||||
ln->metric = ifa->cost;
|
ln->metric = ifa->cost;
|
||||||
ln->notos = 0;
|
ln->padding = 0;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -282,7 +282,7 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length)
|
||||||
ln->id = ipa_to_u32(sn->px.addr);
|
ln->id = ipa_to_u32(sn->px.addr);
|
||||||
ln->data = ipa_to_u32(ipa_mkmask(sn->px.len));
|
ln->data = ipa_to_u32(ipa_mkmask(sn->px.len));
|
||||||
ln->metric = sn->cost;
|
ln->metric = sn->cost;
|
||||||
ln->notos = 0;
|
ln->padding = 0;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue