diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2011-01-28 17:47:25 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2011-01-28 18:23:07 +0100 |
commit | 86a2a53b90e250c8473104d4540c4155c26bf1a3 (patch) | |
tree | 88cfaa165682eaf4954a0b1c8f51a6d5e705846f | |
parent | 122d604838a270fba131abbb2395f35b694df348 (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.
-rw-r--r-- | include/udp_input.h | 3 | ||||
-rw-r--r-- | src/link_udp.c | 25 |
2 files changed, 20 insertions, 8 deletions
diff --git a/include/udp_input.h b/include/udp_input.h index 2d84fef..7c95384 100644 --- a/include/udp_input.h +++ b/include/udp_input.h @@ -38,6 +38,9 @@ #define UDP_DATA_RETR_PRIO_3 19 #define UDP_DATA_RETR_COMPL 32 #define UDP_DATA_RETR_IMPOS 33 +#define UDP_DATA_LINK_UP 34 +#define UDP_DATA_LINK_DOWN 35 + struct udp_data_hdr { uint8_t format_type; 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); |