aboutsummaryrefslogtreecommitdiff
path: root/sys/netipsec
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2022-08-17 18:50:31 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2022-08-17 18:50:31 +0000
commit78b1fc05b20504ed13aeeb4a5b47443246cabaeb (patch)
tree9508c47a91e5db3c5de822e8dc43c3d4e841e156 /sys/netipsec
parentef8b872301c5fbeeea3b0410b369b8f36584cd65 (diff)
downloadsrc-78b1fc05b20504ed13aeeb4a5b47443246cabaeb.tar.gz
src-78b1fc05b20504ed13aeeb4a5b47443246cabaeb.zip
protosw: separate pr_input and pr_ctlinput out of protosw
The protosw KPI historically has implemented two quite orthogonal things: protocols that implement a certain kind of socket, and protocols that are IPv4/IPv6 protocol. These two things do not make one-to-one correspondence. The pr_input and pr_ctlinput methods were utilized only in IP protocols. This strange duality required IP protocols that doesn't have a socket to declare protosw, e.g. carp(4). On the other hand developers of socket protocols thought that they need to define pr_input/pr_ctlinput always, which lead to strange dead code, e.g. div_input() or sdp_ctlinput(). With this change pr_input and pr_ctlinput as part of protosw disappear and IPv4/IPv6 get their private single level protocol switch table ip_protox[] and ip6_protox[] respectively, pointing at array of ipproto_input_t functions. The pr_ctlinput that was used for control input coming from the network (ICMP, ICMPv6) is now represented by ip_ctlprotox[] and ip6_ctlprotox[]. ipproto_register() becomes the only official way to register in the table. Those protocols that were always static and unlikely anybody is interested in making them loadable, are now registered by ip_init(), ip6_init(). An IP protocol that considers itself unloadable shall register itself within its own private SYSINIT(). Reviewed by: tuexen, melifaro Differential revision: https://reviews.freebsd.org/D36157
Diffstat (limited to 'sys/netipsec')
-rw-r--r--sys/netipsec/ipsec_input.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/netipsec/ipsec_input.c b/sys/netipsec/ipsec_input.c
index 1548a87c844d..ca6c6592dfa4 100644
--- a/sys/netipsec/ipsec_input.c
+++ b/sys/netipsec/ipsec_input.c
@@ -573,6 +573,8 @@ ipsec6_ctlinput(int code, struct sockaddr *sa, void *v)
return (0);
}
+extern ipproto_input_t *ip6_protox[];
+
/*
* IPsec input callback, called by the transform callback. Takes care of
* filtering and other sanity checks on the processed packet.
@@ -760,7 +762,7 @@ ipsec6_common_input_cb(struct mbuf *m, struct secasvar *sav, int skip,
error = EINVAL;
goto bad;
}
- nxt = (*inet6sw[ip6_protox[nxt]].pr_input)(&m, &skip, nxt);
+ nxt = ip6_protox[nxt](&m, &skip, nxt);
}
NET_EPOCH_EXIT(et);
key_freesav(&sav);