aboutsummaryrefslogtreecommitdiffstats
path: root/src/link_udp.c
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2011-01-28 17:47:25 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2011-01-28 18:23:07 +0100
commit86a2a53b90e250c8473104d4540c4155c26bf1a3 (patch)
tree88cfaa165682eaf4954a0b1c8f51a6d5e705846f /src/link_udp.c
parent122d604838a270fba131abbb2395f35b694df348 (diff)
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.
Diffstat (limited to 'src/link_udp.c')
-rw-r--r--src/link_udp.c25
1 files changed, 17 insertions, 8 deletions
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 @@ static int udp_read_cb(struct bsc_fd *fd)
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 @@ void snmp_mtp_callback(struct snmp_mtp_session *session,
switch (area) {
case SNMP_LINK_UP:
- mtp_link_up(link);
break;
case SNMP_LINK_DOWN:
mtp_link_down(link);