udp: Use link up/down signals from the MIB for the link

The mib was patched to send link up/down in case of failures,
only put a link service when the MIB tells us the link is
up, the failure case should only happen for remote links
failing. We will reset and go through link alignment.
diff --git a/src/link_udp.c b/src/link_udp.c
index c0df050..ab6e8b9 100644
--- a/src/link_udp.c
+++ b/src/link_udp.c
@@ -113,23 +113,33 @@
 		goto exit;
 	}
 
-	/* throw away data as the link is down */
-	if (link->set->available == 0) {
-		LOGP(DINP, LOGL_ERROR, "The link is down. Not forwarding.\n");
-		rc = 0;
-		goto exit;
-	}
-
 	if (hdr->data_type == UDP_DATA_RETR_COMPL || hdr->data_type == UDP_DATA_RETR_IMPOS) {
 		LOGP(DINP, LOGL_ERROR, "Link retrieval done. Restarting the link.\n");
 		mtp_link_failure(link);
 		goto exit;
+	} else if (hdr->data_type == UDP_DATA_LINK_UP) {
+		LOGP(DINP, LOGL_NOTICE, "Link of %s/%d is up.\n",
+		     link->set->name, link->link_no);
+		mtp_link_up(link);
+		goto exit;
+	} else if (hdr->data_type == UDP_DATA_LINK_DOWN) {
+		LOGP(DINP, LOGL_NOTICE, "Link of %s/%d is down.\n",
+		     link->set->name, link->link_no);
+		mtp_link_failure(link);
+		goto exit;
 	} else if (hdr->data_type > UDP_DATA_MSU_PRIO_3) {
 		LOGP(DINP, LOGL_ERROR, "Link failure. retrieved message.\n");
 		mtp_link_failure(link);
 		goto exit;
 	}
 
+	/* throw away data as the link is down */
+	if (link->set->available == 0) {
+		LOGP(DINP, LOGL_ERROR, "The link is down. Not forwarding.\n");
+		rc = 0;
+		goto exit;
+	}
+
 	length = ntohl(hdr->data_length);
 	if (length + sizeof(*hdr) > (unsigned int) rc) {
 		LOGP(DINP, LOGL_ERROR, "The MSU payload does not fit: %u + %u > %d \n",
@@ -312,7 +322,6 @@
 
 	switch (area) {
 	case SNMP_LINK_UP:
-		mtp_link_up(link);
 		break;
 	case SNMP_LINK_DOWN:
 		mtp_link_down(link);