git: e4e0f497429c - main - in: add in_mask2len()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 17 Dec 2024 10:07:41 UTC
The branch main has been updated by kp:
URL: https://cgit.FreeBSD.org/src/commit/?id=e4e0f497429c635a02897d86c4eb5ec649cc2df8
commit e4e0f497429c635a02897d86c4eb5ec649cc2df8
Author: Kristof Provost <kp@FreeBSD.org>
AuthorDate: 2024-10-22 08:45:06 +0000
Commit: Kristof Provost <kp@FreeBSD.org>
CommitDate: 2024-12-17 10:07:12 +0000
in: add in_mask2len()
Similar to the existing in6_mask2len() function, but for IPv4. This will be used
by pf's nat64 code.
Obtained from: OpenBSD
Sponsored by: Rubicon Communications, LLC ("Netgate")
Differential Revision: https://reviews.freebsd.org/D47785
---
sys/netinet/in.c | 21 +++++++++++++++++++++
sys/netinet/in_var.h | 1 +
2 files changed, 22 insertions(+)
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index c78f0f5758f7..a6f212e9d3ef 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -441,6 +441,27 @@ in_control_ioctl(u_long cmd, void *data, struct ifnet *ifp,
return (error);
}
+int
+in_mask2len(struct in_addr *mask)
+{
+ int x, y;
+ u_char *p;
+
+ p = (u_char *)mask;
+ for (x = 0; x < sizeof(*mask); x++) {
+ if (p[x] != 0xff)
+ break;
+ }
+ y = 0;
+ if (x < sizeof(*mask)) {
+ for (y = 0; y < 8; y++) {
+ if ((p[x] & (0x80 >> y)) == 0)
+ break;
+ }
+ }
+ return (x * 8 + y);
+}
+
int
in_control(struct socket *so, u_long cmd, void *data, struct ifnet *ifp,
struct thread *td)
diff --git a/sys/netinet/in_var.h b/sys/netinet/in_var.h
index b4bdb2a65fc8..1f6f6edb9219 100644
--- a/sys/netinet/in_var.h
+++ b/sys/netinet/in_var.h
@@ -459,6 +459,7 @@ int in_joingroup_locked(struct ifnet *, const struct in_addr *,
int in_leavegroup(struct in_multi *, /*const*/ struct in_mfilter *);
int in_leavegroup_locked(struct in_multi *,
/*const*/ struct in_mfilter *);
+int in_mask2len(struct in_addr *);
int in_control(struct socket *, u_long, void *, struct ifnet *,
struct thread *);
int in_control_ioctl(u_long, void *, struct ifnet *,