git: 698402f4f97c - main - inpcb: declare struct in_conninfo as a single declaration
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 27 Jul 2026 19:28:22 UTC
The branch main has been updated by glebius:
URL: https://cgit.FreeBSD.org/src/commit/?id=698402f4f97ce3bbe8130382c0bb16d48a87ff63
commit 698402f4f97ce3bbe8130382c0bb16d48a87ff63
Author: Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2026-07-27 19:28:08 +0000
Commit: Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2026-07-27 19:28:08 +0000
inpcb: declare struct in_conninfo as a single declaration
This removes just one level of #define mess that is needed to reach into
an inpcbs IPv4 address. And makes the declaration easier to read. No
functional change.
Reviewed by: markj
Differential Revision: https://reviews.freebsd.org/D58273
---
sys/netinet/in_pcb.h | 62 ++++++++++++++++++------------------------------
sys/netinet/in_pcb_var.h | 2 +-
2 files changed, 24 insertions(+), 40 deletions(-)
diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h
index 933a4c42808e..34762b58d86b 100644
--- a/sys/netinet/in_pcb.h
+++ b/sys/netinet/in_pcb.h
@@ -38,50 +38,34 @@
#define _NETINET_IN_PCB_H_
/*
- * PCB with AF_INET6 null bind'ed laddr can receive AF_INET input packet.
- * So, AF_INET6 null laddr is also used as AF_INET null laddr, by utilizing
- * the following structure. This requires padding always be zeroed out,
- * which is done right after inpcb allocation and stays through its lifetime.
- */
-struct in_addr_4in6 {
- uint32_t ia46_pad32[3];
- struct in_addr ia46_addr4;
-};
-
-union in_dependaddr {
- struct in_addr_4in6 id46_addr;
- struct in6_addr id6_addr;
-};
-
-/*
- * NOTE: ipv6 addrs should be 64-bit aligned, per RFC 2553. in_conninfo has
- * some extra padding to accomplish this.
+ * NOTE: IPv6 inpcb bound to unspecified local address shall also receive IPv4
+ * traffic. Thus, IPv6 local address that is IN6_IS_ADDR_UNSPECIFIED() should
+ * also be usable as IPv4 INADDR_ANY. This requires padding in in_dependaddr
+ * to always be zeroed out, which is done right after inpcb allocation and
+ * stays through its lifetime.
* NOTE 2: tcp_syncache.c uses first 5 32-bit words, which identify fport,
* lport, faddr to generate hash, so these fields shouldn't be moved.
*/
-struct in_endpoints {
- uint16_t ie_fport; /* foreign port */
- uint16_t ie_lport; /* local port */
- /* protocol dependent part, local and foreign addr */
- union in_dependaddr ie_dependfaddr; /* foreign host table entry */
- union in_dependaddr ie_dependladdr; /* local host table entry */
-#define ie_faddr ie_dependfaddr.id46_addr.ia46_addr4
-#define ie_laddr ie_dependladdr.id46_addr.ia46_addr4
-#define ie6_faddr ie_dependfaddr.id6_addr
-#define ie6_laddr ie_dependladdr.id6_addr
- uint32_t ie6_zoneid; /* scope zone id */
-};
-
-/*
- * XXX The defines for inc_* are hacks and should be changed to direct
- * references.
- */
struct in_conninfo {
uint8_t inc_flags;
uint8_t inc_len;
- uint16_t inc_fibnum; /* XXX was pad, 16 bits is plenty */
- /* protocol dependent part */
- struct in_endpoints inc_ie;
+ uint16_t inc_fibnum;
+ struct in_endpoints {
+ uint16_t ie_fport; /* foreign port */
+ uint16_t ie_lport; /* local port */
+ union in_dependaddr {
+ struct {
+ uint32_t __pad[3];
+ struct in_addr id4_addr;
+ };
+ struct in6_addr id6_addr;
+ } ie_dependfaddr, ie_dependladdr;
+#define ie_faddr ie_dependfaddr.id4_addr
+#define ie_laddr ie_dependladdr.id4_addr
+#define ie6_faddr ie_dependfaddr.id6_addr
+#define ie6_laddr ie_dependladdr.id6_addr
+ uint32_t ie6_zoneid; /* scope zone id */
+ } inc_ie;
};
/*
@@ -566,7 +550,7 @@ VNET_DECLARE(uint32_t, in_pcbhashseed);
* wildcard IPv4 and wildcard IPv6 must be the same, otherwise AF_INET6
* wildcard bound pcb won't be able to receive AF_INET connections, while:
* jenkins_hash(&zeroes, 1, s) != jenkins_hash(&zeroes, 4, s)
- * See also comment above struct in_addr_4in6.
+ * See also comment above struct in_conninfo.
*/
#define IN_ADDR_JHASH32(addr) \
((addr)->s_addr == INADDR_ANY ? V_in_pcbhashseed : \
diff --git a/sys/netinet/in_pcb_var.h b/sys/netinet/in_pcb_var.h
index 8b005712de27..f70d5cb3e8b5 100644
--- a/sys/netinet/in_pcb_var.h
+++ b/sys/netinet/in_pcb_var.h
@@ -74,7 +74,7 @@ struct inpcblbgroup {
uint8_t il_numa_domain;
int il_fibnum;
union in_dependaddr il_dependladdr; /* (c) */
-#define il_laddr il_dependladdr.id46_addr.ia46_addr4
+#define il_laddr il_dependladdr.id4_addr
#define il6_laddr il_dependladdr.id6_addr
uint32_t il_inpsiz; /* max count in il_inp[] (h) */
uint32_t il_inpcnt; /* cur count in il_inp[] (h) */