From 4c1508455ce3d212933f2e511814cdfe1a24d7d5 Mon Sep 17 00:00:00 2001 From: sleybo Date: Mon, 5 Mar 2007 07:33:00 +0000 Subject: [PATCH] [TOOLS] add link speed and width to vstat git-svn-id: svn://openib.tc.cornell.edu/gen1@604 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/tools/vstat/user/vstat_main.c | 85 +++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 6 deletions(-) diff --git a/trunk/tools/vstat/user/vstat_main.c b/trunk/tools/vstat/user/vstat_main.c index 9e219b53..2a8579c0 100644 --- a/trunk/tools/vstat/user/vstat_main.c +++ b/trunk/tools/vstat/user/vstat_main.c @@ -119,6 +119,40 @@ void printPortLinkState(int portState){ //TODO: check that these are all the opt } } +void printPortRate(int speed, int width){ + switch(speed){ + case 1: + printf("\t\tlink_speed=2.5Gbps (%d)\n",speed); + break; + case 2: + printf("\t\tlink_speed=5Gbps (%d)\n",speed); + break; + case 4: + printf("\t\tlink_speed=10Gbps (%d)\n",speed); + break; + default: + printf("\t\tlink_speed=UNKNOWN (%d)\n",speed); + } + + switch (width){ + case 1: + printf("\t\tlink_width=1x (%d) \n\t\trate=%d\n",width,1*speed); + break; + case 2: + printf("\t\tlink_width=4x (%d) \n\t\trate=%d\n",width,10*speed); + break; + case 4: + printf("\t\tlink_width=8x (%d) \n\t\trate=%d\n",width,20*speed); + break; + case 8: + printf("\t\tlink_width=12x (%d) \n\t\trate=%d\n",width,30*speed); + break; + default: + printf("\t\tlink_width=UNKNOWN (%d)\n",width); + } + + +} void printPortMTU(int mtu){ //TODO: check that these are all the options and that they are correct @@ -170,9 +204,10 @@ void printPortCaps(ib_port_cap_t *ibal_port_cap_p) PRINT_CAP(pkey_nvram, PKEY_NVRAM); printf("\n"); } -void printPortInfo(ib_port_attr_t* portPtr, BOOLEAN fullPrint){ +void printPortInfo(ib_port_attr_t* portPtr, ib_port_info_t portInfo, BOOLEAN fullPrint){ printf("\t\tport=%d\n", portPtr->port_num); printPortLinkState(portPtr->link_state); + printPortRate(portInfo.link_speed>>4,portInfo.link_width_active); printf("\t\tsm_lid=0x%04x\n", cl_ntoh16(portPtr->sm_lid)); printf("\t\tport_lid=0x%04x\n", cl_ntoh16(portPtr->lid)); printf("\t\tport_lmc=0x%x\n", portPtr->lmc); @@ -233,7 +268,7 @@ void print_uplink_info(ib_ca_attr_t* ca_attr) } } -void vstat_print_ca_attr(int idx, ib_ca_attr_t* ca_attr, BOOLEAN fullPrint){ +void vstat_print_ca_attr(int idx, ib_ca_attr_t* ca_attr, ib_port_info_t* vstat_port_info, BOOLEAN fullPrint){ int i; printf("\n\thca_idx=%d\n", idx); @@ -294,7 +329,7 @@ void vstat_print_ca_attr(int idx, ib_ca_attr_t* ca_attr, BOOLEAN fullPrint){ printf("\tnum_phys_ports=%d\n", ca_attr->num_ports); } for (i = 0; inum_ports; i++){ - printPortInfo(ca_attr->p_port_attr+i, fullPrint); + printPortInfo(ca_attr->p_port_attr+i, vstat_port_info[i], fullPrint); } } /* Internal Functions */ @@ -351,6 +386,42 @@ void vstat_get_counters(ib_ca_handle_t h_ca,uint8_t port_num) } + +void vstat_get_port_info(ib_ca_handle_t h_ca,uint8_t port_num, ib_port_info_t* vstat_port_info) +{ + ib_mad_t *mad_in = NULL; + ib_mad_t *mad_out = NULL; + ib_api_status_t ib_status = IB_SUCCESS; + int i; + + mad_out = (ib_mad_t*)cl_zalloc(256); + CL_ASSERT(mad_out); + + mad_in = (ib_mad_t*)cl_zalloc(256); + CL_ASSERT(mad_in); + + + mad_in->attr_id = IB_MAD_ATTR_PORT_INFO; + mad_in->method = IB_MAD_METHOD_GET; + mad_in->base_ver = 1; + mad_in->class_ver =1; + mad_in->mgmt_class = IB_MCLASS_SUBN_LID; + + + + ib_status = ib_local_mad(h_ca ,port_num ,mad_in ,mad_out); + if(ib_status != IB_SUCCESS && 0 != mad_in->status ) + { + printf("ib_local_mad failed with status = %d mad status = %d\n", ib_status,mad_in->status); + return; + } + + cl_memcpy(vstat_port_info,(ib_port_info_t*)(((ib_smp_t*)mad_out)->data),sizeof(ib_port_info_t)); + + +} + + ib_api_status_t vstat_ca_attr( boolean_t modify_attr, @@ -364,6 +435,7 @@ vstat_ca_attr( size_t guid_count; ib_net64_t *ca_guid_array; ib_ca_attr_t *vstat_ca_attr; + ib_port_info_t vstat_port_info[2]; size_t i; ib_ca_handle_t h_ca = NULL; uint32_t bsize; @@ -473,10 +545,11 @@ vstat_ca_attr( goto Cleanup2; } + for(port_idx =0; port_idx< vstat_ca_attr->num_ports;port_idx++){ + vstat_get_port_info(h_ca ,port_idx+1,&vstat_port_info[port_idx]); + } - - - vstat_print_ca_attr((int)i, vstat_ca_attr, fullPrint); + vstat_print_ca_attr((int)i, vstat_ca_attr, vstat_port_info, fullPrint); if(getCounters) { for(port_idx =0; port_idx< vstat_ca_attr->num_ports;port_idx++){ -- 2.41.0