On Thu, Jul 28, 2022 at 04:41:54PM +0200, Alexander Bluhm wrote:
> - mff = (ip->ip_off & htons(IP_MF)) != 0;
> + mff = ISSET(ip->ip_off, htons(IP_MF));
This part breaks big endian machines.
New mff is 0x0020 on little and 0x2000 on big endian.
Later it is assigned to u_int8_t ipqe_mff. This strips higher bits.
I think the best way is to have 16 bit variables everywhere.
ok?
bluhm
Index: netinet/ip_input.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_input.c,v
retrieving revision 1.375
diff -u -p -r1.375 ip_input.c
--- netinet/ip_input.c 28 Jul 2022 22:05:39 -0000 1.375
+++ netinet/ip_input.c 4 Aug 2022 17:01:55 -0000
@@ -577,7 +577,8 @@ ip_fragcheck(struct mbuf **mp, int *offp
struct ip *ip;
struct ipq *fp;
struct ipqent *ipqe;
- int mff, hlen;
+ int hlen;
+ uint16_t mff;
ip = mtod(*mp, struct ip *);
hlen = ip->ip_hl << 2;
Index: netinet/ip_var.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_var.h,v
retrieving revision 1.94
diff -u -p -r1.94 ip_var.h
--- netinet/ip_var.h 25 Jul 2022 23:19:34 -0000 1.94
+++ netinet/ip_var.h 4 Aug 2022 17:01:55 -0000
@@ -174,7 +174,7 @@ struct ipqent {
LIST_ENTRY(ipqent) ipqe_q;
struct ip *ipqe_ip;
struct mbuf *ipqe_m; /* mbuf contains packet */
- u_int8_t ipqe_mff; /* for IP fragmentation */
+ uint16_t ipqe_mff; /* for IP fragmentation */
};
/*