From 976cb18a81bb92219ffe75f1e66b6f1d9afb6edf Mon Sep 17 00:00:00 2001 From: Anjan Chanda <anjan.chanda@iopsys.eu> Date: Tue, 23 Feb 2021 11:50:25 +0100 Subject: [PATCH] move topology and bridge discovery functions to cmdu_output.c --- src/cmdu_output.c | 146 +++++++++++++++++++++++++++++++++++++++++++ src/i1905.c | 153 +--------------------------------------------- src/i1905.h | 4 ++ 3 files changed, 152 insertions(+), 151 deletions(-) diff --git a/src/cmdu_output.c b/src/cmdu_output.c index 4836c8ff..a0f54fd8 100644 --- a/src/cmdu_output.c +++ b/src/cmdu_output.c @@ -47,6 +47,152 @@ #include "i1905_extension.h" +int i1905_send_bridge_discovery(struct i1905_interface *iface) +{ + struct cmdu_buff *frm = NULL; + uint8_t *lldpbuf; + int ret = 0; + + + frm = cmdu_alloc_default(); + if (!frm) { + fprintf(stderr, "%s: -ENOMEM\n", __func__); + return -1; + } + + frm->data = (uint8_t *)(frm->head + 18); + frm->tail = frm->data; + + /* lldp tlvs are not compatible with 1905's. + * So, the same struct tlv cannot be used here. + */ + lldpbuf = calloc(1, 256 * sizeof(uint8_t)); + if (!lldpbuf) { + cmdu_free(frm); + fprintf(stderr, "%s: -ENOMEM\n", __func__); + return -1; + } + + lldpbuf[0] = (LLDP_TLV_CHASSIS_ID << 1) | ((7 & 0x80) >> 7); + lldpbuf[1] = 7 & 0x7f; + lldpbuf[2] = LLDP_CHASSIS_ID_SUBTYPE_MAC_ADDRESS; + memcpy(&lldpbuf[3], iface->aladdr, 6); + + ret = cmdu_put(frm, lldpbuf, 9); + if (ret) { + fprintf(stderr, "%s: error: cmdu_put()\n", __func__); + cmdu_free(frm); + free(lldpbuf); + return -1; + } + + memset(lldpbuf, 0, 256); + lldpbuf[0] = (LLDP_TLV_PORT_ID << 1) | ((7 & 0x80) >> 7); + lldpbuf[1] = 7 & 0x7f; + lldpbuf[2] = LLDP_PORT_ID_SUBTYPE_MAC_ADDRESS; + memcpy(&lldpbuf[3], iface->macaddr, 6); + + ret = cmdu_put(frm, lldpbuf, 9); + if (ret) { + fprintf(stderr, "%s: error: cmdu_put()\n", __func__); + cmdu_free(frm); + free(lldpbuf); + return -1; + } + + memset(lldpbuf, 0, 256); + lldpbuf[0] = (LLDP_TLV_TTL << 1) | ((2 & 0x80) >> 7); + lldpbuf[1] = 2 & 0x7f; + buf_put_be16(&lldpbuf[2], LLDP_TTL_1905_DEFAULT_VALUE); + + ret = cmdu_put(frm, lldpbuf, 4); + if (ret) { + fprintf(stderr, "%s: error: cmdu_put()\n", __func__); + cmdu_free(frm); + free(lldpbuf); + return -1; + } + + ret = i1905_send_cmdu(iface->priv, MCAST_LLDP, iface->aladdr, + ETHERTYPE_LLDP, frm); + if (ret) { + fprintf(stderr, "Error sending BRIDGE DISCOVERY\n"); + } + + free(lldpbuf); + cmdu_free(frm); + + return 0; +} + +int i1905_send_topology_discovery(struct i1905_interface *iface) +{ + struct cmdu_buff *frm = NULL; + struct tlv *t; + int ret = 0; + + + frm = cmdu_alloc_default(); + if (!frm) { + fprintf(stderr, "%s: -ENOMEM\n", __func__); + return -1; + } + + frm->cdata = (struct cmdu_linear *)(frm->head + 18); + cmdu_set_type(frm, CMDU_TYPE_TOPOLOGY_DISCOVERY); + cmdu_set_mid(frm, cmdu_get_next_mid()); + CMDU_SET_LAST_FRAGMENT(frm->cdata); + + frm->data = (uint8_t *)(frm->cdata + 1); + frm->tail = frm->data; + + + /* prepare TLVs */ + t = cmdu_reserve_tlv(frm, 6); + if (!t) { + cmdu_free(frm); + fprintf(stderr, "%s: -ENOMEM\n", __func__); + return -1; + } + + t->type = TLV_TYPE_AL_MAC_ADDRESS_TYPE; + t->len = 6; + memcpy(t->data, iface->aladdr, 6); + ret = cmdu_put_tlv(frm, t); + if (ret) { + fprintf(stderr, "%s: error: cmdu_put_tlv()\n", __func__); + cmdu_free(frm); + return -1; + } + + t = cmdu_reserve_tlv(frm, 6); + if (!t) { + cmdu_free(frm); + return -1; + } + + t->type = TLV_TYPE_MAC_ADDRESS_TYPE; + t->len = 6; + memcpy(t->data, iface->macaddr, 6); + ret = cmdu_put_tlv(frm, t); + if (ret) { + fprintf(stderr, "%s: error: cmdu_put_tlv()\n", __func__); + cmdu_free(frm); + return -1; + } + + cmdu_put_eom(frm); + + ret = i1905_send_cmdu(iface->priv, MCAST_1905, iface->aladdr, + ETHERTYPE_1905, frm); + if (ret) { + fprintf(stderr, "Error sending TOPOLOGY_DISCOVERY\n"); + } + + cmdu_free(frm); + + return 0; +} int i1905_send_topology_query(struct i1905_interface *iface, uint8_t *dest) { diff --git a/src/i1905.c b/src/i1905.c index 8235055c..56308c54 100644 --- a/src/i1905.c +++ b/src/i1905.c @@ -1107,86 +1107,7 @@ int i1905_run_bridge_discovery(struct i1905_private *p) list_for_each_entry(iface, &p->dm.self.iflist, list) { - struct cmdu_buff *frm = NULL; - uint8_t *lldpbuf; - int ret = 0; - - - //fprintf(stderr, "%s: %d ifname = %s\n", __func__, __LINE__, - // iface->ifname); - - frm = cmdu_alloc_default(); - if (!frm) { - fprintf(stderr, "%s: -ENOMEM\n", __func__); - return -1; - } - - frm->data = (uint8_t *)(frm->head + 18); - frm->tail = frm->data; - - //fprintf(stderr, "%s: head = %p data = %p tail = %p end = %p\n", - // __func__, frm->head, frm->data, frm->tail, frm->end); - - /* prepare and append TLVs */ - - /* lldp tlvs are not compatible with 1905's. - * So, the same struct tlv cannot be used here. - */ - lldpbuf = calloc(1, 256 * sizeof(uint8_t)); - if (!lldpbuf) { - cmdu_free(frm); - fprintf(stderr, "%s: -ENOMEM\n", __func__); - return -1; - } - - lldpbuf[0] = (LLDP_TLV_CHASSIS_ID << 1) | ((7 & 0x80) >> 7); - lldpbuf[1] = 7 & 0x7f; - lldpbuf[2] = LLDP_CHASSIS_ID_SUBTYPE_MAC_ADDRESS; - memcpy(&lldpbuf[3], iface->aladdr, 6); - - ret = cmdu_put(frm, lldpbuf, 9); - if (ret) { - fprintf(stderr, "%s: error: cmdu_put()\n", __func__); - cmdu_free(frm); - free(lldpbuf); - return -1; - } - - memset(lldpbuf, 0, 256); - lldpbuf[0] = (LLDP_TLV_PORT_ID << 1) | ((7 & 0x80) >> 7); - lldpbuf[1] = 7 & 0x7f; - lldpbuf[2] = LLDP_PORT_ID_SUBTYPE_MAC_ADDRESS; - memcpy(&lldpbuf[3], iface->macaddr, 6); - - ret = cmdu_put(frm, lldpbuf, 9); - if (ret) { - fprintf(stderr, "%s: error: cmdu_put()\n", __func__); - cmdu_free(frm); - free(lldpbuf); - return -1; - } - - memset(lldpbuf, 0, 256); - lldpbuf[0] = (LLDP_TLV_TTL << 1) | ((2 & 0x80) >> 7); - lldpbuf[1] = 2 & 0x7f; - buf_put_be16(&lldpbuf[2], LLDP_TTL_1905_DEFAULT_VALUE); - - ret = cmdu_put(frm, lldpbuf, 4); - if (ret) { - fprintf(stderr, "%s: error: cmdu_put()\n", __func__); - cmdu_free(frm); - free(lldpbuf); - return -1; - } - - ret = i1905_send_cmdu(iface->priv, MCAST_LLDP, iface->aladdr, - ETHERTYPE_LLDP, frm); - if (ret) { - fprintf(stderr, "Error sending TOPOLOGY_DISCOVERY\n"); - } - - free(lldpbuf); - cmdu_free(frm); + i1905_send_bridge_discovery(iface); } return 0; @@ -1198,82 +1119,12 @@ int i1905_run_topology_discovery(struct i1905_private *p) list_for_each_entry(iface, &p->dm.self.iflist, list) { - struct cmdu_buff *frm = NULL; - struct tlv *t; - int ret = 0; - - - //fprintf(stderr, "%s: %d ifname = %s\n", __func__, __LINE__, - // iface->ifname); - - frm = cmdu_alloc_default(); - if (!frm) { - fprintf(stderr, "%s: -ENOMEM\n", __func__); - return -1; - } - - frm->cdata = (struct cmdu_linear *)(frm->head + 18); - cmdu_set_type(frm, CMDU_TYPE_TOPOLOGY_DISCOVERY); - cmdu_set_mid(frm, cmdu_get_next_mid()); - CMDU_SET_LAST_FRAGMENT(frm->cdata); - - frm->data = (uint8_t *)(frm->cdata + 1); - frm->tail = frm->data; - - - /* fprintf(stderr, "%s: head = %p data = %p tail = %p end = %p\n", - __func__, frm->head, frm->data, frm->tail, frm->end); */ - - /* prepare TLVs */ - t = cmdu_reserve_tlv(frm, 6); - if (!t) { - cmdu_free(frm); - fprintf(stderr, "%s: -ENOMEM\n", __func__); - return -1; - } - - t->type = TLV_TYPE_AL_MAC_ADDRESS_TYPE; - t->len = 6; - memcpy(t->data, iface->aladdr, 6); - ret = cmdu_put_tlv(frm, t); - if (ret) { - fprintf(stderr, "%s: error: cmdu_put_tlv()\n", __func__); - cmdu_free(frm); - return -1; - } - - t = cmdu_reserve_tlv(frm, 6); - if (!t) { - cmdu_free(frm); - return -1; - } - - t->type = TLV_TYPE_MAC_ADDRESS_TYPE; - t->len = 6; - memcpy(t->data, iface->macaddr, 6); - ret = cmdu_put_tlv(frm, t); - if (ret) { - fprintf(stderr, "%s: error: cmdu_put_tlv()\n", __func__); - cmdu_free(frm); - return -1; - } - - cmdu_put_eom(frm); - - ret = i1905_send_cmdu(iface->priv, MCAST_1905, iface->aladdr, - ETHERTYPE_1905, frm); - if (ret) { - fprintf(stderr, "Error sending TOPOLOGY_DISCOVERY\n"); - } - - cmdu_free(frm); + i1905_send_topology_discovery(iface); } - return 0; } - void topology_timer_cb(atimer_t *t) { struct i1905_private *p = container_of(t, struct i1905_private, topotimer); diff --git a/src/i1905.h b/src/i1905.h index 1824ac16..298cf878 100644 --- a/src/i1905.h +++ b/src/i1905.h @@ -123,6 +123,10 @@ int i1905_send_cmdu_relay_mcast(struct i1905_private *priv, const char *ifname, int i1905_process_cmdu(struct i1905_private *priv, struct cmdu_buff *rxf); +int i1905_send_bridge_discovery(struct i1905_interface *iface); + +int i1905_send_topology_discovery(struct i1905_interface *iface); + int i1905_send_topology_notification(struct i1905_private *priv); int i1905_send_topology_query(struct i1905_interface *iface, uint8_t *dest); -- GitLab