2004-10-05 Paul Jakma <paul@dishone.st>
* sockopt.{c,h}: add sockopt_iphdrincl_swab_{htosys,systoh},
functions to change byte order between system IP_HDRINCL order
and host order.
diff --git a/lib/ChangeLog b/lib/ChangeLog
index eec006c..2bbda12 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,9 @@
+2004-10-05 Paul Jakma <paul@dishone.st>
+
+ * sockopt.{c,h}: add sockopt_iphdrincl_swab_{htosys,systoh},
+ functions to change byte order between system IP_HDRINCL order
+ and host order.
+
2004-10-04 Hasso Tepper <hasso at quagga.net>
* memory.c, memory.h: Make char * argument of strdup functions const.
diff --git a/lib/sockopt.c b/lib/sockopt.c
index 1a7524b..5936d66 100644
--- a/lib/sockopt.c
+++ b/lib/sockopt.c
@@ -360,3 +360,29 @@
return (ifindex = 0);
}
}
+
+/* swab iph between order system uses for IP_HDRINCL and host order */
+void
+sockopt_iphdrincl_swab_htosys (struct ip *iph)
+{
+ /* BSD and derived take iph in network order, except for
+ * ip_len and ip_off
+ */
+#ifndef HAVE_IP_HDRINCL_BSD_ORDER
+ iph->ip_len = htons(iph->ip_len);
+ iph->ip_off = htons(iph->ip_off);
+#endif /* HAVE_IP_HDRINCL_BSD_ORDER */
+
+ iph->ip_id = htons(iph->ip_id);
+}
+
+void
+sockopt_iphdrincl_swab_systoh (struct ip *iph)
+{
+#ifndef HAVE_IP_HDRINCL_BSD_ORDER
+ iph->ip_len = ntohs(iph->ip_len);
+ iph->ip_off = ntohs(iph->ip_off);
+#endif /* HAVE_IP_HDRINCL_BSD_ORDER */
+
+ iph->ip_id = ntohs(iph->ip_id);
+}
diff --git a/lib/sockopt.h b/lib/sockopt.h
index 3f4a705..f6a4315 100644
--- a/lib/sockopt.h
+++ b/lib/sockopt.h
@@ -92,4 +92,11 @@
/* Ask for, and get, ifindex, by whatever method is supported. */
int setsockopt_ifindex (int, int, int);
int getsockopt_ifindex (int, struct msghdr *);
+
+/* swab the fields in iph between the host order and system order expected
+ * for IP_HDRINCL.
+ */
+void sockopt_iphdrincl_swab_htosys (struct ip *iph);
+void sockopt_iphdrincl_swab_systoh (struct ip *iph);
+
#endif /*_ZEBRA_SOCKOPT_H */