Download raw body.
sysctl(2): unlock `gre_vars'
On Wed, Dec 04, 2024 at 08:32:53PM +0300, Vitaliy Makkoveev wrote:
> Both `gre_allow' and `gre_wccp' are atomically accessed integers. They
> could have only '0' and '1' values, so no extra dances around
> atomic_load_int(9) required.
OK bluhm@
> Index: sys/net/if_gre.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_gre.c,v
> diff -u -p -r1.178 if_gre.c
> --- sys/net/if_gre.c 23 Dec 2023 10:52:54 -0000 1.178
> +++ sys/net/if_gre.c 4 Dec 2024 17:29:28 -0000
> @@ -101,6 +101,11 @@
> #include <net/if_etherbridge.h>
>
> /*
> + * Locks used to protect data:
> + * a atomic
> + */
> +
> +/*
> * packet formats
> */
> struct gre_header {
> @@ -545,8 +550,8 @@ struct eoip_tree eoip_tree = RBT_INITIAL
> * allowed as well.
> *
> */
> -int gre_allow = 0;
> -int gre_wccp = 0;
> +int gre_allow = 0; /* [a] */
> +int gre_wccp = 0; /* [a] */
>
> void
> greattach(int n)
> @@ -1009,7 +1014,7 @@ gre_input_key(struct mbuf **mp, int *off
> int mcast = 0;
> uint8_t itos;
>
> - if (!gre_allow)
> + if (!atomic_load_int(&gre_allow))
> goto decline;
>
> key->t_rtableid = m->m_pkthdr.ph_rtableid;
> @@ -1092,7 +1097,8 @@ gre_input_key(struct mbuf **mp, int *off
> * draft-wilson-wrec-wccp-v2-01.txt
> */
>
> - if (!gre_wccp && !ISSET(ifp->if_flags, IFF_LINK0))
> + if (!atomic_load_int(&gre_wccp) &&
> + !ISSET(ifp->if_flags, IFF_LINK0))
> goto decline;
>
> /*
> @@ -1494,7 +1500,7 @@ gre_output(struct ifnet *ifp, struct mbu
> struct m_tag *mtag;
> int error = 0;
>
> - if (!gre_allow) {
> + if (!atomic_load_int(&gre_allow)) {
> error = EACCES;
> goto drop;
> }
> @@ -1633,7 +1639,7 @@ mgre_output(struct ifnet *ifp, struct mb
> sa_family_t af;
> const void *addr;
>
> - if (!gre_allow) {
> + if (!atomic_load_int(&gre_allow)) {
> error = EACCES;
> goto drop;
> }
> @@ -1785,7 +1791,7 @@ egre_start(struct ifnet *ifp)
> caddr_t if_bpf;
> #endif
>
> - if (!gre_allow) {
> + if (!atomic_load_int(&gre_allow)) {
> ifq_purge(&ifp->if_snd);
> return;
> }
> @@ -3642,7 +3648,7 @@ nvgre_start(struct ifnet *ifp)
> caddr_t if_bpf;
> #endif
>
> - if (!gre_allow) {
> + if (!atomic_load_int(&gre_allow)) {
> ifq_purge(&ifp->if_snd);
> return;
> }
> @@ -3833,7 +3839,7 @@ eoip_start(struct ifnet *ifp)
> caddr_t if_bpf;
> #endif
>
> - if (!gre_allow) {
> + if (!atomic_load_int(&gre_allow)) {
> ifq_purge(&ifp->if_snd);
> return;
> }
> @@ -4047,13 +4053,8 @@ int
> gre_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
> size_t newlen)
> {
> - int error;
> -
> - NET_LOCK();
> - error = sysctl_bounded_arr(gre_vars, nitems(gre_vars), name,
> + return sysctl_bounded_arr(gre_vars, nitems(gre_vars), name,
> namelen, oldp, oldlenp, newp, newlen);
> - NET_UNLOCK();
> - return error;
> }
>
> static inline int
> Index: sys/netinet/in_proto.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/in_proto.c,v
> diff -u -p -r1.113 in_proto.c
> --- sys/netinet/in_proto.c 22 Aug 2024 10:58:31 -0000 1.113
> +++ sys/netinet/in_proto.c 4 Dec 2024 17:29:28 -0000
> @@ -318,7 +318,7 @@ const struct protosw inetsw[] = {
> .pr_type = SOCK_RAW,
> .pr_domain = &inetdomain,
> .pr_protocol = IPPROTO_GRE,
> - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
> + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET|PR_MPSYSCTL,
> .pr_input = gre_input,
> .pr_ctloutput = rip_ctloutput,
> .pr_usrreqs = &gre_usrreqs,
sysctl(2): unlock `gre_vars'