summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/inet/udp_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/inet/udp_impl.h')
-rw-r--r--usr/src/uts/common/inet/udp_impl.h187
1 files changed, 22 insertions, 165 deletions
diff --git a/usr/src/uts/common/inet/udp_impl.h b/usr/src/uts/common/inet/udp_impl.h
index 1b4935f456..4da82a0377 100644
--- a/usr/src/uts/common/inet/udp_impl.h
+++ b/usr/src/uts/common/inet/udp_impl.h
@@ -51,84 +51,6 @@ extern "C" {
#define UDP_MOD_ID 5607
-typedef struct udp_bits_s {
-
- uint32_t
-
- udpb_debug : 1, /* SO_DEBUG "socket" option. */
- udpb_dontroute : 1, /* SO_DONTROUTE "socket" option. */
- udpb_broadcast : 1, /* SO_BROADCAST "socket" option. */
- udpb_useloopback : 1, /* SO_USELOOPBACK "socket" option */
-
- udpb_reuseaddr : 1, /* SO_REUSEADDR "socket" option. */
- udpb_dgram_errind : 1, /* SO_DGRAM_ERRIND option */
- udpb_recvdstaddr : 1, /* IP_RECVDSTADDR option */
- udpb_recvopts : 1, /* IP_RECVOPTS option */
-
- udpb_unspec_source : 1, /* IP*_UNSPEC_SRC option */
- udpb_ip_recvpktinfo : 1, /* IPV6_RECVPKTINFO option */
- udpb_ipv6_recvhoplimit : 1, /* IPV6_RECVHOPLIMIT option */
- udpb_ipv6_recvhopopts : 1, /* IPV6_RECVHOPOPTS option */
-
- udpb_ipv6_recvdstopts : 1, /* IPV6_RECVDSTOPTS option */
- udpb_ipv6_recvrthdr : 1, /* IPV6_RECVRTHDR option */
- udpb_ipv6_recvtclass : 1, /* IPV6_RECVTCLASS */
- udpb_ipv6_recvpathmtu : 1, /* IPV6_RECVPATHMTU */
-
- udpb_anon_priv_bind : 1,
- udpb_exclbind : 1, /* ``exclusive'' binding */
- udpb_recvif : 1, /* IP_RECVIF option */
- udpb_recvslla : 1, /* IP_RECVSLLA option */
-
- udpb_recvttl : 1, /* IP_RECVTTL option */
- udpb_recvucred : 1, /* IP_RECVUCRED option */
- udpb_old_ipv6_recvdstopts : 1, /* old form of IPV6_DSTOPTS */
- udpb_ipv6_recvrthdrdstopts : 1, /* IPV6_RECVRTHDRDSTOPTS */
-
- udpb_rcvhdr : 1, /* UDP_RCVHDR option */
- udpb_issocket : 1, /* socket mode; sockfs is on top */
- udpb_timestamp : 1, /* SO_TIMESTAMP "socket" option */
-
- udpb_nat_t_endpoint : 1, /* UDP_NAT_T_ENDPOINT option */
- udpb_pad_to_bit_31 : 4;
-} udp_bits_t;
-
-#define udp_debug udp_bits.udpb_debug
-#define udp_dontroute udp_bits.udpb_dontroute
-#define udp_broadcast udp_bits.udpb_broadcast
-#define udp_useloopback udp_bits.udpb_useloopback
-
-#define udp_reuseaddr udp_bits.udpb_reuseaddr
-#define udp_dgram_errind udp_bits.udpb_dgram_errind
-#define udp_recvdstaddr udp_bits.udpb_recvdstaddr
-#define udp_recvopts udp_bits.udpb_recvopts
-
-#define udp_unspec_source udp_bits.udpb_unspec_source
-#define udp_ip_recvpktinfo udp_bits.udpb_ip_recvpktinfo
-#define udp_ipv6_recvhoplimit udp_bits.udpb_ipv6_recvhoplimit
-#define udp_ipv6_recvhopopts udp_bits.udpb_ipv6_recvhopopts
-
-#define udp_ipv6_recvdstopts udp_bits.udpb_ipv6_recvdstopts
-#define udp_ipv6_recvrthdr udp_bits.udpb_ipv6_recvrthdr
-#define udp_ipv6_recvtclass udp_bits.udpb_ipv6_recvtclass
-#define udp_ipv6_recvpathmtu udp_bits.udpb_ipv6_recvpathmtu
-
-#define udp_anon_priv_bind udp_bits.udpb_anon_priv_bind
-#define udp_exclbind udp_bits.udpb_exclbind
-#define udp_recvif udp_bits.udpb_recvif
-#define udp_recvslla udp_bits.udpb_recvslla
-
-#define udp_recvttl udp_bits.udpb_recvttl
-#define udp_recvucred udp_bits.udpb_recvucred
-#define udp_old_ipv6_recvdstopts udp_bits.udpb_old_ipv6_recvdstopts
-#define udp_ipv6_recvrthdrdstopts udp_bits.udpb_ipv6_recvrthdrdstopts
-
-#define udp_rcvhdr udp_bits.udpb_rcvhdr
-#define udp_issocket udp_bits.udpb_issocket
-#define udp_timestamp udp_bits.udpb_timestamp
-
-#define udp_nat_t_endpoint udp_bits.udpb_nat_t_endpoint
-
/*
* Bind hash list size and hash function. It has to be a power of 2 for
* hashing.
@@ -148,49 +70,21 @@ typedef struct udp_fanout_s {
#endif
} udp_fanout_t;
-/*
- * dev_q is the write side queue of the entity below IP.
- * If there is a module below IP, we can't optimize by looking
- * at q_first of the queue below IP. If the driver is directly
- * below IP and if the q_first is NULL, we optimize by not doing
- * the canput check
- */
-#define DEV_Q_FLOW_BLOCKED(dev_q) \
- (((dev_q)->q_next != NULL || (dev_q)->q_first != NULL) && \
- !canput(dev_q))
-
/* Kstats */
typedef struct udp_stat { /* Class "net" kstats */
- kstat_named_t udp_ip_send;
- kstat_named_t udp_ip_ire_send;
- kstat_named_t udp_ire_null;
kstat_named_t udp_sock_fallback;
- kstat_named_t udp_out_sw_cksum;
- kstat_named_t udp_out_sw_cksum_bytes;
kstat_named_t udp_out_opt;
kstat_named_t udp_out_err_notconn;
kstat_named_t udp_out_err_output;
kstat_named_t udp_out_err_tudr;
- kstat_named_t udp_in_pktinfo;
- kstat_named_t udp_in_recvdstaddr;
- kstat_named_t udp_in_recvopts;
- kstat_named_t udp_in_recvif;
- kstat_named_t udp_in_recvslla;
- kstat_named_t udp_in_recvucred;
- kstat_named_t udp_in_recvttl;
- kstat_named_t udp_in_recvhopopts;
- kstat_named_t udp_in_recvhoplimit;
- kstat_named_t udp_in_recvdstopts;
- kstat_named_t udp_in_recvrtdstopts;
- kstat_named_t udp_in_recvrthdr;
- kstat_named_t udp_in_recvpktinfo;
- kstat_named_t udp_in_recvtclass;
- kstat_named_t udp_in_timestamp;
- kstat_named_t udp_ip_rcvpktinfo;
- kstat_named_t udp_cookie_coll;
#ifdef DEBUG
kstat_named_t udp_data_conn;
kstat_named_t udp_data_notconn;
+ kstat_named_t udp_out_lastdst;
+ kstat_named_t udp_out_diffdst;
+ kstat_named_t udp_out_ipv6;
+ kstat_named_t udp_out_mapped;
+ kstat_named_t udp_out_ipv4;
#endif
} udp_stat_t;
@@ -242,79 +136,43 @@ typedef struct udp_stack udp_stack_t;
/* Internal udp control structure, one per open stream */
typedef struct udp_s {
- krwlock_t udp_rwlock; /* Protects most of udp_t */
- t_scalar_t udp_pending_op; /* The current TPI operation */
/*
- * Following fields up to udp_ipversion protected by conn_lock,
- * and the fanout lock i.e.uf_lock. Need both locks to change the
- * field, either lock is sufficient for reading the field.
+ * The addresses and ports in the conn_t and udp_state are protected by
+ * conn_lock and the fanout lock i.e. uf_lock. Need both locks to change
+ * the fields, either lock is sufficient for reading the field.
+ * conn_lock also protects the content of udp_t.
*/
uint32_t udp_state; /* TPI state */
- in_port_t udp_port; /* Port bound to this stream */
- in_port_t udp_dstport; /* Connected port */
- in6_addr_t udp_v6src; /* Source address of this stream */
- in6_addr_t udp_bound_v6src; /* Explicitly bound address */
- in6_addr_t udp_v6dst; /* Connected destination */
- /*
- * IP format that packets transmitted from this struct should use.
- * Value can be IP4_VERSION or IPV6_VERSION.
- */
- ushort_t udp_ipversion;
- /* Written to only once at the time of opening the endpoint */
- sa_family_t udp_family; /* Family from socket() call */
-
- /* Following protected by udp_rwlock */
- uint32_t udp_flowinfo; /* Connected flow id and tclass */
- uint32_t udp_max_hdr_len; /* For write offset in stream head */
- uint32_t udp_ip_snd_options_len; /* Len of IPv4 options */
- uchar_t *udp_ip_snd_options; /* Ptr to IPv4 options */
- uint32_t udp_ip_rcv_options_len; /* Len of IPv4 options recvd */
- uchar_t *udp_ip_rcv_options; /* Ptr to IPv4 options recvd */
- uchar_t udp_multicast_ttl; /* IP*_MULTICAST_TTL/HOPS */
- ipaddr_t udp_multicast_if_addr; /* IP_MULTICAST_IF option */
- uint_t udp_multicast_if_index; /* IPV6_MULTICAST_IF option */
- int udp_bound_if; /* IP*_BOUND_IF option */
+ ip_pkt_t udp_recv_ipp; /* Used for IPv4 options received */
/* Written to only once at the time of opening the endpoint */
conn_t *udp_connp;
- /* Following protected by udp_rwlock */
- udp_bits_t udp_bits; /* Bit fields defined above */
- uint8_t udp_type_of_service; /* IP_TOS option */
- uint8_t udp_ttl; /* TTL or hoplimit */
- ip6_pkt_t udp_sticky_ipp; /* Sticky options */
- uint8_t *udp_sticky_hdrs; /* Prebuilt IPv6 hdrs */
- uint_t udp_sticky_hdrs_len; /* Incl. ip6h and any ip6i */
+ uint32_t
+ udp_issocket : 1, /* socket mode; sockfs is on top */
+ udp_nat_t_endpoint : 1, /* UDP_NAT_T_ENDPOINT option */
+ udp_rcvhdr : 1, /* UDP_RCVHDR option */
+
+ udp_pad_to_bit_31 : 29;
/* Following 2 fields protected by the uf_lock */
struct udp_s *udp_bind_hash; /* Bind hash chain */
struct udp_s **udp_ptpbhn; /* Pointer to previous bind hash next. */
- /* Following protected by udp_rwlock */
kmutex_t udp_recv_lock; /* recv lock */
size_t udp_rcv_disply_hiwat; /* user's view of rcvbuf */
size_t udp_rcv_hiwat; /* receive high watermark */
- size_t udp_rcv_lowat; /* receive low watermark */
- size_t udp_xmit_hiwat; /* Send buffer high watermark */
- size_t udp_xmit_lowat; /* Send buffer low watermark */
- uint_t udp_label_len; /* length of security label */
- uint_t udp_label_len_v6; /* len of v6 security label */
- in6_addr_t udp_v6lastdst; /* most recent destination */
- in_port_t udp_lastdstport; /* most recent dest port */
- cred_t *udp_last_cred; /* most recent credentials */
- cred_t *udp_effective_cred; /* cred with effective label */
-
- uint64_t udp_open_time; /* time when this was opened */
- pid_t udp_open_pid; /* process id when this was opened */
+
+ /* Set at open time and never changed */
udp_stack_t *udp_us; /* Stack instance for zone */
+
int udp_delayed_error;
mblk_t *udp_fallback_queue_head;
mblk_t *udp_fallback_queue_tail;
struct sockaddr_storage udp_delayed_addr;
} udp_t;
-/* UDP Protocol header */
/* UDP Protocol header aligned */
typedef struct udpahdr_s {
in_port_t uha_src_port; /* Source port */
@@ -334,6 +192,8 @@ typedef struct udpahdr_s {
#define us_xmit_lowat us_param_arr[8].udp_param_value
#define us_recv_hiwat us_param_arr[9].udp_param_value
#define us_max_buf us_param_arr[10].udp_param_value
+#define us_pmtu_discovery us_param_arr[11].udp_param_value
+#define us_sendto_ignerr us_param_arr[12].udp_param_value
#define UDP_STAT(us, x) ((us)->us_statistics.x.value.ui64++)
@@ -348,14 +208,11 @@ typedef struct udpahdr_s {
extern int udp_opt_default(queue_t *, t_scalar_t, t_scalar_t, uchar_t *);
extern int udp_tpi_opt_get(queue_t *, t_scalar_t, t_scalar_t, uchar_t *);
extern int udp_tpi_opt_set(queue_t *, uint_t, int, int, uint_t, uchar_t *,
- uint_t *, uchar_t *, void *, cred_t *, mblk_t *);
+ uint_t *, uchar_t *, void *, cred_t *);
extern mblk_t *udp_snmp_get(queue_t *, mblk_t *);
extern int udp_snmp_set(queue_t *, t_scalar_t, t_scalar_t, uchar_t *, int);
-extern void udp_close_free(conn_t *);
-extern void udp_quiesce_conn(conn_t *);
extern void udp_ddi_g_init(void);
extern void udp_ddi_g_destroy(void);
-extern void udp_g_q_inactive(udp_stack_t *);
extern void udp_output(conn_t *connp, mblk_t *mp, struct sockaddr *addr,
socklen_t addrlen);
extern void udp_wput(queue_t *, mblk_t *);