static void LocalIAmHandler( uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src) { int len = 0; uint32_t device_id = 0; unsigned max_apdu = 0; int segmentation = 0; uint16_t vendor_id = 0; (void) src; (void) service_len; len = iam_decode_service_request(service_request, &device_id, &max_apdu, &segmentation, &vendor_id); fprintf(stderr, "Received I-Am Request"); if (len != -1) { fprintf(stderr, " from %u!\n", device_id); address_add(device_id, max_apdu, src); } else fprintf(stderr, "!\n"); return; }
void my_i_am_handler( uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src) { int len = 0; uint32_t device_id = 0; unsigned max_apdu = 0; int segmentation = 0; uint16_t vendor_id = 0; (void) service_len; len = iam_decode_service_request(service_request, &device_id, &max_apdu, &segmentation, &vendor_id); #if PRINT_ENABLED fprintf(stderr, "Received I-Am Request"); #endif if (len != -1) { #if PRINT_ENABLED fprintf(stderr, " from %lu, MAC = %d.%d.%d.%d.%d.%d\n", (unsigned long) device_id, src->mac[0], src->mac[1], src->mac[2], src->mac[3], src->mac[4], src->mac[5]); #endif address_table_add(device_id, max_apdu, src); } else { #if PRINT_ENABLED fprintf(stderr, ", but unable to decode it.\n"); #endif } return; }
static void mstp_monitor_i_am( uint8_t mac, uint8_t *pdu, uint16_t pdu_len) { BACNET_ADDRESS src = { 0 }; BACNET_ADDRESS dest = { 0 }; BACNET_NPDU_DATA npdu_data = { 0 }; int apdu_offset = 0; uint16_t apdu_len = 0; uint8_t *apdu = NULL; uint8_t pdu_type = 0; uint8_t service_choice = 0; uint8_t *service_request = NULL; uint32_t device_id = 0; int len = 0; if (pdu[0] == BACNET_PROTOCOL_VERSION) { MSTP_Fill_BACnet_Address(&src, mac); apdu_offset = npdu_decode(&pdu[0], &dest, &src, &npdu_data); if ((!npdu_data.network_layer_message) && (apdu_offset > 0) && (apdu_offset < pdu_len) && ((dest.net == 0) || (dest.net == BACNET_BROADCAST_NETWORK)) && (src.net == 0)) { apdu_len = pdu_len - apdu_offset; apdu = &pdu[apdu_offset]; pdu_type = apdu[0] & 0xF0; if ((pdu_type == PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST) && (apdu_len >= 2)) { service_choice = apdu[1]; service_request = &apdu[2]; if (service_choice == SERVICE_UNCONFIRMED_I_AM) { len = iam_decode_service_request(service_request, &device_id, NULL, NULL, NULL); if (len != -1) { MSTP_Statistics[mac].device_id = device_id; } } } } } }
/** Handler for I-Am responses (older binding-update-only version). * Will update the responder's binding, but if already in our cache. * @note This handler is deprecated, in favor of handler_i_am_add(). * * @param service_request [in] The received message to be handled. * @param service_len [in] Length of the service_request message. * @param src [in] The BACNET_ADDRESS of the message's source. */ void handler_i_am_bind( uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src) { int len = 0; uint32_t device_id = 0; unsigned max_apdu = 0; int segmentation = 0; uint16_t vendor_id = 0; (void) service_len; len = iam_decode_service_request(service_request, &device_id, &max_apdu, &segmentation, &vendor_id); if (len > 0) { /* only add address if requested to bind */ address_add_binding(device_id, max_apdu, src); } return; }