3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
  23  */
  24 /* Copyright (c) 1990 Mentat Inc. */
  25 
  26 #ifndef _RAWIP_IMPL_H
  27 #define _RAWIP_IMPL_H
  28 
  29 #ifdef  __cplusplus
  30 extern "C" {
  31 #endif
  32 
  33 #ifdef _KERNEL
  34 
  35 #include <sys/types.h>
  36 #include <sys/netstack.h>
  37 
  38 #include <netinet/in.h>
  39 #include <netinet/icmp6.h>
  40 #include <netinet/ip6.h>
  41 
  42 #include <inet/common.h>
  43 #include <inet/ip.h>
  44 #include <inet/optcom.h>
  45 #include <inet/tunables.h>
  46 
  47 /*
  48  * ICMP stack instances
  49  */
  50 struct icmp_stack {
  51         netstack_t      *is_netstack;   /* Common netstack */
  52         void            *is_head;       /* Head for list of open icmps */
  53         mod_prop_info_t *is_propinfo_tbl; /* holds the icmp tunables */
  54         kstat_t         *is_ksp;        /* kstats */
  55         mib2_rawip_t    is_rawip_mib;   /* SNMP fixed size info */
  56         ldi_ident_t     is_ldi_ident;
  57 };
  58 
  59 typedef struct icmp_stack icmp_stack_t;
  60 
  61 /* Internal icmp control structure, one per open stream */
  62 typedef struct icmp_s {
  63         /*
  64          * The addresses and ports in the conn_t and icmp_state are protected by
  65          * conn_lock. conn_lock also protects the content of icmp_t.
 
  67         uint_t          icmp_state;     /* TPI state */
  68 
  69         /* Written to only once at the time of opening the endpoint */
  70         conn_t          *icmp_connp;
  71 
  72         uint_t
  73             icmp_hdrincl : 1,           /* IP_HDRINCL option + RAW and IGMP */
  74 
  75             icmp_pad_to_bit_31: 31;
  76 
  77         icmp6_filter_t  *icmp_filter;           /* ICMP6_FILTER option */
  78 
  79         /* Set at open time and never changed */
  80         icmp_stack_t    *icmp_is;               /* Stack instance */
  81 
  82         int             icmp_delayed_error;
  83         kmutex_t        icmp_recv_lock;
  84         mblk_t          *icmp_fallback_queue_head;
  85         mblk_t          *icmp_fallback_queue_tail;
  86         struct sockaddr_storage icmp_delayed_addr;
  87 } icmp_t;
  88 
  89 /*
  90  * Object to represent database of options to search passed to
  91  * {sock,tpi}optcom_req() interface routine to take care of option
  92  * management and associated methods.
  93  */
  94 extern optdb_obj_t      icmp_opt_obj;
  95 extern uint_t           icmp_max_optsize;
  96 
  97 extern int      icmp_opt_default(queue_t *, t_scalar_t, t_scalar_t, uchar_t *);
  98 extern int      icmp_tpi_opt_get(queue_t *, t_scalar_t, t_scalar_t, uchar_t *);
  99 extern int      icmp_tpi_opt_set(queue_t *, uint_t, int, int, uint_t, uchar_t *,
 100                     uint_t *, uchar_t *, void *, cred_t *);
 101 extern mblk_t   *icmp_snmp_get(queue_t *q, mblk_t *mpctl);
 102 
 103 extern void     icmp_ddi_g_init(void);
 104 extern void     icmp_ddi_g_destroy(void);
 105 
 106 extern sock_lower_handle_t rawip_create(int, int, int, sock_downcalls_t **,
 | 
 
 
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
  23  * Copyright 2016 Joyent, Inc.
  24  */
  25 /* Copyright (c) 1990 Mentat Inc. */
  26 
  27 #ifndef _RAWIP_IMPL_H
  28 #define _RAWIP_IMPL_H
  29 
  30 #ifdef  __cplusplus
  31 extern "C" {
  32 #endif
  33 
  34 #ifdef _KERNEL
  35 
  36 #include <sys/types.h>
  37 #include <sys/netstack.h>
  38 
  39 #include <netinet/in.h>
  40 #include <netinet/icmp6.h>
  41 #include <netinet/ip6.h>
  42 
  43 #include <inet/common.h>
  44 #include <inet/ip.h>
  45 #include <inet/optcom.h>
  46 #include <inet/tunables.h>
  47 #include <inet/bpf.h>
  48 
  49 /*
  50  * ICMP stack instances
  51  */
  52 struct icmp_stack {
  53         netstack_t      *is_netstack;   /* Common netstack */
  54         void            *is_head;       /* Head for list of open icmps */
  55         mod_prop_info_t *is_propinfo_tbl; /* holds the icmp tunables */
  56         kstat_t         *is_ksp;        /* kstats */
  57         mib2_rawip_t    is_rawip_mib;   /* SNMP fixed size info */
  58         ldi_ident_t     is_ldi_ident;
  59 };
  60 
  61 typedef struct icmp_stack icmp_stack_t;
  62 
  63 /* Internal icmp control structure, one per open stream */
  64 typedef struct icmp_s {
  65         /*
  66          * The addresses and ports in the conn_t and icmp_state are protected by
  67          * conn_lock. conn_lock also protects the content of icmp_t.
 
  69         uint_t          icmp_state;     /* TPI state */
  70 
  71         /* Written to only once at the time of opening the endpoint */
  72         conn_t          *icmp_connp;
  73 
  74         uint_t
  75             icmp_hdrincl : 1,           /* IP_HDRINCL option + RAW and IGMP */
  76 
  77             icmp_pad_to_bit_31: 31;
  78 
  79         icmp6_filter_t  *icmp_filter;           /* ICMP6_FILTER option */
  80 
  81         /* Set at open time and never changed */
  82         icmp_stack_t    *icmp_is;               /* Stack instance */
  83 
  84         int             icmp_delayed_error;
  85         kmutex_t        icmp_recv_lock;
  86         mblk_t          *icmp_fallback_queue_head;
  87         mblk_t          *icmp_fallback_queue_tail;
  88         struct sockaddr_storage icmp_delayed_addr;
  89 
  90         krwlock_t       icmp_bpf_lock;  /* protects icmp_bpf */
  91         ip_bpf_insn_t   *icmp_bpf_prog; /* SO_ATTACH_FILTER bpf */
  92         uint_t          icmp_bpf_len;
  93 } icmp_t;
  94 
  95 /*
  96  * Object to represent database of options to search passed to
  97  * {sock,tpi}optcom_req() interface routine to take care of option
  98  * management and associated methods.
  99  */
 100 extern optdb_obj_t      icmp_opt_obj;
 101 extern uint_t           icmp_max_optsize;
 102 
 103 extern int      icmp_opt_default(queue_t *, t_scalar_t, t_scalar_t, uchar_t *);
 104 extern int      icmp_tpi_opt_get(queue_t *, t_scalar_t, t_scalar_t, uchar_t *);
 105 extern int      icmp_tpi_opt_set(queue_t *, uint_t, int, int, uint_t, uchar_t *,
 106                     uint_t *, uchar_t *, void *, cred_t *);
 107 extern mblk_t   *icmp_snmp_get(queue_t *q, mblk_t *mpctl);
 108 
 109 extern void     icmp_ddi_g_init(void);
 110 extern void     icmp_ddi_g_destroy(void);
 111 
 112 extern sock_lower_handle_t rawip_create(int, int, int, sock_downcalls_t **,
 |