diff mbox series

[v7] libibverbs: display gid type in ibv_devinfo

Message ID 1580967842-11220-1-git-send-email-devesh.sharma@broadcom.com (mailing list archive)
State Superseded
Headers show
Series [v7] libibverbs: display gid type in ibv_devinfo | expand

Commit Message

Devesh Sharma Feb. 6, 2020, 5:44 a.m. UTC
It becomes difficult to make out from the output of ibv_devinfo
if a particular gid index is RoCE v2 or not.

Adding a string to the output of ibv_devinfo -v to display the
gid type at the end of gid.

The output would look something like below:
$ ibv_devinfo -v -d bnxt_re2
hca_id: bnxt_re2
 transport:             InfiniBand (0)
 fw_ver:                216.0.220.0
 node_guid:             b226:28ff:fed3:b0f0
 sys_image_guid:        b226:28ff:fed3:b0f0
  .
  .
  .
  .
	phys_state:     LINK_UP (5)
	GID[  0]:       fe80:0000:0000:0000:b226:28ff:fed3:b0f0, IB/RoCE v1
	GID[  1]:       fe80::b226:28ff:fed3:b0f0, RoCE v2
	GID[  2]:       0000:0000:0000:0000:0000:ffff:c0aa:0165, IB/RoCE v1
	GID[  3]:       ::ffff:192.170.1.101, RoCE v2
$
$
$

Reviewed-by: Jason Gunthrope <jgg@ziepe.ca>
Reviewed-by: Leon Romanovsky <leon@kernel.org>
Reviewed-by: Gal Pressman <galpress@amazon.com>
Reviewed-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
---
 libibverbs/examples/devinfo.c | 61 ++++++++++++++++++++++++++++++++++---------
 1 file changed, 49 insertions(+), 12 deletions(-)

Comments

