usr/src/uts/common/inet/inet_common.c
author masputra
Sat, 22 Oct 2005 22:50:14 -0700
changeset 741 40027a3621ac
parent 0 68f95e015346
child 5815 837c8cd4d6b6
permissions -rw-r--r--
PSARC 2005/082 Yosemite: UDP Performance Enhancement 4796051 Solaris needs a more complete HW checksumming support 4905227 duplicate macros in ipclassifier.h and ip.h 4915681 need hardware checksum offload for the case of IP/UDP reassembly 6201076 outbound flow-control dysfunctional, ip to ce using mdt 6223331 ipv6 flow control may corrupt UDP packets 6223809 16-bit aligned IP header should be allowed for all x86 platforms 6275398 Galaxy hangs when running lmbench 6281836 Yosemite project integration into Solaris 6281885 xge needs to support IPv6 checksum offload 6282776 IPv6 NCE fast path is not created for incoming solicitation 6304890 IP transmit-side checksum logic needs to be tightened 6304902 IP6_IN_NOCKSUM is obsolete and should be torched 6304904 UDP should reject TI_GETPEERNAME for non-connected endpoint 6306768 IP and UDP device and module definitions need to be centralized
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
    23
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * Minor number allocation for various protocol modules.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/mutex.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/ddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/mkdev.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <inet/common.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
typedef struct inet_arena {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
	vmem_t *ineta_arena;	/* Minor number arena */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
	minor_t ineta_maxminor;	/* max minor number in the arena */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
} inet_arena_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
/* Maximum minor number to use */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
static minor_t inet_maxminor = INET_MAXMINOR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
inet_minor_create(char *name, dev_t min_dev, int kmflags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	inet_arena_t *arena = kmem_alloc(sizeof (inet_arena_t), kmflags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
	if (arena != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
		arena->ineta_maxminor = MIN(MAXMIN32, inet_maxminor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
		arena->ineta_arena = vmem_create(name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
		    (void *)min_dev, arena->ineta_maxminor - min_dev + 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
		    1, NULL, NULL, NULL, 1, kmflags | VMC_IDENTIFIER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
		if (arena->ineta_arena == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
			kmem_free(arena, sizeof (inet_arena_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
			arena = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	return (arena);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
inet_minor_destroy(void *a)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	inet_arena_t *arena = (inet_arena_t *)a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	if (arena != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
		vmem_destroy(arena->ineta_arena);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
		kmem_free(arena, sizeof (inet_arena_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
dev_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
inet_minor_alloc(void *a)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	inet_arena_t *arena = (inet_arena_t *)a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	dev_t dev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	while ((dev = (dev_t)vmem_alloc(arena->ineta_arena, 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
		    VM_NOSLEEP)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
		if (arena->ineta_maxminor >= inet_maxminor)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
		if (vmem_add(arena->ineta_arena,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
		    (void *)(uintptr_t)(arena->ineta_maxminor + 1),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		    inet_maxminor - arena->ineta_maxminor, VM_NOSLEEP) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
		arena->ineta_maxminor = inet_maxminor;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	return (dev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
inet_minor_free(void *a, dev_t dev)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	ASSERT((dev != OPENFAIL) && (dev != 0) && (dev <= inet_maxminor));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	vmem_free(((inet_arena_t *)a)->ineta_arena, (void *)dev, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
}
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   106
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   107
/*
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   108
 * This function is used to free a message that has gone through
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   109
 * mi_copyin processing which modifies the M_IOCTL mblk's b_next
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   110
 * and b_prev pointers. We use this function to set b_next/b_prev
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   111
 * to NULL and free them.
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   112
 */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   113
void
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   114
inet_freemsg(mblk_t *mp)
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   115
{
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   116
	mblk_t	*bp = mp;
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   117
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   118
	for (; bp != NULL; bp = bp->b_cont) {
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   119
		bp->b_prev = NULL;
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   120
		bp->b_next = NULL;
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   121
	}
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   122
	freemsg(mp);
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   123
}