diff --git a/bacnet-stack/apdu.c b/bacnet-stack/apdu.c index 657a0697..93f00c7a 100644 --- a/bacnet-stack/apdu.c +++ b/bacnet-stack/apdu.c @@ -40,234 +40,67 @@ #include "bacdcode.h" #include "bacenum.h" +// Confirmed Function Handlers +// If they are not set, they are handled by a reject message +static confirmed_function +Confirmed_Function[MAX_BACNET_CONFIRMED_SERVICE] = +{ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; + +void apdu_set_confirmed_handler( + BACNET_CONFIRMED_SERVICE service_choice, + confirmed_function pFunction) +{ + if (service_choice < MAX_BACNET_CONFIRMED_SERVICE) + Confirmed_Function[service_choice] = pFunction; +} + // Unconfirmed Function Handlers // If they are not set, they are not handled -static unconfirmed_function Unconfirmed_I_Am_Handler = NULL; -static unconfirmed_function Unconfirmed_Who_Is_Handler = NULL; -static unconfirmed_function Unconfirmed_COV_Notification_Handler = NULL; -static unconfirmed_function Unconfirmed_I_Have_Handler = NULL; -static unconfirmed_function Unconfirmed_Event_Notification_Handler = NULL; -static unconfirmed_function Unconfirmed_Private_Transfer_Handler = NULL; -static unconfirmed_function Unconfirmed_Text_Message_Handler = NULL; -static unconfirmed_function Unconfirmed_Time_Synchronization_Handler = NULL; -static unconfirmed_function Unconfirmed_Who_Has_Handler = NULL; -static unconfirmed_function Unconfirmed_UTC_Time_Synchronization_Handler = NULL; +// Note: we may not need any initializers here since +// C is supposed to init global data to zero. +static unconfirmed_function +Unconfirmed_Function[MAX_BACNET_UNCONFIRMED_SERVICE] = +{ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; void apdu_set_unconfirmed_handler( BACNET_UNCONFIRMED_SERVICE service_choice, unconfirmed_function pFunction) { - switch (service_choice) - { - case SERVICE_UNCONFIRMED_I_AM: - Unconfirmed_I_Am_Handler = pFunction; - break; - case SERVICE_UNCONFIRMED_WHO_IS: - Unconfirmed_Who_Is_Handler = pFunction; - break; - case SERVICE_UNCONFIRMED_COV_NOTIFICATION: - Unconfirmed_COV_Notification_Handler = pFunction; - break; - case SERVICE_UNCONFIRMED_I_HAVE: - Unconfirmed_I_Have_Handler = pFunction; - break; - case SERVICE_UNCONFIRMED_EVENT_NOTIFICATION: - Unconfirmed_Event_Notification_Handler = pFunction; - break; - case SERVICE_UNCONFIRMED_PRIVATE_TRANSFER: - Unconfirmed_Private_Transfer_Handler = pFunction; - break; - case SERVICE_UNCONFIRMED_TEXT_MESSAGE: - Unconfirmed_Text_Message_Handler = pFunction; - break; - case SERVICE_UNCONFIRMED_TIME_SYNCHRONIZATION: - Unconfirmed_Time_Synchronization_Handler = pFunction; - break; - case SERVICE_UNCONFIRMED_WHO_HAS: - Unconfirmed_Who_Has_Handler = pFunction; - break; - case SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION: - Unconfirmed_UTC_Time_Synchronization_Handler = pFunction; - break; - default: - break; - } + if (service_choice < MAX_BACNET_UNCONFIRMED_SERVICE) + Unconfirmed_Function[service_choice] = pFunction; } -// Confirmed Function Handlers -// If they are not set, they are handled by a reject message -static confirmed_function Confirmed_Acknowledge_Alarm_Handler = NULL; -static confirmed_function Confirmed_COV_Notification_Handler = NULL; -static confirmed_function Confirmed_Event_Notification_Handler = NULL; -static confirmed_function Confirmed_Get_Alarm_Summary_Handler = NULL; -static confirmed_function Confirmed_Get_Enrollment_Summary_Handler = NULL; -static confirmed_function Confirmed_Get_Event_Information_Handler = NULL; -static confirmed_function Confirmed_Subscribe_COV_Handler = NULL; -static confirmed_function Confirmed_Subscribe_COV_Property_Handler = NULL; -static confirmed_function Confirmed_Life_Safety_Operation_Handler = NULL; -static confirmed_function Confirmed_Atomic_Read_File_Handler = NULL; -static confirmed_function Confirmed_Atomic_Write_File_Handler = NULL; -static confirmed_function Confirmed_Add_List_Element_Handler = NULL; -static confirmed_function Confirmed_Remove_List_Element_Handler = NULL; -static confirmed_function Confirmed_Create_Object_Handler = NULL; -static confirmed_function Confirmed_Delete_Object_Handler = NULL; -static confirmed_function Confirmed_Read_Property_Handler = NULL; -static confirmed_function Confirmed_Read_Property_Conditional_Handler = NULL; -static confirmed_function Confirmed_Read_Property_Multiple_Handler = NULL; -static confirmed_function Confirmed_Read_Range_Handler = NULL; -static confirmed_function Confirmed_Write_Property_Handler = NULL; -static confirmed_function Confirmed_Write_Property_Multiple_Handler = NULL; -static confirmed_function Confirmed_Device_Communication_Control_Handler = NULL; -static confirmed_function Confirmed_Private_Transfer_Handler = NULL; -static confirmed_function Confirmed_Text_Message_Handler = NULL; -static confirmed_function Confirmed_Reinitialize_Device_Handler = NULL; -static confirmed_function Confirmed_VT_Open_Handler = NULL; -static confirmed_function Confirmed_VT_Close_Handler = NULL; -static confirmed_function Confirmed_VT_Data_Handler = NULL; -static confirmed_function Confirmed_Authenticate_Handler = NULL; -static confirmed_function Confirmed_Request_Key_Handler = NULL; - -void apdu_set_confirmed_handler( - BACNET_CONFIRMED_SERVICE service_choice, - confirmed_function pFunction) -{ - switch (service_choice) - { - case SERVICE_CONFIRMED_ACKNOWLEDGE_ALARM: - Confirmed_Acknowledge_Alarm_Handler = pFunction; - break; - case SERVICE_CONFIRMED_COV_NOTIFICATION: - Confirmed_COV_Notification_Handler = pFunction; - break; - case SERVICE_CONFIRMED_EVENT_NOTIFICATION: - Confirmed_Event_Notification_Handler = pFunction; - break; - case SERVICE_CONFIRMED_GET_ALARM_SUMMARY: - Confirmed_Get_Alarm_Summary_Handler = pFunction; - break; - case SERVICE_CONFIRMED_GET_ENROLLMENT_SUMMARY: - Confirmed_Get_Enrollment_Summary_Handler = pFunction; - break; - case SERVICE_CONFIRMED_GET_EVENT_INFORMATION: - Confirmed_Get_Event_Information_Handler = pFunction; - break; - case SERVICE_CONFIRMED_SUBSCRIBE_COV: - Confirmed_Subscribe_COV_Handler = pFunction; - break; - case SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY: - Confirmed_Subscribe_COV_Property_Handler = pFunction; - break; - case SERVICE_CONFIRMED_LIFE_SAFETY_OPERATION: - Confirmed_Life_Safety_Operation_Handler = pFunction; - break; - // File Access Services - case SERVICE_CONFIRMED_ATOMIC_READ_FILE: - Confirmed_Atomic_Read_File_Handler = pFunction; - break; - case SERVICE_CONFIRMED_ATOMIC_WRITE_FILE: - Confirmed_Atomic_Write_File_Handler = pFunction; - break; - // Object Access Services - case SERVICE_CONFIRMED_ADD_LIST_ELEMENT: - Confirmed_Add_List_Element_Handler = pFunction; - break; - case SERVICE_CONFIRMED_REMOVE_LIST_ELEMENT: - Confirmed_Remove_List_Element_Handler = pFunction; - break; - case SERVICE_CONFIRMED_CREATE_OBJECT: - Confirmed_Create_Object_Handler = pFunction; - break; - case SERVICE_CONFIRMED_DELETE_OBJECT: - Confirmed_Delete_Object_Handler = pFunction; - break; - case SERVICE_CONFIRMED_READ_PROPERTY: - Confirmed_Read_Property_Handler = pFunction; - break; - case SERVICE_CONFIRMED_READ_PROPERTY_CONDITIONAL: - Confirmed_Read_Property_Conditional_Handler = pFunction; - break; - case SERVICE_CONFIRMED_READ_PROPERTY_MULTIPLE: - Confirmed_Read_Property_Multiple_Handler = pFunction; - break; - case SERVICE_CONFIRMED_READ_RANGE: - Confirmed_Read_Range_Handler = pFunction; - break; - case SERVICE_CONFIRMED_WRITE_PROPERTY: - Confirmed_Write_Property_Handler = pFunction; - break; - case SERVICE_CONFIRMED_WRITE_PROPERTY_MULTIPLE: - Confirmed_Write_Property_Multiple_Handler = pFunction; - break; - // Remote Device Management Services - case SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL: - Confirmed_Device_Communication_Control_Handler = pFunction; - break; - case SERVICE_CONFIRMED_PRIVATE_TRANSFER: - Confirmed_Private_Transfer_Handler = pFunction; - break; - case SERVICE_CONFIRMED_TEXT_MESSAGE: - Confirmed_Text_Message_Handler = pFunction; - break; - case SERVICE_CONFIRMED_REINITIALIZE_DEVICE: - Confirmed_Reinitialize_Device_Handler = pFunction; - break; - // Virtual Terminal Services - case SERVICE_CONFIRMED_VT_OPEN: - Confirmed_VT_Open_Handler = pFunction; - break; - case SERVICE_CONFIRMED_VT_CLOSE: - Confirmed_VT_Close_Handler = pFunction; - break; - case SERVICE_CONFIRMED_VT_DATA: - Confirmed_VT_Data_Handler = pFunction; - break; - // Security Services - case SERVICE_CONFIRMED_AUTHENTICATE: - Confirmed_Authenticate_Handler = pFunction; - break; - case SERVICE_CONFIRMED_REQUEST_KEY: - Confirmed_Request_Key_Handler = pFunction; - break; - default: - break; - } -} - -// Confirmed Simple ACK Function Handlers +// Confirmed simple ACK Function Handlers // The services that require a complex ACK are not listed here +// FIXME: The array doesn't need to be this big, but is +// simpler to handle if it is. +// We might be able to combine simple ack and complex ack +// functions and only use a single array. static confirmed_simple_ack_function - Confirmed_Acknowledge_Alarm_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_COV_Notification_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Event_Notification_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Subscribe_COV_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Subscribe_COV_Property_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Life_Safety_Operation_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Add_List_Element_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Remove_List_Element_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Delete_Object_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Write_Property_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Write_Property_Multiple_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Device_Communication_Control_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Reinitialize_Device_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Text_Message_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_VT_Close_SimpleACK_Handler = NULL; -static confirmed_simple_ack_function - Confirmed_Request_Key_SimpleACK_Handler = NULL; - +Confirmed_SimpleACK_Function[MAX_BACNET_CONFIRMED_SERVICE] = +{ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; + +#if 1 +// If we don't care which functions actually get set... +void apdu_set_confirmed_simple_ack_handler( + BACNET_CONFIRMED_SERVICE service_choice, + confirmed_simple_ack_function pFunction) +{ + if (service_choice < MAX_BACNET_CONFIRMED_SERVICE) + Confirmed_SimpleACK_Function[service_choice] = pFunction; +} +#else +// If we care which functions actually get set... void apdu_set_confirmed_simple_ack_handler( BACNET_CONFIRMED_SERVICE service_choice, confirmed_simple_ack_function pFunction) @@ -275,93 +108,58 @@ void apdu_set_confirmed_simple_ack_handler( switch (service_choice) { case SERVICE_CONFIRMED_ACKNOWLEDGE_ALARM: - Confirmed_Acknowledge_Alarm_SimpleACK_Handler = pFunction; - break; case SERVICE_CONFIRMED_COV_NOTIFICATION: - Confirmed_COV_Notification_SimpleACK_Handler = pFunction; - break; case SERVICE_CONFIRMED_EVENT_NOTIFICATION: - Confirmed_Event_Notification_SimpleACK_Handler = pFunction; - break; case SERVICE_CONFIRMED_SUBSCRIBE_COV: - Confirmed_Subscribe_COV_SimpleACK_Handler = pFunction; - break; case SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY: - Confirmed_Subscribe_COV_Property_SimpleACK_Handler = pFunction; - break; case SERVICE_CONFIRMED_LIFE_SAFETY_OPERATION: - Confirmed_Life_Safety_Operation_SimpleACK_Handler = pFunction; - break; // Object Access Services case SERVICE_CONFIRMED_ADD_LIST_ELEMENT: - Confirmed_Add_List_Element_SimpleACK_Handler = pFunction; - break; case SERVICE_CONFIRMED_REMOVE_LIST_ELEMENT: - Confirmed_Remove_List_Element_SimpleACK_Handler = pFunction; - break; case SERVICE_CONFIRMED_DELETE_OBJECT: - Confirmed_Delete_Object_SimpleACK_Handler = pFunction; - break; case SERVICE_CONFIRMED_WRITE_PROPERTY: - Confirmed_Write_Property_SimpleACK_Handler = pFunction; - break; case SERVICE_CONFIRMED_WRITE_PROPERTY_MULTIPLE: - Confirmed_Write_Property_Multiple_SimpleACK_Handler = pFunction; - break; // Remote Device Management Services case SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL: - Confirmed_Device_Communication_Control_SimpleACK_Handler = pFunction; - break; case SERVICE_CONFIRMED_TEXT_MESSAGE: - Confirmed_Text_Message_SimpleACK_Handler = pFunction; - break; case SERVICE_CONFIRMED_REINITIALIZE_DEVICE: - Confirmed_Reinitialize_Device_SimpleACK_Handler = pFunction; - break; // Virtual Terminal Services case SERVICE_CONFIRMED_VT_CLOSE: - Confirmed_VT_Close_SimpleACK_Handler = pFunction; - break; // Security Services case SERVICE_CONFIRMED_REQUEST_KEY: - Confirmed_Request_Key_SimpleACK_Handler = pFunction; + Confirmed_SimpleACK_Function[service_choice] = pFunction; break; default: break; } } +#endif -// Confirmed Function Handlers +// Confirmed Complex Ack Function Handlers // The services that require a simple ACK are not listed here +// FIXME: The array doesn't need to be this big, but is +// simpler to handle if it is. +// We might be able to combine simple ack and complex ack +// functions and only use a single array. static confirmed_ack_function - Confirmed_Get_Alarm_Summary_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_Get_Enrollment_Summary_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_Get_Event_Information_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_Atomic_Read_File_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_Atomic_Write_File_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_Create_Object_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_Read_Property_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_Read_Property_Conditional_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_Read_Property_Multiple_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_Read_Range_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_Private_Transfer_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_VT_Open_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_VT_Data_Ack_Handler = NULL; -static confirmed_ack_function - Confirmed_Authenticate_Ack_Handler = NULL; +Confirmed_ACK_Function[MAX_BACNET_CONFIRMED_SERVICE] = +{ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; +#if 1 +// If we don't care which functions actually get set... +void apdu_set_confirmed_ack_handler( + BACNET_CONFIRMED_SERVICE service_choice, + confirmed_ack_function pFunction) +{ + if (service_choice < MAX_BACNET_CONFIRMED_SERVICE) + Confirmed_ACK_Function[service_choice] = pFunction; +} +#else +// If we care which functions actually get set... void apdu_set_confirmed_ack_handler( BACNET_CONFIRMED_SERVICE service_choice, confirmed_ack_function pFunction) @@ -369,56 +167,31 @@ void apdu_set_confirmed_ack_handler( switch (service_choice) { case SERVICE_CONFIRMED_GET_ALARM_SUMMARY: - Confirmed_Get_Alarm_Summary_Ack_Handler = pFunction; - break; case SERVICE_CONFIRMED_GET_ENROLLMENT_SUMMARY: - Confirmed_Get_Enrollment_Summary_Ack_Handler = pFunction; - break; case SERVICE_CONFIRMED_GET_EVENT_INFORMATION: - Confirmed_Get_Event_Information_Ack_Handler = pFunction; - break; // File Access Services case SERVICE_CONFIRMED_ATOMIC_READ_FILE: - Confirmed_Atomic_Read_File_Ack_Handler = pFunction; - break; case SERVICE_CONFIRMED_ATOMIC_WRITE_FILE: - Confirmed_Atomic_Write_File_Ack_Handler = pFunction; - break; // Object Access Services case SERVICE_CONFIRMED_CREATE_OBJECT: - Confirmed_Create_Object_Ack_Handler = pFunction; - break; case SERVICE_CONFIRMED_READ_PROPERTY: - Confirmed_Read_Property_Ack_Handler = pFunction; - break; case SERVICE_CONFIRMED_READ_PROPERTY_CONDITIONAL: - Confirmed_Read_Property_Conditional_Ack_Handler = pFunction; - break; case SERVICE_CONFIRMED_READ_PROPERTY_MULTIPLE: - Confirmed_Read_Property_Multiple_Ack_Handler = pFunction; - break; case SERVICE_CONFIRMED_READ_RANGE: - Confirmed_Read_Range_Ack_Handler = pFunction; - break; // Remote Device Management Services case SERVICE_CONFIRMED_PRIVATE_TRANSFER: - Confirmed_Private_Transfer_Ack_Handler = pFunction; - break; // Virtual Terminal Services case SERVICE_CONFIRMED_VT_OPEN: - Confirmed_VT_Open_Ack_Handler = pFunction; - break; case SERVICE_CONFIRMED_VT_DATA: - Confirmed_VT_Data_Ack_Handler = pFunction; - break; // Security Services case SERVICE_CONFIRMED_AUTHENTICATE: - Confirmed_Authenticate_Ack_Handler = pFunction; + Confirmed_ACK_Function[service_choice] = pFunction; break; default: break; } } +#endif void apdu_handler( BACNET_ADDRESS *src, // source address @@ -455,335 +228,31 @@ void apdu_handler( service_choice = apdu[len++]; service_request = &apdu[len++]; service_request_len = apdu_len - len; - switch (service_choice) + if (service_choice < MAX_BACNET_CONFIRMED_SERVICE) { - case SERVICE_CONFIRMED_ACKNOWLEDGE_ALARM: - if (Confirmed_Acknowledge_Alarm_Handler) - Confirmed_Acknowledge_Alarm_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_COV_NOTIFICATION: - if (Confirmed_COV_Notification_Handler) - Confirmed_COV_Notification_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_EVENT_NOTIFICATION: - if (Confirmed_Event_Notification_Handler) - Confirmed_Event_Notification_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_GET_ALARM_SUMMARY: - if (Confirmed_Get_Alarm_Summary_Handler) - Confirmed_Get_Alarm_Summary_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_GET_ENROLLMENT_SUMMARY: - if (Confirmed_Get_Enrollment_Summary_Handler) - Confirmed_Get_Enrollment_Summary_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_GET_EVENT_INFORMATION: - if (Confirmed_Get_Event_Information_Handler) - Confirmed_Get_Event_Information_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_SUBSCRIBE_COV: - if (Confirmed_Subscribe_COV_Handler) - Confirmed_Subscribe_COV_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY: - if (Confirmed_Subscribe_COV_Property_Handler) - Confirmed_Subscribe_COV_Property_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_LIFE_SAFETY_OPERATION: - if (Confirmed_Life_Safety_Operation_Handler) - Confirmed_Life_Safety_Operation_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - // File Access Services - case SERVICE_CONFIRMED_ATOMIC_READ_FILE: - if (Confirmed_Atomic_Read_File_Handler) - Confirmed_Atomic_Read_File_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_ATOMIC_WRITE_FILE: - if (Confirmed_Atomic_Write_File_Handler) - Confirmed_Atomic_Write_File_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - // Object Access Services - case SERVICE_CONFIRMED_ADD_LIST_ELEMENT: - if (Confirmed_Add_List_Element_Handler) - Confirmed_Add_List_Element_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_REMOVE_LIST_ELEMENT: - if (Confirmed_Remove_List_Element_Handler) - Confirmed_Remove_List_Element_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_CREATE_OBJECT: - if (Confirmed_Create_Object_Handler) - Confirmed_Create_Object_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_DELETE_OBJECT: - if (Confirmed_Delete_Object_Handler) - Confirmed_Delete_Object_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_READ_PROPERTY: - if (Confirmed_Read_Property_Handler) - Confirmed_Read_Property_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_READ_PROPERTY_CONDITIONAL: - if (Confirmed_Read_Property_Conditional_Handler) - Confirmed_Read_Property_Conditional_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_READ_PROPERTY_MULTIPLE: - if (Confirmed_Read_Property_Multiple_Handler) - Confirmed_Read_Property_Multiple_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_READ_RANGE: - if (Confirmed_Read_Range_Handler) - Confirmed_Read_Range_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_WRITE_PROPERTY: - if (Confirmed_Write_Property_Handler) - Confirmed_Write_Property_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_WRITE_PROPERTY_MULTIPLE: - if (Confirmed_Write_Property_Multiple_Handler) - Confirmed_Write_Property_Multiple_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - // Remote Device Management Services - case SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL: - if (Confirmed_Device_Communication_Control_Handler) - Confirmed_Device_Communication_Control_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_PRIVATE_TRANSFER: - if (Confirmed_Private_Transfer_Handler) - Confirmed_Private_Transfer_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_TEXT_MESSAGE: - if (Confirmed_Text_Message_Handler) - Confirmed_Text_Message_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_REINITIALIZE_DEVICE: - if (Confirmed_Reinitialize_Device_Handler) - Confirmed_Reinitialize_Device_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - // Virtual Terminal Services - case SERVICE_CONFIRMED_VT_OPEN: - if (Confirmed_VT_Open_Handler) - Confirmed_VT_Open_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_VT_CLOSE: - if (Confirmed_VT_Close_Handler) - Confirmed_VT_Close_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_VT_DATA: - if (Confirmed_VT_Data_Handler) - Confirmed_VT_Data_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - // Security Services - case SERVICE_CONFIRMED_AUTHENTICATE: - if (Confirmed_Authenticate_Handler) - Confirmed_Authenticate_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - case SERVICE_CONFIRMED_REQUEST_KEY: - if (Confirmed_Request_Key_Handler) - Confirmed_Request_Key_Handler( - service_request, - service_request_len, - src, - &service_data); - break; - default: - break; + if (Confirmed_Function[service_choice]) + Confirmed_Function[service_choice]( + service_request, + service_request_len, + src, + &service_data); + else + { + //FIXME: send a reject message + } } break; case PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST: service_choice = apdu[1]; service_request = &apdu[2]; service_request_len = apdu_len - 2; - switch (service_choice) + if (service_choice < MAX_BACNET_UNCONFIRMED_SERVICE) { - case SERVICE_UNCONFIRMED_I_AM: - if (Unconfirmed_I_Am_Handler) - Unconfirmed_I_Am_Handler( + if (Unconfirmed_Function[service_choice]) + Unconfirmed_Function[service_choice]( service_request, service_request_len, src); - break; - case SERVICE_UNCONFIRMED_WHO_IS: - if (Unconfirmed_Who_Is_Handler) - Unconfirmed_Who_Is_Handler( - service_request, - service_request_len, - src); - break; - case SERVICE_UNCONFIRMED_COV_NOTIFICATION: - if (Unconfirmed_COV_Notification_Handler) - Unconfirmed_COV_Notification_Handler( - service_request, - service_request_len, - src); - break; - case SERVICE_UNCONFIRMED_I_HAVE: - if (Unconfirmed_I_Have_Handler) - Unconfirmed_I_Have_Handler( - service_request, - service_request_len, - src); - break; - case SERVICE_UNCONFIRMED_EVENT_NOTIFICATION: - if (Unconfirmed_Event_Notification_Handler) - Unconfirmed_Event_Notification_Handler( - service_request, - service_request_len, - src); - break; - case SERVICE_UNCONFIRMED_PRIVATE_TRANSFER: - if (Unconfirmed_Private_Transfer_Handler) - Unconfirmed_Private_Transfer_Handler( - service_request, - service_request_len, - src); - break; - case SERVICE_UNCONFIRMED_TEXT_MESSAGE: - if (Unconfirmed_Text_Message_Handler) - Unconfirmed_Text_Message_Handler( - service_request, - service_request_len, - src); - break; - case SERVICE_UNCONFIRMED_TIME_SYNCHRONIZATION: - if (Unconfirmed_Time_Synchronization_Handler) - Unconfirmed_Time_Synchronization_Handler( - service_request, - service_request_len, - src); - break; - case SERVICE_UNCONFIRMED_WHO_HAS: - if (Unconfirmed_Who_Has_Handler) - Unconfirmed_Who_Has_Handler( - service_request, - service_request_len, - src); - break; - case SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION: - if (Unconfirmed_UTC_Time_Synchronization_Handler) - Unconfirmed_UTC_Time_Synchronization_Handler( - service_request, - service_request_len, - src); - break; - default: - break; } break; case PDU_TYPE_SIMPLE_ACK: @@ -792,8 +261,27 @@ void apdu_handler( switch (service_choice) { case SERVICE_CONFIRMED_ACKNOWLEDGE_ALARM: - if (Confirmed_Acknowledge_Alarm_SimpleACK_Handler) - Confirmed_Acknowledge_Alarm_SimpleACK_Handler( + case SERVICE_CONFIRMED_COV_NOTIFICATION: + case SERVICE_CONFIRMED_EVENT_NOTIFICATION: + case SERVICE_CONFIRMED_SUBSCRIBE_COV: + case SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY: + case SERVICE_CONFIRMED_LIFE_SAFETY_OPERATION: + // Object Access Services + case SERVICE_CONFIRMED_ADD_LIST_ELEMENT: + case SERVICE_CONFIRMED_REMOVE_LIST_ELEMENT: + case SERVICE_CONFIRMED_DELETE_OBJECT: + case SERVICE_CONFIRMED_WRITE_PROPERTY: + case SERVICE_CONFIRMED_WRITE_PROPERTY_MULTIPLE: + // Remote Device Management Services + case SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL: + case SERVICE_CONFIRMED_REINITIALIZE_DEVICE: + case SERVICE_CONFIRMED_TEXT_MESSAGE: + // Virtual Terminal Services + case SERVICE_CONFIRMED_VT_CLOSE: + // Security Services + case SERVICE_CONFIRMED_REQUEST_KEY: + if (Confirmed_SimpleACK_Function[service_choice]) + Confirmed_SimpleACK_Function[service_choice]( src, invoke_id); else @@ -801,100 +289,6 @@ void apdu_handler( //FIXME: release the invoke id } break; - case SERVICE_CONFIRMED_COV_NOTIFICATION: - if (Confirmed_COV_Notification_SimpleACK_Handler) - Confirmed_COV_Notification_SimpleACK_Handler( - src, - invoke_id); - break; - case SERVICE_CONFIRMED_EVENT_NOTIFICATION: - if (Confirmed_Event_Notification_SimpleACK_Handler) - Confirmed_Event_Notification_SimpleACK_Handler( - src, - invoke_id); - break; - case SERVICE_CONFIRMED_SUBSCRIBE_COV: - if (Confirmed_Subscribe_COV_SimpleACK_Handler) - Confirmed_Subscribe_COV_SimpleACK_Handler( - src, - invoke_id); - break; - case SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY: - if (Confirmed_Subscribe_COV_Property_SimpleACK_Handler) - Confirmed_Subscribe_COV_Property_SimpleACK_Handler( - src, - invoke_id); - break; - case SERVICE_CONFIRMED_LIFE_SAFETY_OPERATION: - if (Confirmed_Life_Safety_Operation_SimpleACK_Handler) - Confirmed_Life_Safety_Operation_SimpleACK_Handler( - src, - invoke_id); - break; - // Object Access Services - case SERVICE_CONFIRMED_ADD_LIST_ELEMENT: - if (Confirmed_Add_List_Element_SimpleACK_Handler) - Confirmed_Add_List_Element_SimpleACK_Handler( - src, - invoke_id); - break; - case SERVICE_CONFIRMED_REMOVE_LIST_ELEMENT: - if (Confirmed_Remove_List_Element_SimpleACK_Handler) - Confirmed_Remove_List_Element_SimpleACK_Handler( - src, - invoke_id); - break; - case SERVICE_CONFIRMED_DELETE_OBJECT: - if (Confirmed_Delete_Object_SimpleACK_Handler) - Confirmed_Delete_Object_SimpleACK_Handler( - src, - invoke_id); - break; - case SERVICE_CONFIRMED_WRITE_PROPERTY: - if (Confirmed_Write_Property_SimpleACK_Handler) - Confirmed_Write_Property_SimpleACK_Handler( - src, - invoke_id); - break; - case SERVICE_CONFIRMED_WRITE_PROPERTY_MULTIPLE: - if (Confirmed_Write_Property_Multiple_SimpleACK_Handler) - Confirmed_Write_Property_Multiple_SimpleACK_Handler( - src, - invoke_id); - break; - // Remote Device Management Services - case SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL: - if (Confirmed_Device_Communication_Control_SimpleACK_Handler) - Confirmed_Device_Communication_Control_SimpleACK_Handler( - src, - invoke_id); - break; - case SERVICE_CONFIRMED_REINITIALIZE_DEVICE: - if (Confirmed_Reinitialize_Device_SimpleACK_Handler) - Confirmed_Reinitialize_Device_SimpleACK_Handler( - src, - invoke_id); - break; - case SERVICE_CONFIRMED_TEXT_MESSAGE: - if (Confirmed_Text_Message_SimpleACK_Handler) - Confirmed_Text_Message_SimpleACK_Handler( - src, - invoke_id); - break; - // Virtual Terminal Services - case SERVICE_CONFIRMED_VT_CLOSE: - if (Confirmed_VT_Close_SimpleACK_Handler) - Confirmed_VT_Close_SimpleACK_Handler( - src, - invoke_id); - break; - // Security Services - case SERVICE_CONFIRMED_REQUEST_KEY: - if (Confirmed_Request_Key_SimpleACK_Handler) - Confirmed_Request_Key_SimpleACK_Handler( - src, - invoke_id); - break; default: break; } @@ -917,120 +311,33 @@ void apdu_handler( switch (service_choice) { case SERVICE_CONFIRMED_GET_ALARM_SUMMARY: - if (Confirmed_Get_Alarm_Summary_Ack_Handler) - Confirmed_Get_Alarm_Summary_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; case SERVICE_CONFIRMED_GET_ENROLLMENT_SUMMARY: - if (Confirmed_Get_Enrollment_Summary_Ack_Handler) - Confirmed_Get_Enrollment_Summary_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; case SERVICE_CONFIRMED_GET_EVENT_INFORMATION: - if (Confirmed_Get_Event_Information_Ack_Handler) - Confirmed_Get_Event_Information_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; // File Access Services case SERVICE_CONFIRMED_ATOMIC_READ_FILE: - if (Confirmed_Atomic_Read_File_Ack_Handler) - Confirmed_Atomic_Read_File_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; case SERVICE_CONFIRMED_ATOMIC_WRITE_FILE: - if (Confirmed_Atomic_Write_File_Ack_Handler) - Confirmed_Atomic_Write_File_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; // Object Access Services case SERVICE_CONFIRMED_CREATE_OBJECT: - if (Confirmed_Create_Object_Ack_Handler) - Confirmed_Create_Object_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; case SERVICE_CONFIRMED_READ_PROPERTY: - if (Confirmed_Read_Property_Ack_Handler) - Confirmed_Read_Property_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; case SERVICE_CONFIRMED_READ_PROPERTY_CONDITIONAL: - if (Confirmed_Read_Property_Conditional_Ack_Handler) - Confirmed_Read_Property_Conditional_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; case SERVICE_CONFIRMED_READ_PROPERTY_MULTIPLE: - if (Confirmed_Read_Property_Multiple_Ack_Handler) - Confirmed_Read_Property_Multiple_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; case SERVICE_CONFIRMED_READ_RANGE: - if (Confirmed_Read_Range_Ack_Handler) - Confirmed_Read_Range_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; case SERVICE_CONFIRMED_PRIVATE_TRANSFER: - if (Confirmed_Private_Transfer_Ack_Handler) - Confirmed_Private_Transfer_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; // Virtual Terminal Services case SERVICE_CONFIRMED_VT_OPEN: - if (Confirmed_VT_Open_Ack_Handler) - Confirmed_VT_Open_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; case SERVICE_CONFIRMED_VT_DATA: - if (Confirmed_VT_Data_Ack_Handler) - Confirmed_VT_Data_Ack_Handler( - service_request, - service_request_len, - src, - &service_ack_data); - break; // Security Services case SERVICE_CONFIRMED_AUTHENTICATE: - if (Confirmed_Authenticate_Ack_Handler) - Confirmed_Authenticate_Ack_Handler( + if (Confirmed_ACK_Function[service_choice]) + Confirmed_ACK_Function[service_choice]( service_request, service_request_len, src, &service_ack_data); + else + { + //FIXME: release the invoke id + } break; default: break;