Mark Bloch Feb. 6, 2020, 6:08 a.m. UTC | #1
On 2/5/2020 21:44, Devesh Sharma wrote:
> It becomes difficult to make out from the output of ibv_devinfo
> if a particular gid index is RoCE v2 or not.
> 
> Adding a string to the output of ibv_devinfo -v to display the
> gid type at the end of gid.
> 
> The output would look something like below:
> $ ibv_devinfo -v -d bnxt_re2
> hca_id: bnxt_re2
>  transport:             InfiniBand (0)
>  fw_ver:                216.0.220.0
>  node_guid:             b226:28ff:fed3:b0f0
>  sys_image_guid:        b226:28ff:fed3:b0f0
>   .
>   .
>   .
>   .
> 	phys_state:     LINK_UP (5)
> 	GID[  0]:       fe80:0000:0000:0000:b226:28ff:fed3:b0f0, IB/RoCE v1
> 	GID[  1]:       fe80::b226:28ff:fed3:b0f0, RoCE v2
> 	GID[  2]:       0000:0000:0000:0000:0000:ffff:c0aa:0165, IB/RoCE v1
> 	GID[  3]:       ::ffff:192.170.1.101, RoCE v2
> $
> $
> $
> 
> Reviewed-by: Jason Gunthrope <jgg@ziepe.ca>
> Reviewed-by: Leon Romanovsky <leon@kernel.org>
> Reviewed-by: Gal Pressman <galpress@amazon.com>
> Reviewed-by: Parav Pandit <parav@mellanox.com>
> Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
> ---
>  libibverbs/examples/devinfo.c | 61 ++++++++++++++++++++++++++++++++++---------
>  1 file changed, 49 insertions(+), 12 deletions(-)
> 
> diff --git a/libibverbs/examples/devinfo.c b/libibverbs/examples/devinfo.c
> index bf53eac..7e2015b 100644
> --- a/libibverbs/examples/devinfo.c
> +++ b/libibverbs/examples/devinfo.c
> @@ -40,6 +40,7 @@
>  #include <getopt.h>
>  #include <endian.h>
>  #include <inttypes.h>
> +#include <arpa/inet.h>
>  
>  #include <infiniband/verbs.h>
>  #include <infiniband/driver.h>
> @@ -162,12 +163,50 @@ static const char *vl_str(uint8_t vl_num)
>  	}
>  }
>  
> -static int print_all_port_gids(struct ibv_context *ctx, uint8_t port_num, int tbl_len)
> +#define DEVINFO_INVALID_GID_TYPE	2
> +static const char *gid_type_str(enum ibv_gid_type type)
>  {
> +	switch (type) {
> +	case IBV_GID_TYPE_IB_ROCE_V1: return "IB/RoCE v1";

You call this function only if link layer is ethernet, why do you need the "IB/" part?



> +	case IBV_GID_TYPE_ROCE_V2: return "RoCE v2";
> +	default: return "Invalid gid type";
> +	}
> +}
> +
> +static void print_formated_gid(union ibv_gid *gid, int i,
> +			       enum ibv_gid_type type, int ll)
> +{
> +	char gid_str[INET6_ADDRSTRLEN] = {};
> +	char str[20] = {};
> +
> +	if (ll == IBV_LINK_LAYER_ETHERNET)
> +		sprintf(str, ", %s", gid_type_str(type));
> +
> +	if (type == IBV_GID_TYPE_IB_ROCE_V1)
> +		printf("\t\t\tGID[%3d]:\t\t%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x%s\n",
> +		       i, gid->raw[0], gid->raw[1], gid->raw[2],
> +		       gid->raw[3], gid->raw[4], gid->raw[5], gid->raw[6],
> +		       gid->raw[7], gid->raw[8], gid->raw[9], gid->raw[10],
> +		       gid->raw[11], gid->raw[12], gid->raw[13], gid->raw[14],
> +		       gid->raw[15], str);
> +
> +	if (type == IBV_GID_TYPE_ROCE_V2) {
> +		inet_ntop(AF_INET6, gid->raw, gid_str, sizeof(gid_str));
> +		printf("\t\t\tGID[%3d]:\t\t%s%s\n", i, gid_str, str);
> +	}
> +}
> +
> +static int print_all_port_gids(struct ibv_context *ctx,
> +			       struct ibv_port_attr *port_attr,
> +			       uint8_t port_num)
> +{
> +	enum ibv_gid_type type;
>  	union ibv_gid gid;
> +	int tbl_len;
>  	int rc = 0;
>  	int i;
>  
> +	tbl_len = port_attr->gid_tbl_len;
>  	for (i = 0; i < tbl_len; i++) {
>  		rc = ibv_query_gid(ctx, port_num, i, &gid);
>  		if (rc) {
> @@ -175,17 +214,15 @@ static int print_all_port_gids(struct ibv_context *ctx, uint8_t port_num, int tb
>  			       port_num, i);
>  			return rc;
>  		}
> +
> +		rc = ibv_query_gid_type(ctx, port_num, i, &type);

I really dislike this, what if in the future a new gid type will be added (I know, I know, what are
the chances :) )

old rdma-core won't display anything in that index (while today it displays anything as long
as the gid isn't a null gid).

Mark

> +		if (rc) {
> +			rc = 0;
> +			type = DEVINFO_INVALID_GID_TYPE;
> +		}
>  		if (!null_gid(&gid))
> -			printf("\t\t\tGID[%3d]:\t\t%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",
> -			       i,
> -			       gid.raw[ 0], gid.raw[ 1],
> -			       gid.raw[ 2], gid.raw[ 3],
> -			       gid.raw[ 4], gid.raw[ 5],
> -			       gid.raw[ 6], gid.raw[ 7],
> -			       gid.raw[ 8], gid.raw[ 9],
> -			       gid.raw[10], gid.raw[11],
> -			       gid.raw[12], gid.raw[13],
> -			       gid.raw[14], gid.raw[15]);
> +			print_formated_gid(&gid, i, type,
> +					   port_attr->link_layer);
>  	}
>  	return rc;
>  }
> @@ -614,7 +651,7 @@ static int print_hca_cap(struct ibv_device *ib_dev, uint8_t ib_port)
>  				printf("\t\t\tphys_state:\t\t%s (%d)\n",
>  				       port_phy_state_str(port_attr.phys_state), port_attr.phys_state);
>  
> -			if (print_all_port_gids(ctx, port, port_attr.gid_tbl_len))
> +			if (print_all_port_gids(ctx, &port_attr, port))
>  				goto cleanup;
>  		}
>  		printf("\n");
>
Leon Romanovsky Feb. 6, 2020, 8:38 a.m. UTC | #2
On Thu, Feb 06, 2020 at 12:44:02AM -0500, Devesh Sharma wrote:
> It becomes difficult to make out from the output of ibv_devinfo
> if a particular gid index is RoCE v2 or not.
>
> Adding a string to the output of ibv_devinfo -v to display the
> gid type at the end of gid.
>
> The output would look something like below:
> $ ibv_devinfo -v -d bnxt_re2
> hca_id: bnxt_re2
>  transport:             InfiniBand (0)
>  fw_ver:                216.0.220.0
>  node_guid:             b226:28ff:fed3:b0f0
>  sys_image_guid:        b226:28ff:fed3:b0f0
>   .
>   .
>   .
>   .
> 	phys_state:     LINK_UP (5)
> 	GID[  0]:       fe80:0000:0000:0000:b226:28ff:fed3:b0f0, IB/RoCE v1
> 	GID[  1]:       fe80::b226:28ff:fed3:b0f0, RoCE v2
> 	GID[  2]:       0000:0000:0000:0000:0000:ffff:c0aa:0165, IB/RoCE v1
> 	GID[  3]:       ::ffff:192.170.1.101, RoCE v2
> $
> $
> $
>
> Reviewed-by: Jason Gunthrope <jgg@ziepe.ca>
> Reviewed-by: Leon Romanovsky <leon@kernel.org>

