Use tb[type] access to TLVs

(Logical change 1.129)
diff --git a/ip/ipxfrm.c b/ip/ipxfrm.c
index 5c31801..836e11a 100644
--- a/ip/ipxfrm.c
+++ b/ip/ipxfrm.c
@@ -565,61 +565,57 @@
 	}
 }
 
-void xfrm_xfrma_print(struct rtattr *tb[], int ntb, __u16 family,
+void xfrm_xfrma_print(struct rtattr *tb[], __u16 family,
 		      FILE *fp, const char *prefix)
 {
-	int i;
+	if (tb[XFRMA_ALG_AUTH]) {
+		struct rtattr *rta = tb[XFRMA_ALG_AUTH];
+		xfrm_algo_print((struct xfrm_algo *) RTA_DATA(rta),
+			XFRMA_ALG_AUTH, RTA_PAYLOAD(rta), fp, prefix);
+	}
 
-	for (i = 0; i < ntb; i++) {
-		__u16 type = tb[i]->rta_type;
-		int len = RTA_PAYLOAD(tb[i]);
-		void *data = RTA_DATA(tb[i]);
+	if (tb[XFRMA_ALG_CRYPT]) {
+		struct rtattr *rta = tb[XFRMA_ALG_CRYPT];
+		xfrm_algo_print((struct xfrm_algo *) RTA_DATA(rta),
+			XFRMA_ALG_CRYPT, RTA_PAYLOAD(rta), fp, prefix);
+	}
 
-		switch (type) {
-		case XFRMA_ALG_CRYPT:
-		case XFRMA_ALG_AUTH:
-		case XFRMA_ALG_COMP:
-			xfrm_algo_print((struct xfrm_algo *)data, type, len,
-					fp, prefix);
-			break;
-		case XFRMA_ENCAP:
-		{
-			struct xfrm_encap_tmpl *e;
-			char abuf[256];
+	if (tb[XFRMA_ALG_COMP]) {
+		struct rtattr *rta = tb[XFRMA_ALG_COMP];
+		xfrm_algo_print((struct xfrm_algo *) RTA_DATA(rta),
+			XFRMA_ALG_COMP, RTA_PAYLOAD(rta), fp, prefix);
+	}
 
-			if (prefix)
-				fprintf(fp, prefix);
-			fprintf(fp, "encap ");
+	if (tb[XFRMA_ENCAP]) {
+		struct xfrm_encap_tmpl *e;
+		char abuf[256];
 
-			if (len < sizeof(*e)) {
-				fprintf(fp, "(ERROR truncated)");
-				fprintf(fp, "%s", _SL_);
-				break;
-			}
-			e = (struct xfrm_encap_tmpl *)data;
+		if (prefix)
+			fprintf(fp, prefix);
+		fprintf(fp, "encap ");
 
-			fprintf(fp, "type %u ", e->encap_type);
-			fprintf(fp, "sport %u ", ntohs(e->encap_sport));
-			fprintf(fp, "dport %u ", ntohs(e->encap_dport));
-
-			memset(abuf, '\0', sizeof(abuf));
-			fprintf(fp, "addr %s",
-				rt_addr_n2a(family, sizeof(e->encap_oa),
-					    &e->encap_oa, abuf, sizeof(abuf)));
+		if (RTA_PAYLOAD(tb[XFRMA_ENCAP]) < sizeof(*e)) {
+			fprintf(fp, "(ERROR truncated)");
 			fprintf(fp, "%s", _SL_);
-			break;
+			return;
 		}
-		case XFRMA_TMPL:
-			xfrm_tmpl_print((struct xfrm_user_tmpl *)data,
-					len, family, fp, prefix);
-			break;
-		default:
-			if (prefix)
-				fprintf(fp, prefix);
-			fprintf(fp, "%u (unknown rta_type)", type);
-			fprintf(fp, "%s", _SL_);
-			break;
-		}
+		e = (struct xfrm_encap_tmpl *) RTA_DATA(tb[XFRMA_ENCAP]);
+
+		fprintf(fp, "type %u ", e->encap_type);
+		fprintf(fp, "sport %u ", ntohs(e->encap_sport));
+		fprintf(fp, "dport %u ", ntohs(e->encap_dport));
+
+		memset(abuf, '\0', sizeof(abuf));
+		fprintf(fp, "addr %s",
+			rt_addr_n2a(family, sizeof(e->encap_oa),
+				    &e->encap_oa, abuf, sizeof(abuf)));
+		fprintf(fp, "%s", _SL_);
+	}
+
+	if (tb[XFRMA_TMPL]) {
+		struct rtattr *rta = tb[XFRMA_TMPL];
+		xfrm_tmpl_print((struct xfrm_user_tmpl *) RTA_DATA(rta),
+			RTA_PAYLOAD(rta), family, fp, prefix);
 	}
 }