summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/inet/ip_impl.h
diff options
context:
space:
mode:
authorVenugopal Iyer <Venu.Iyer@Sun.COM>2009-02-17 01:31:30 -0800
committerVenugopal Iyer <Venu.Iyer@Sun.COM>2009-02-17 01:31:30 -0800
commitae6aa22afeb444ae208c287e7227a4a7c877f17a (patch)
tree744dffd8856e6a2a16544575ca8773771051dada /usr/src/uts/common/inet/ip_impl.h
parentd02310705313ee2fcefee164a4b26d1fa85e9d22 (diff)
downloadillumos-gate-ae6aa22afeb444ae208c287e7227a4a7c877f17a.tar.gz
PSARC/2009/099 dladm show-usage modifications
6726676 flow should not be seen by flowadm show-usage after the flow been removed by flowadm remove-flow 6766669 "dladm show-vnic -o" can't accept MACADDRESS 6773854 Per Tx ring flow control for UDP 6777547 mac_tx() should compute the hash if the passed hint is zero 6778557 nxge m_tx() should fanout to multiple rings for vnet scalability 6779356 sometimes packets are not classified to the correct flow 6783011 pre-existing subflows not initialized on a non-dls client when brought up 6786734 acctadm dladm_start_usagelog() calls need some work 6789760 mac perimeter deadlock due to dls_devnet_stat_update() 6789883 dladm show-link -s is adrift again. 6791099 mac_tx() frees the message but returns non-NULL cookie which causes panic 6791109 maxbw set on a link should not apply if this link is the underlying port of an aggregation 6791118 panic in mac_bcast_delete() unplumbing an IP interface 6791456 deleting last vnic interface causes bge interface to stop working 6791678 xvm guests don't communicate through vnics configured on vlan 6792164 race between mac_tx_is_flow_blocked() and mac_srs_group_teardown() could cause panic 6792546 paniced in bge_ring_tx()/freemsg() due to mp->b_next == NULL && mp->b_prev == NULL 6792555 paniced in mac_flow_walk_nolock() due to assertion failed: cnt == ft->ft_flow_count 6792871 multiple VLANs per MAC client cause hang in mac_flow_wait() 6792942 60% regression for Guest-to-Guest network throughput on snv106 6793278 the multicast addresses are not added to the aggregation port in certain scenarios 6793436 panic in mac_fini_macaddr() on mac_register() failure 6796850 SUNWcnetr postinstall script spews errors due to bad interface matching 6803378 need support for dls_bypass and rx fanout on non-ethernet media
Diffstat (limited to 'usr/src/uts/common/inet/ip_impl.h')
-rw-r--r--usr/src/uts/common/inet/ip_impl.h84
1 files changed, 66 insertions, 18 deletions
diff --git a/usr/src/uts/common/inet/ip_impl.h b/usr/src/uts/common/inet/ip_impl.h
index 369ba60005..7711a2fedc 100644
--- a/usr/src/uts/common/inet/ip_impl.h
+++ b/usr/src/uts/common/inet/ip_impl.h
@@ -503,24 +503,72 @@ typedef struct ip_pdescinfo_s PDESCINFO_STRUCT(2) ip_pdescinfo_t;
#define ILL_DIRECT_CAPABLE(ill) \
(((ill)->ill_capabilities & ILL_CAPAB_DLD_DIRECT) != 0)
-#define ILL_SEND_TX(ill, ire, hint, mp, flag) { \
- if (ILL_DIRECT_CAPABLE(ill) && DB_TYPE(mp) == M_DATA) { \
- ill_dld_direct_t *idd; \
- \
- idd = &(ill)->ill_dld_capab->idc_direct; \
- /* \
- * Send the packet directly to DLD, where it \
- * may be queued depending on the availability \
- * of transmit resources at the media layer. \
- * Ignore the returned value for the time being \
- * In future, we may want to take this into \
- * account and flow control the TCP. \
- */ \
- (void) idd->idd_tx_df(idd->idd_tx_dh, mp, \
- (uintptr_t)(hint), flag); \
- } else { \
- putnext((ire)->ire_stq, mp); \
- } \
+#define ILL_SEND_TX(ill, ire, hint, mp, flag, connp) { \
+ if (ILL_DIRECT_CAPABLE(ill) && DB_TYPE(mp) == M_DATA) { \
+ ill_dld_direct_t *idd; \
+ uintptr_t cookie; \
+ conn_t *udp_connp = (conn_t *)connp; \
+ \
+ idd = &(ill)->ill_dld_capab->idc_direct; \
+ /* \
+ * Send the packet directly to DLD, where it \
+ * may be queued depending on the availability \
+ * of transmit resources at the media layer. \
+ * Ignore the returned value for the time being \
+ * In future, we may want to take this into \
+ * account and flow control the TCP. \
+ */ \
+ cookie = idd->idd_tx_df(idd->idd_tx_dh, mp, \
+ (uintptr_t)(hint), flag); \
+ \
+ /* \
+ * non-NULL cookie indicates flow control situation \
+ * and the cookie itself identifies this specific \
+ * Tx ring that is blocked. This cookie is used to \
+ * block the UDP conn that is sending packets over \
+ * this specific Tx ring. \
+ */ \
+ if ((cookie != NULL) && (udp_connp != NULL) && \
+ (udp_connp->conn_ulp == IPPROTO_UDP)) { \
+ idl_tx_list_t *idl_txl; \
+ ip_stack_t *ipst; \
+ \
+ /* \
+ * Flow controlled. \
+ */ \
+ DTRACE_PROBE2(ill__send__tx__cookie, \
+ uintptr_t, cookie, conn_t *, udp_connp); \
+ ipst = udp_connp->conn_netstack->netstack_ip; \
+ idl_txl = \
+ &ipst->ips_idl_tx_list[IDLHASHINDEX(cookie)];\
+ mutex_enter(&idl_txl->txl_lock); \
+ if (udp_connp->conn_direct_blocked || \
+ (idd->idd_tx_fctl_df(idd->idd_tx_fctl_dh, \
+ cookie) == 0)) { \
+ DTRACE_PROBE1(ill__tx__not__blocked, \
+ boolean, \
+ udp_connp->conn_direct_blocked); \
+ } else if (idl_txl->txl_cookie != NULL && \
+ idl_txl->txl_cookie != cookie) { \
+ udp_t *udp = udp_connp->conn_udp; \
+ udp_stack_t *us = udp->udp_us; \
+ \
+ DTRACE_PROBE2(ill__send__tx__collision, \
+ uintptr_t, cookie, \
+ uintptr_t, idl_txl->txl_cookie); \
+ UDP_STAT(us, udp_cookie_coll); \
+ } else { \
+ udp_connp->conn_direct_blocked = B_TRUE;\
+ idl_txl->txl_cookie = cookie; \
+ conn_drain_insert(udp_connp, idl_txl); \
+ DTRACE_PROBE1(ill__send__tx__insert, \
+ conn_t *, udp_connp); \
+ } \
+ mutex_exit(&idl_txl->txl_lock); \
+ } \
+ } else { \
+ putnext((ire)->ire_stq, mp); \
+ } \
}
#define MBLK_RX_FANOUT_SLOWPATH(mp, ipha) \