Please don't add my Reviewed-by, before I explicitly wrote it.

Thanks
Devesh Sharma Feb. 6, 2020, 9:10 a.m. UTC | #3
On Thu, Feb 6, 2020 at 2:08 PM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Thu, Feb 06, 2020 at 12:44:02AM -0500, Devesh Sharma wrote:
> > It becomes difficult to make out from the output of ibv_devinfo
> > if a particular gid index is RoCE v2 or not.
> >
> > Adding a string to the output of ibv_devinfo -v to display the
> > gid type at the end of gid.
> >
> > The output would look something like below:
> > $ ibv_devinfo -v -d bnxt_re2
> > hca_id: bnxt_re2
> >  transport:             InfiniBand (0)
> >  fw_ver:                216.0.220.0
> >  node_guid:             b226:28ff:fed3:b0f0
> >  sys_image_guid:        b226:28ff:fed3:b0f0
> >   .
> >   .
> >   .
> >   .
> >       phys_state:     LINK_UP (5)
> >       GID[  0]:       fe80:0000:0000:0000:b226:28ff:fed3:b0f0, IB/RoCE v1
> >       GID[  1]:       fe80::b226:28ff:fed3:b0f0, RoCE v2
> >       GID[  2]:       0000:0000:0000:0000:0000:ffff:c0aa:0165, IB/RoCE v1
> >       GID[  3]:       ::ffff:192.170.1.101, RoCE v2
> > $
> > $
> > $
> >
> > Reviewed-by: Jason Gunthrope <jgg@ziepe.ca>
> > Reviewed-by: Leon Romanovsky <leon@kernel.org>
>
> Please don't add my Reviewed-by, before I explicitly wrote it.
>
Noted!
>
> Thanks
Devesh Sharma Feb. 7, 2020, 12:37 p.m. UTC | #4
On Thu, Feb 6, 2020 at 11:38 AM Mark Bloch <markb@mellanox.com> wrote:
>
>
>
> On 2/5/2020 21:44, Devesh Sharma wrote:
> > It becomes difficult to make out from the output of ibv_devinfo
> > if a particular gid index is RoCE v2 or not.
> >
> > Adding a string to the output of ibv_devinfo -v to display the
> > gid type at the end of gid.
> >
> > The output would look something like below:
> > $ ibv_devinfo -v -d bnxt_re2
> > hca_id: bnxt_re2
> >  transport:             InfiniBand (0)
> >  fw_ver:                216.0.220.0
> >  node_guid:             b226:28ff:fed3:b0f0
> >  sys_image_guid:        b226:28ff:fed3:b0f0
> >   .
> >   .
> >   .
> >   .
> >       phys_state:     LINK_UP (5)
> >       GID[  0]:       fe80:0000:0000:0000:b226:28ff:fed3:b0f0, IB/RoCE v1
> >       GID[  1]:       fe80::b226:28ff:fed3:b0f0, RoCE v2
> >       GID[  2]:       0000:0000:0000:0000:0000:ffff:c0aa:0165, IB/RoCE v1
> >       GID[  3]:       ::ffff:192.170.1.101, RoCE v2
> > $
> > $
> > $
> >
> > Reviewed-by: Jason Gunthrope <jgg@ziepe.ca>
> > Reviewed-by: Leon Romanovsky <leon@kernel.org>
> > Reviewed-by: Gal Pressman <galpress@amazon.com>
> > Reviewed-by: Parav Pandit <parav@mellanox.com>
> > Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
> > ---
> >  libibverbs/examples/devinfo.c | 61 ++++++++++++++++++++++++++++++++++---------
> >  1 file changed, 49 insertions(+), 12 deletions(-)
> >
> > diff --git a/libibverbs/examples/devinfo.c b/libibverbs/examples/devinfo.c
> > index bf53eac..7e2015b 100644
> > --- a/libibverbs/examples/devinfo.c
> > +++ b/libibverbs/examples/devinfo.c
> > @@ -40,6 +40,7 @@
> >  #include <getopt.h>
> >  #include <endian.h>
> >  #include <inttypes.h>
> > +#include <arpa/inet.h>
> >
> >  #include <infiniband/verbs.h>
> >  #include <infiniband/driver.h>
> > @@ -162,12 +163,50 @@ static const char *vl_str(uint8_t vl_num)
> >       }
> >  }
> >
> > -static int print_all_port_gids(struct ibv_context *ctx, uint8_t port_num, int tbl_len)
> > +#define DEVINFO_INVALID_GID_TYPE     2
> > +static const char *gid_type_str(enum ibv_gid_type type)
> >  {
> > +     switch (type) {
> > +     case IBV_GID_TYPE_IB_ROCE_V1: return "IB/RoCE v1";
>
> You call this function only if link layer is ethernet, why do you need the "IB/" part?
Jason do you have any suggestion here, "IB/ROCE v1" is the standard
string rdma-cm and
/sys/class/infiniband/bnxt_re0/ports/1/gid_attrs/types/* use to
distinguish v2 gid from v1/IB gids.
>
>
> > +     case IBV_GID_TYPE_ROCE_V2: return "RoCE v2";
> > +     default: return "Invalid gid type";
> > +     }
> > +}
> > +
> > +static void print_formated_gid(union ibv_gid *gid, int i,
> > +                            enum ibv_gid_type type, int ll)
> > +{
> > +     char gid_str[INET6_ADDRSTRLEN] = {};
> > +     char str[20] = {};
> > +
> > +     if (ll == IBV_LINK_LAYER_ETHERNET)
> > +             sprintf(str, ", %s", gid_type_str(type));
> > +
> > +     if (type == IBV_GID_TYPE_IB_ROCE_V1)
> > +             printf("\t\t\tGID[%3d]:\t\t%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x%s\n",
> > +                    i, gid->raw[0], gid->raw[1], gid->raw[2],
> > +                    gid->raw[3], gid->raw[4], gid->raw[5], gid->raw[6],
> > +                    gid->raw[7], gid->raw[8], gid->raw[9], gid->raw[10],
> > +                    gid->raw[11], gid->raw[12], gid->raw[13], gid->raw[14],
> > +                    gid->raw[15], str);
> > +
> > +     if (type == IBV_GID_TYPE_ROCE_V2) {
> > +             inet_ntop(AF_INET6, gid->raw, gid_str, sizeof(gid_str));
> > +             printf("\t\t\tGID[%3d]:\t\t%s%s\n", i, gid_str, str);
> > +     }
> > +}
> > +
> > +static int print_all_port_gids(struct ibv_context *ctx,
> > +                            struct ibv_port_attr *port_attr,
> > +                            uint8_t port_num)
> > +{
> > +     enum ibv_gid_type type;
> >       union ibv_gid gid;
> > +     int tbl_len;
> >       int rc = 0;
> >       int i;
> >
> > +     tbl_len = port_attr->gid_tbl_len;
> >       for (i = 0; i < tbl_len; i++) {
> >               rc = ibv_query_gid(ctx, port_num, i, &gid);
> >               if (rc) {
> > @@ -175,17 +214,15 @@ static int print_all_port_gids(struct ibv_context *ctx, uint8_t port_num, int tb
> >                              port_num, i);
> >                       return rc;
> >               }
> > +
> > +             rc = ibv_query_gid_type(ctx, port_num, i, &type);
>
> I really dislike this, what if in the future a new gid type will be added (I know, I know, what are
> the chances :) )
>
> old rdma-core won't display anything in that index (while today it displays anything as long
> as the gid isn't a null gid).
Parav, do you have any suggestions here?
>
> Mark
>
> > +             if (rc) {
> > +                     rc = 0;
> > +                     type = DEVINFO_INVALID_GID_TYPE;
> > +             }
> >               if (!null_gid(&gid))
> > -                     printf("\t\t\tGID[%3d]:\t\t%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",
> > -                            i,
> > -                            gid.raw[ 0], gid.raw[ 1],
> > -                            gid.raw[ 2], gid.raw[ 3],
> > -                            gid.raw[ 4], gid.raw[ 5],
> > -                            gid.raw[ 6], gid.raw[ 7],
> > -                            gid.raw[ 8], gid.raw[ 9],
> > -                            gid.raw[10], gid.raw[11],
> > -                            gid.raw[12], gid.raw[13],
> > -                            gid.raw[14], gid.raw[15]);
> > +                     print_formated_gid(&gid, i, type,
> > +                                        port_attr->link_layer);
> >       }
> >       return rc;
> >  }
> > @@ -614,7 +651,7 @@ static int print_hca_cap(struct ibv_device *ib_dev, uint8_t ib_port)
> >                               printf("\t\t\tphys_state:\t\t%s (%d)\n",
> >                                      port_phy_state_str(port_attr.phys_state), port_attr.phys_state);
> >
> > -                     if (print_all_port_gids(ctx, port, port_attr.gid_tbl_len))
> > +                     if (print_all_port_gids(ctx, &port_attr, port))
> >                               goto cleanup;
> >               }
> >               printf("\n");
> >
Jason Gunthorpe Feb. 7, 2020, 2:13 p.m. UTC | #5
On Fri, Feb 07, 2020 at 06:07:34PM +0530, Devesh Sharma wrote:
> > > -static int print_all_port_gids(struct ibv_context *ctx, uint8_t port_num, int tbl_len)
> > > +#define DEVINFO_INVALID_GID_TYPE     2
> > > +static const char *gid_type_str(enum ibv_gid_type type)
> > >  {
> > > +     switch (type) {
> > > +     case IBV_GID_TYPE_IB_ROCE_V1: return "IB/RoCE v1";
> >
> > You call this function only if link layer is ethernet, why do you need the "IB/" part?
> Jason do you have any suggestion here, "IB/ROCE v1" is the standard
> string rdma-cm and
> /sys/class/infiniband/bnxt_re0/ports/1/gid_attrs/types/* use to
> distinguish v2 gid from v1/IB gids.

I would ignore the sysfs

If you know for sure it is RoCE v1 then say so

IB doesn't have types so it shouldn't show anything

Jason
Devesh Sharma Feb. 10, 2020, 5:20 p.m. UTC | #6
On Fri, Feb 7, 2020 at 7:43 PM Jason Gunthorpe <jgg@mellanox.com> wrote:
>
> On Fri, Feb 07, 2020 at 06:07:34PM +0530, Devesh Sharma wrote:
> > > > -static int print_all_port_gids(struct ibv_context *ctx, uint8_t port_num, int tbl_len)
> > > > +#define DEVINFO_INVALID_GID_TYPE     2
> > > > +static const char *gid_type_str(enum ibv_gid_type type)
> > > >  {
> > > > +     switch (type) {
> > > > +     case IBV_GID_TYPE_IB_ROCE_V1: return "IB/RoCE v1";
> > >
> > > You call this function only if link layer is ethernet, why do you need the "IB/" part?
> > Jason do you have any suggestion here, "IB/ROCE v1" is the standard
> > string rdma-cm and
> > /sys/class/infiniband/bnxt_re0/ports/1/gid_attrs/types/* use to
> > distinguish v2 gid from v1/IB gids.
>
> I would ignore the sysfs
>
> If you know for sure it is RoCE v1 then say so
>
> IB doesn't have types so it shouldn't show anything
Sent out a v8 for this change.
>
> Jason
diff mbox series

Patch

diff --git a/libibverbs/examples/devinfo.c b/libibverbs/examples/devinfo.c
index bf53eac..7e2015b 100644
--- a/libibverbs/examples/devinfo.c
+++ b/libibverbs/examples/devinfo.c
@@ -40,6 +40,7 @@ 
 #include <getopt.h>
 #include <endian.h>
 #include <inttypes.h>
+#include <arpa/inet.h>
 
 #include <infiniband/verbs.h>
 #include <infiniband/driver.h>
@@ -162,12 +163,50 @@  static const char *vl_str(uint8_t vl_num)
 	}
 }
 
-static int print_all_port_gids(struct ibv_context *ctx, uint8_t port_num, int tbl_len)
+#define DEVINFO_INVALID_GID_TYPE	2
+static const char *gid_type_str(enum ibv_gid_type type)
 {
+	switch (type) {
+	case IBV_GID_TYPE_IB_ROCE_V1: return "IB/RoCE v1";
+	case IBV_GID_TYPE_ROCE_V2: return "RoCE v2";
+	default: return "Invalid gid type";
+	}
+}
+
+static void print_formated_gid(union ibv_gid *gid, int i,
+			       enum ibv_gid_type type, int ll)
+{
+	char gid_str[INET6_ADDRSTRLEN] = {};
+	char str[20] = {};
+
+	if (ll == IBV_LINK_LAYER_ETHERNET)
+		sprintf(str, ", %s", gid_type_str(type));
+
+	if (type == IBV_GID_TYPE_IB_ROCE_V1)
+		printf("\t\t\tGID[%3d]:\t\t%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x%s\n",
+		       i, gid->raw[0], gid->raw[1], gid->raw[2],
+		       gid->raw[3], gid->raw[4], gid->raw[5], gid->raw[6],
+		       gid->raw[7], gid->raw[8], gid->raw[9], gid->raw[10],
+		       gid->raw[11], gid->raw[12], gid->raw[13], gid->raw[14],
+		       gid->raw[15], str);
+
+	if (type == IBV_GID_TYPE_ROCE_V2) {
+		inet_ntop(AF_INET6, gid->raw, gid_str, sizeof(gid_str));
+		printf("\t\t\tGID[%3d]:\t\t%s%s\n", i, gid_str, str);
+	}
+}
+
+static int print_all_port_gids(struct ibv_context *ctx,
+			       struct ibv_port_attr *port_attr,
+			       uint8_t port_num)
+{
+	enum ibv_gid_type type;
 	union ibv_gid gid;
+	int tbl_len;
 	int rc = 0;
 	int i;
 
+	tbl_len = port_attr->gid_tbl_len;
 	for (i = 0; i < tbl_len; i++) {
 		rc = ibv_query_gid(ctx, port_num, i, &gid);
 		if (rc) {
@@ -175,17 +214,15 @@  static int print_all_port_gids(struct ibv_context *ctx, uint8_t port_num, int tb
 			       port_num, i);
 			return rc;
 		}
+
+		rc = ibv_query_gid_type(ctx, port_num, i, &type);
+		if (rc) {
+			rc = 0;
+			type = DEVINFO_INVALID_GID_TYPE;
+		}
 		if (!null_gid(&gid))
-			printf("\t\t\tGID[%3d]:\t\t%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",
-			       i,
-			       gid.raw[ 0], gid.raw[ 1],
-			       gid.raw[ 2], gid.raw[ 3],
-			       gid.raw[ 4], gid.raw[ 5],
-			       gid.raw[ 6], gid.raw[ 7],
-			       gid.raw[ 8], gid.raw[ 9],
-			       gid.raw[10], gid.raw[11],
-			       gid.raw[12], gid.raw[13],
-			       gid.raw[14], gid.raw[15]);
+			print_formated_gid(&gid, i, type,
+					   port_attr->link_layer);
 	}
 	return rc;
 }
@@ -614,7 +651,7 @@  static int print_hca_cap(struct ibv_device *ib_dev, uint8_t ib_port)
 				printf("\t\t\tphys_state:\t\t%s (%d)\n",
 				       port_phy_state_str(port_attr.phys_state), port_attr.phys_state);
 
-			if (print_all_port_gids(ctx, port, port_attr.gid_tbl_len))
+			if (print_all_port_gids(ctx, &port_attr, port))
 				goto cleanup;
 		}
 		printf("\n");