Edit

IABSD.fr/src/sys/netmpls/mpls_raw.c

Branch :

  • Show log

    Commit

  • Author : mvs
    Date : 2024-08-14 17:52:47
    Hash : 7af15f03
    Message : Push kernel lock down to net_sysctl(). All except PF_MPLS paths are mp-safe: - net_link_sysctl() and following net_ifiq_sysctl() only return EOPNOTSUPP; - uipc_sysctl() - mp-safe atomic access to integers; - bpf_sysctl() - mp-safe atomic access to integers; - pflow_sysctl() - returns statistics from per-CPU counters; - pipex_sysctl() - mp-safe atomic access to integer; Push kernel lock down to mpls_sysctl(). sysctl_int_bounded() do copying with local variable, so context switch is safe. No need to wire memory or take `sysctl_lock' rwlock(9). Keep protocols locked as they was include pages wiring. Copying will not sleep - no network slowdown while doing it with net lock held. ok bluhm

  • sys/netmpls/mpls_raw.c
  • /*	$OpenBSD: mpls_raw.c,v 1.21 2024/08/14 17:52:47 mvs Exp $	*/
    
    /*
     * Copyright (C) 1999, 2000 and 2001 AYAME Project, WIDE Project.
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * 1. Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     * 2. Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     * 3. Neither the name of the project nor the names of its contributors
     *    may be used to endorse or promote products derived from this software
     *    without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
     * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 
     * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
     * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
     * SUCH DAMAGE.
     */
    
    #include <sys/param.h>
    #include <sys/mbuf.h>
    #include <sys/errno.h>
    #include <sys/sockio.h>
    #include <sys/socket.h>
    #include <sys/socketvar.h>
    #include <sys/systm.h>
    #include <sys/sysctl.h>
    
    #include <net/if.h>
    #include <net/if_var.h>
    
    #include <netmpls/mpls.h>
    
    int mpls_defttl = 255;
    int mpls_mapttl_ip = 1;
    int mpls_mapttl_ip6 = 0;
    
    const struct sysctl_bounded_args mplsctl_vars[] = {
    	{ MPLSCTL_DEFTTL, &mpls_defttl, 0, 255 },
    	{ MPLSCTL_MAPTTL_IP, &mpls_mapttl_ip, 0, 1 },
    	{ MPLSCTL_MAPTTL_IP6, &mpls_mapttl_ip6, 0, 1 },
    };
    
    int
    mpls_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
        size_t newlen)
    {
    	int error;
    
    	KERNEL_LOCK();
    	error = sysctl_bounded_arr(mplsctl_vars, nitems(mplsctl_vars),
    	    name, namelen, oldp, oldlenp, newp, newlen);
    	KERNEL_UNLOCK();
    
    	return error;
    }