Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 495bbe94e5126512132d69685e96e0d7 > files > 19

fcoe-utils-1.0.18-2.fc15.src.rpm

From c76c44392b52e58cab9212eb94c19f59835240c7 Mon Sep 17 00:00:00 2001
From: Nithin Sujir <nsujir@broadcom.com>
Date: Wed, 23 Mar 2011 01:38:25 +0000
Subject: [PATCH 04/16] fcoeutils: Cancel vlan discovery timer only when valid
 response is received

Currently fcoemon cancels the timer as soon as a response is received
whether all the critical descriptors are present or not. This patch
verifies the critical descriptors are present in the vlan response
before cancelling the timer.

Signed-off-by: Nithin Nayak Sujir <nsujir@broadcom.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: Petr Sabata <psabata@redhat.com>
---
 fcoemon.c |   20 ++++++++++++++++----
 1 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/fcoemon.c b/fcoemon.c
index cd0916b..042d1c8 100644
--- a/fcoemon.c
+++ b/fcoemon.c
@@ -517,6 +517,12 @@ int fcm_vlan_disc_handler(struct fiphdr *fh, struct sockaddr_ll *sa, void *arg)
 	struct fip_tlv_hdr *tlv = (struct fip_tlv_hdr *)(fh + 1);
 	struct fcoe_port *p = arg;
 	struct fcoe_port *vp;
+	int desc_mask = 0;
+
+	enum {
+		VALID_MAC	= 1,
+		VALID_VLAN	= 2,
+	};
 
 	if (ntohs(fh->fip_proto) != FIP_PROTO_VLAN)
 		return -1;
@@ -524,14 +530,12 @@ int fcm_vlan_disc_handler(struct fiphdr *fh, struct sockaddr_ll *sa, void *arg)
 	if (fh->fip_subcode != FIP_VLAN_NOTE)
 		return -1;
 
-	/* cancel the retry timer, response received */
-	sa_timer_cancel(&p->vlan_disc_timer);
-
 	while (len > 0) {
 		switch (tlv->tlv_type) {
 		case FIP_TLV_MAC_ADDR:
 			memcpy(mac, ((struct fip_tlv_mac_addr *)tlv)->mac_addr,
 			       ETHER_ADDR_LEN);
+			desc_mask |= VALID_MAC;
 			break;
 			/*
 			 * this expects to see the MAC_ADDR TLV first,
@@ -545,6 +549,7 @@ int fcm_vlan_disc_handler(struct fiphdr *fh, struct sockaddr_ll *sa, void *arg)
 			vid = ntohs(((struct fip_tlv_vlan *)tlv)->vlan);
 			vp = fcm_new_vlan(sa->sll_ifindex, vid);
 			vp->dcb_required = p->dcb_required;
+			desc_mask |= VALID_VLAN;
 			break;
 		default:
 			/* unexpected or unrecognized descriptor */
@@ -554,7 +559,14 @@ int fcm_vlan_disc_handler(struct fiphdr *fh, struct sockaddr_ll *sa, void *arg)
 		len -= tlv->tlv_len;
 		tlv = ((void *) tlv) + (tlv->tlv_len << 2);
 	};
-	return 0;
+
+	if (desc_mask == (VALID_MAC | VALID_VLAN)) {
+		/* cancel the retry timer, valid response received */
+		sa_timer_cancel(&p->vlan_disc_timer);
+		return 0;
+	} else {
+		return -1;
+	}
 }
 
 static void fcm_fip_recv(void *arg)
-- 
1.7.4.4