435 return (0);
436 /* TODO: delete entry defined by tce */
437 return (1);
438 default:
439 return (0);
440 }
441 default:
442 return (1);
443 }
444 }
445
446 /*
447 * TCP Kstats implementation
448 */
449 void *
450 tcp_kstat_init(netstackid_t stackid)
451 {
452 kstat_t *ksp;
453
454 tcp_named_kstat_t template = {
455 { "rtoAlgorithm", KSTAT_DATA_INT32, 0 },
456 { "rtoMin", KSTAT_DATA_INT32, 0 },
457 { "rtoMax", KSTAT_DATA_INT32, 0 },
458 { "maxConn", KSTAT_DATA_INT32, 0 },
459 { "activeOpens", KSTAT_DATA_UINT32, 0 },
460 { "passiveOpens", KSTAT_DATA_UINT32, 0 },
461 { "attemptFails", KSTAT_DATA_UINT32, 0 },
462 { "estabResets", KSTAT_DATA_UINT32, 0 },
463 { "currEstab", KSTAT_DATA_UINT32, 0 },
464 { "inSegs", KSTAT_DATA_UINT64, 0 },
465 { "outSegs", KSTAT_DATA_UINT64, 0 },
466 { "retransSegs", KSTAT_DATA_UINT32, 0 },
467 { "connTableSize", KSTAT_DATA_INT32, 0 },
468 { "outRsts", KSTAT_DATA_UINT32, 0 },
469 { "outDataSegs", KSTAT_DATA_UINT32, 0 },
470 { "outDataBytes", KSTAT_DATA_UINT32, 0 },
471 { "retransBytes", KSTAT_DATA_UINT32, 0 },
472 { "outAck", KSTAT_DATA_UINT32, 0 },
473 { "outAckDelayed", KSTAT_DATA_UINT32, 0 },
474 { "outUrg", KSTAT_DATA_UINT32, 0 },
475 { "outWinUpdate", KSTAT_DATA_UINT32, 0 },
476 { "outWinProbe", KSTAT_DATA_UINT32, 0 },
477 { "outControl", KSTAT_DATA_UINT32, 0 },
478 { "outFastRetrans", KSTAT_DATA_UINT32, 0 },
479 { "inAckSegs", KSTAT_DATA_UINT32, 0 },
480 { "inAckBytes", KSTAT_DATA_UINT32, 0 },
481 { "inDupAck", KSTAT_DATA_UINT32, 0 },
482 { "inAckUnsent", KSTAT_DATA_UINT32, 0 },
483 { "inDataInorderSegs", KSTAT_DATA_UINT32, 0 },
484 { "inDataInorderBytes", KSTAT_DATA_UINT32, 0 },
485 { "inDataUnorderSegs", KSTAT_DATA_UINT32, 0 },
486 { "inDataUnorderBytes", KSTAT_DATA_UINT32, 0 },
487 { "inDataDupSegs", KSTAT_DATA_UINT32, 0 },
488 { "inDataDupBytes", KSTAT_DATA_UINT32, 0 },
489 { "inDataPartDupSegs", KSTAT_DATA_UINT32, 0 },
490 { "inDataPartDupBytes", KSTAT_DATA_UINT32, 0 },
491 { "inDataPastWinSegs", KSTAT_DATA_UINT32, 0 },
492 { "inDataPastWinBytes", KSTAT_DATA_UINT32, 0 },
493 { "inWinProbe", KSTAT_DATA_UINT32, 0 },
494 { "inWinUpdate", KSTAT_DATA_UINT32, 0 },
495 { "inClosed", KSTAT_DATA_UINT32, 0 },
496 { "rttUpdate", KSTAT_DATA_UINT32, 0 },
497 { "rttNoUpdate", KSTAT_DATA_UINT32, 0 },
498 { "timRetrans", KSTAT_DATA_UINT32, 0 },
499 { "timRetransDrop", KSTAT_DATA_UINT32, 0 },
500 { "timKeepalive", KSTAT_DATA_UINT32, 0 },
501 { "timKeepaliveProbe", KSTAT_DATA_UINT32, 0 },
502 { "timKeepaliveDrop", KSTAT_DATA_UINT32, 0 },
503 { "listenDrop", KSTAT_DATA_UINT32, 0 },
504 { "listenDropQ0", KSTAT_DATA_UINT32, 0 },
505 { "halfOpenDrop", KSTAT_DATA_UINT32, 0 },
506 { "outSackRetransSegs", KSTAT_DATA_UINT32, 0 },
507 { "connTableSize6", KSTAT_DATA_INT32, 0 }
508 };
509
510 ksp = kstat_create_netstack(TCP_MOD_NAME, stackid, TCP_MOD_NAME, "mib2",
511 KSTAT_TYPE_NAMED, NUM_OF_FIELDS(tcp_named_kstat_t), 0, stackid);
512
513 if (ksp == NULL)
514 return (NULL);
515
516 template.rtoAlgorithm.value.ui32 = 4;
517 template.maxConn.value.i32 = -1;
518
519 bcopy(&template, ksp->ks_data, sizeof (template));
520 ksp->ks_update = tcp_kstat_update;
521 ksp->ks_private = (void *)(uintptr_t)stackid;
522
523 /*
524 * If this is an exclusive netstack for a local zone, the global zone
525 * should still be able to read the kstat.
526 */
527 if (stackid != GLOBAL_NETSTACKID)
674 ksp->ks_data = (void *)tcp_g_statp;
675
676 kstat_install(ksp);
677 return (ksp);
678 }
679
680 void
681 tcp_g_kstat_fini(kstat_t *ksp)
682 {
683 if (ksp != NULL) {
684 kstat_delete(ksp);
685 }
686 }
687
688 void *
689 tcp_kstat2_init(netstackid_t stackid)
690 {
691 kstat_t *ksp;
692
693 tcp_stat_t template = {
694 { "tcp_time_wait_syn_success", KSTAT_DATA_UINT64, 0 },
695 { "tcp_clean_death_nondetached", KSTAT_DATA_UINT64, 0 },
696 { "tcp_eager_blowoff_q", KSTAT_DATA_UINT64, 0 },
697 { "tcp_eager_blowoff_q0", KSTAT_DATA_UINT64, 0 },
698 { "tcp_no_listener", KSTAT_DATA_UINT64, 0 },
699 { "tcp_listendrop", KSTAT_DATA_UINT64, 0 },
700 { "tcp_listendropq0", KSTAT_DATA_UINT64, 0 },
701 { "tcp_wsrv_called", KSTAT_DATA_UINT64, 0 },
702 { "tcp_flwctl_on", KSTAT_DATA_UINT64, 0 },
703 { "tcp_timer_fire_early", KSTAT_DATA_UINT64, 0 },
704 { "tcp_timer_fire_miss", KSTAT_DATA_UINT64, 0 },
705 { "tcp_zcopy_on", KSTAT_DATA_UINT64, 0 },
706 { "tcp_zcopy_off", KSTAT_DATA_UINT64, 0 },
707 { "tcp_zcopy_backoff", KSTAT_DATA_UINT64, 0 },
708 { "tcp_fusion_flowctl", KSTAT_DATA_UINT64, 0 },
709 { "tcp_fusion_backenabled", KSTAT_DATA_UINT64, 0 },
710 { "tcp_fusion_urg", KSTAT_DATA_UINT64, 0 },
711 { "tcp_fusion_putnext", KSTAT_DATA_UINT64, 0 },
712 { "tcp_fusion_unfusable", KSTAT_DATA_UINT64, 0 },
713 { "tcp_fusion_aborted", KSTAT_DATA_UINT64, 0 },
714 { "tcp_fusion_unqualified", KSTAT_DATA_UINT64, 0 },
715 { "tcp_fusion_rrw_busy", KSTAT_DATA_UINT64, 0 },
716 { "tcp_fusion_rrw_msgcnt", KSTAT_DATA_UINT64, 0 },
717 { "tcp_fusion_rrw_plugged", KSTAT_DATA_UINT64, 0 },
718 { "tcp_in_ack_unsent_drop", KSTAT_DATA_UINT64, 0 },
719 { "tcp_sock_fallback", KSTAT_DATA_UINT64, 0 },
720 { "tcp_lso_enabled", KSTAT_DATA_UINT64, 0 },
721 { "tcp_lso_disabled", KSTAT_DATA_UINT64, 0 },
722 { "tcp_lso_times", KSTAT_DATA_UINT64, 0 },
723 { "tcp_lso_pkt_out", KSTAT_DATA_UINT64, 0 },
724 { "tcp_listen_cnt_drop", KSTAT_DATA_UINT64, 0 },
725 { "tcp_listen_mem_drop", KSTAT_DATA_UINT64, 0 },
726 { "tcp_zwin_mem_drop", KSTAT_DATA_UINT64, 0 },
727 { "tcp_zwin_ack_syn", KSTAT_DATA_UINT64, 0 },
728 { "tcp_rst_unsent", KSTAT_DATA_UINT64, 0 },
729 { "tcp_reclaim_cnt", KSTAT_DATA_UINT64, 0 },
730 { "tcp_reass_timeout", KSTAT_DATA_UINT64, 0 },
731 #ifdef TCP_DEBUG_COUNTER
732 { "tcp_time_wait", KSTAT_DATA_UINT64, 0 },
733 { "tcp_rput_time_wait", KSTAT_DATA_UINT64, 0 },
734 { "tcp_detach_time_wait", KSTAT_DATA_UINT64, 0 },
735 { "tcp_timeout_calls", KSTAT_DATA_UINT64, 0 },
736 { "tcp_timeout_cached_alloc", KSTAT_DATA_UINT64, 0 },
737 { "tcp_timeout_cancel_reqs", KSTAT_DATA_UINT64, 0 },
738 { "tcp_timeout_canceled", KSTAT_DATA_UINT64, 0 },
739 { "tcp_timermp_freed", KSTAT_DATA_UINT64, 0 },
740 { "tcp_push_timer_cnt", KSTAT_DATA_UINT64, 0 },
741 { "tcp_ack_timer_cnt", KSTAT_DATA_UINT64, 0 },
742 #endif
743 };
744
745 ksp = kstat_create_netstack(TCP_MOD_NAME, stackid, "tcpstat", "net",
746 KSTAT_TYPE_NAMED, sizeof (template) / sizeof (kstat_named_t), 0,
747 stackid);
748
749 if (ksp == NULL)
750 return (NULL);
751
752 bcopy(&template, ksp->ks_data, sizeof (template));
753 ksp->ks_private = (void *)(uintptr_t)stackid;
754 ksp->ks_update = tcp_kstat2_update;
755
756 /*
757 * If this is an exclusive netstack for a local zone, the global zone
758 * should still be able to read the kstat.
759 */
760 if (stackid != GLOBAL_NETSTACKID)
761 kstat_zone_add(ksp, GLOBAL_ZONEID);
|
435 return (0);
436 /* TODO: delete entry defined by tce */
437 return (1);
438 default:
439 return (0);
440 }
441 default:
442 return (1);
443 }
444 }
445
446 /*
447 * TCP Kstats implementation
448 */
449 void *
450 tcp_kstat_init(netstackid_t stackid)
451 {
452 kstat_t *ksp;
453
454 tcp_named_kstat_t template = {
455 { "rtoAlgorithm", KSTAT_DATA_INT32, {{0}} },
456 { "rtoMin", KSTAT_DATA_INT32, {{0}} },
457 { "rtoMax", KSTAT_DATA_INT32, {{0}} },
458 { "maxConn", KSTAT_DATA_INT32, {{0}} },
459 { "activeOpens", KSTAT_DATA_UINT32, {{0}} },
460 { "passiveOpens", KSTAT_DATA_UINT32, {{0}} },
461 { "attemptFails", KSTAT_DATA_UINT32, {{0}} },
462 { "estabResets", KSTAT_DATA_UINT32, {{0}} },
463 { "currEstab", KSTAT_DATA_UINT32, {{0}} },
464 { "inSegs", KSTAT_DATA_UINT64, {{0}} },
465 { "outSegs", KSTAT_DATA_UINT64, {{0}} },
466 { "retransSegs", KSTAT_DATA_UINT32, {{0}} },
467 { "connTableSize", KSTAT_DATA_INT32, {{0}} },
468 { "outRsts", KSTAT_DATA_UINT32, {{0}} },
469 { "outDataSegs", KSTAT_DATA_UINT32, {{0}} },
470 { "outDataBytes", KSTAT_DATA_UINT32, {{0}} },
471 { "retransBytes", KSTAT_DATA_UINT32, {{0}} },
472 { "outAck", KSTAT_DATA_UINT32, {{0}} },
473 { "outAckDelayed", KSTAT_DATA_UINT32, {{0}} },
474 { "outUrg", KSTAT_DATA_UINT32, {{0}} },
475 { "outWinUpdate", KSTAT_DATA_UINT32, {{0}} },
476 { "outWinProbe", KSTAT_DATA_UINT32, {{0}} },
477 { "outControl", KSTAT_DATA_UINT32, {{0}} },
478 { "outFastRetrans", KSTAT_DATA_UINT32, {{0}} },
479 { "inAckSegs", KSTAT_DATA_UINT32, {{0}} },
480 { "inAckBytes", KSTAT_DATA_UINT32, {{0}} },
481 { "inDupAck", KSTAT_DATA_UINT32, {{0}} },
482 { "inAckUnsent", KSTAT_DATA_UINT32, {{0}} },
483 { "inDataInorderSegs", KSTAT_DATA_UINT32, {{0}} },
484 { "inDataInorderBytes", KSTAT_DATA_UINT32, {{0}} },
485 { "inDataUnorderSegs", KSTAT_DATA_UINT32, {{0}} },
486 { "inDataUnorderBytes", KSTAT_DATA_UINT32, {{0}} },
487 { "inDataDupSegs", KSTAT_DATA_UINT32, {{0}} },
488 { "inDataDupBytes", KSTAT_DATA_UINT32, {{0}} },
489 { "inDataPartDupSegs", KSTAT_DATA_UINT32, {{0}} },
490 { "inDataPartDupBytes", KSTAT_DATA_UINT32, {{0}} },
491 { "inDataPastWinSegs", KSTAT_DATA_UINT32, {{0}} },
492 { "inDataPastWinBytes", KSTAT_DATA_UINT32, {{0}} },
493 { "inWinProbe", KSTAT_DATA_UINT32, {{0}} },
494 { "inWinUpdate", KSTAT_DATA_UINT32, {{0}} },
495 { "inClosed", KSTAT_DATA_UINT32, {{0}} },
496 { "rttUpdate", KSTAT_DATA_UINT32, {{0}} },
497 { "rttNoUpdate", KSTAT_DATA_UINT32, {{0}} },
498 { "timRetrans", KSTAT_DATA_UINT32, {{0}} },
499 { "timRetransDrop", KSTAT_DATA_UINT32, {{0}} },
500 { "timKeepalive", KSTAT_DATA_UINT32, {{0}} },
501 { "timKeepaliveProbe", KSTAT_DATA_UINT32, {{0}} },
502 { "timKeepaliveDrop", KSTAT_DATA_UINT32, {{0}} },
503 { "listenDrop", KSTAT_DATA_UINT32, {{0}} },
504 { "listenDropQ0", KSTAT_DATA_UINT32, {{0}} },
505 { "halfOpenDrop", KSTAT_DATA_UINT32, {{0}} },
506 { "outSackRetransSegs", KSTAT_DATA_UINT32, {{0}} },
507 { "connTableSize6", KSTAT_DATA_INT32, {{0}} }
508 };
509
510 ksp = kstat_create_netstack(TCP_MOD_NAME, stackid, TCP_MOD_NAME, "mib2",
511 KSTAT_TYPE_NAMED, NUM_OF_FIELDS(tcp_named_kstat_t), 0, stackid);
512
513 if (ksp == NULL)
514 return (NULL);
515
516 template.rtoAlgorithm.value.ui32 = 4;
517 template.maxConn.value.i32 = -1;
518
519 bcopy(&template, ksp->ks_data, sizeof (template));
520 ksp->ks_update = tcp_kstat_update;
521 ksp->ks_private = (void *)(uintptr_t)stackid;
522
523 /*
524 * If this is an exclusive netstack for a local zone, the global zone
525 * should still be able to read the kstat.
526 */
527 if (stackid != GLOBAL_NETSTACKID)
674 ksp->ks_data = (void *)tcp_g_statp;
675
676 kstat_install(ksp);
677 return (ksp);
678 }
679
680 void
681 tcp_g_kstat_fini(kstat_t *ksp)
682 {
683 if (ksp != NULL) {
684 kstat_delete(ksp);
685 }
686 }
687
688 void *
689 tcp_kstat2_init(netstackid_t stackid)
690 {
691 kstat_t *ksp;
692
693 tcp_stat_t template = {
694 { "tcp_time_wait_syn_success", KSTAT_DATA_UINT64, {{0}} },
695 { "tcp_clean_death_nondetached", KSTAT_DATA_UINT64, {{0}} },
696 { "tcp_eager_blowoff_q", KSTAT_DATA_UINT64, {{0}} },
697 { "tcp_eager_blowoff_q0", KSTAT_DATA_UINT64, {{0}} },
698 { "tcp_no_listener", KSTAT_DATA_UINT64, {{0}} },
699 { "tcp_listendrop", KSTAT_DATA_UINT64, {{0}} },
700 { "tcp_listendropq0", KSTAT_DATA_UINT64, {{0}} },
701 { "tcp_wsrv_called", KSTAT_DATA_UINT64, {{0}} },
702 { "tcp_flwctl_on", KSTAT_DATA_UINT64, {{0}} },
703 { "tcp_timer_fire_early", KSTAT_DATA_UINT64, {{0}} },
704 { "tcp_timer_fire_miss", KSTAT_DATA_UINT64, {{0}} },
705 { "tcp_zcopy_on", KSTAT_DATA_UINT64, {{0}} },
706 { "tcp_zcopy_off", KSTAT_DATA_UINT64, {{0}} },
707 { "tcp_zcopy_backoff", KSTAT_DATA_UINT64, {{0}} },
708 { "tcp_fusion_flowctl", KSTAT_DATA_UINT64, {{0}} },
709 { "tcp_fusion_backenabled", KSTAT_DATA_UINT64, {{0}} },
710 { "tcp_fusion_urg", KSTAT_DATA_UINT64, {{0}} },
711 { "tcp_fusion_putnext", KSTAT_DATA_UINT64, {{0}} },
712 { "tcp_fusion_unfusable", KSTAT_DATA_UINT64, {{0}} },
713 { "tcp_fusion_aborted", KSTAT_DATA_UINT64, {{0}} },
714 { "tcp_fusion_unqualified", KSTAT_DATA_UINT64, {{0}} },
715 { "tcp_fusion_rrw_busy", KSTAT_DATA_UINT64, {{0}} },
716 { "tcp_fusion_rrw_msgcnt", KSTAT_DATA_UINT64, {{0}} },
717 { "tcp_fusion_rrw_plugged", KSTAT_DATA_UINT64, {{0}} },
718 { "tcp_in_ack_unsent_drop", KSTAT_DATA_UINT64, {{0}} },
719 { "tcp_sock_fallback", KSTAT_DATA_UINT64, {{0}} },
720 { "tcp_lso_enabled", KSTAT_DATA_UINT64, {{0}} },
721 { "tcp_lso_disabled", KSTAT_DATA_UINT64, {{0}} },
722 { "tcp_lso_times", KSTAT_DATA_UINT64, {{0}} },
723 { "tcp_lso_pkt_out", KSTAT_DATA_UINT64, {{0}} },
724 { "tcp_listen_cnt_drop", KSTAT_DATA_UINT64, {{0}} },
725 { "tcp_listen_mem_drop", KSTAT_DATA_UINT64, {{0}} },
726 { "tcp_zwin_mem_drop", KSTAT_DATA_UINT64, {{0}} },
727 { "tcp_zwin_ack_syn", KSTAT_DATA_UINT64, {{0}} },
728 { "tcp_rst_unsent", KSTAT_DATA_UINT64, {{0}} },
729 { "tcp_reclaim_cnt", KSTAT_DATA_UINT64, {{0}} },
730 { "tcp_reass_timeout", KSTAT_DATA_UINT64, {{0}} },
731 #ifdef TCP_DEBUG_COUNTER
732 { "tcp_time_wait", KSTAT_DATA_UINT64, {{0}} },
733 { "tcp_rput_time_wait", KSTAT_DATA_UINT64, {{0}} },
734 { "tcp_detach_time_wait", KSTAT_DATA_UINT64, {{0}} },
735 { "tcp_timeout_calls", KSTAT_DATA_UINT64, {{0}} },
736 { "tcp_timeout_cached_alloc", KSTAT_DATA_UINT64, {{0}} },
737 { "tcp_timeout_cancel_reqs", KSTAT_DATA_UINT64, {{0}} },
738 { "tcp_timeout_canceled", KSTAT_DATA_UINT64, {{0}} },
739 { "tcp_timermp_freed", KSTAT_DATA_UINT64, {{0}} },
740 { "tcp_push_timer_cnt", KSTAT_DATA_UINT64, {{0}} },
741 { "tcp_ack_timer_cnt", KSTAT_DATA_UINT64, {{0}} },
742 #endif
743 };
744
745 ksp = kstat_create_netstack(TCP_MOD_NAME, stackid, "tcpstat", "net",
746 KSTAT_TYPE_NAMED, sizeof (template) / sizeof (kstat_named_t), 0,
747 stackid);
748
749 if (ksp == NULL)
750 return (NULL);
751
752 bcopy(&template, ksp->ks_data, sizeof (template));
753 ksp->ks_private = (void *)(uintptr_t)stackid;
754 ksp->ks_update = tcp_kstat2_update;
755
756 /*
757 * If this is an exclusive netstack for a local zone, the global zone
758 * should still be able to read the kstat.
759 */
760 if (stackid != GLOBAL_NETSTACKID)
761 kstat_zone_add(ksp, GLOBAL_ZONEID);
|