Indented with standard indent rules.
This commit is contained in:
@@ -273,8 +273,7 @@ int main(int argc, char *argv[]) {
|
|||||||
Init_DataLink();
|
Init_DataLink();
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
timeout_seconds =
|
timeout_seconds = (apdu_timeout() / 1000) * apdu_retries();
|
||||||
(apdu_timeout() / 1000) * apdu_retries();
|
|
||||||
/* try to bind with the device */
|
/* try to bind with the device */
|
||||||
Send_WhoIs(Target_Device_Object_Instance, Target_Device_Object_Instance);
|
Send_WhoIs(Target_Device_Object_Instance, Target_Device_Object_Instance);
|
||||||
/* loop forever */
|
/* loop forever */
|
||||||
|
|||||||
@@ -431,8 +431,7 @@ int main(int argc, char *argv[]) {
|
|||||||
Init_DataLink();
|
Init_DataLink();
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
timeout_seconds =
|
timeout_seconds = (apdu_timeout() / 1000) * apdu_retries();
|
||||||
(apdu_timeout() / 1000) * apdu_retries();
|
|
||||||
/* try to bind with the device */
|
/* try to bind with the device */
|
||||||
found =
|
found =
|
||||||
address_bind_request(Target_Device_Object_Instance, &max_apdu,
|
address_bind_request(Target_Device_Object_Instance, &max_apdu,
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ static void npdu_encode_npdu_network(
|
|||||||
if (npdu_data) {
|
if (npdu_data) {
|
||||||
npdu_data->data_expecting_reply = false;
|
npdu_data->data_expecting_reply = false;
|
||||||
npdu_data->protocol_version = BACNET_PROTOCOL_VERSION;
|
npdu_data->protocol_version = BACNET_PROTOCOL_VERSION;
|
||||||
npdu_data->network_layer_message = true; /* false if APDU */
|
npdu_data->network_layer_message = true; /* false if APDU */
|
||||||
npdu_data->network_message_type = network_message_type; /* optional */
|
npdu_data->network_message_type = network_message_type; /* optional */
|
||||||
npdu_data->vendor_id = 0; /* optional, if net message type is > 0x80 */
|
npdu_data->vendor_id = 0; /* optional, if net message type is > 0x80 */
|
||||||
npdu_data->priority = priority;
|
npdu_data->priority = priority;
|
||||||
npdu_data->hop_count = 255;
|
npdu_data->hop_count = 255;
|
||||||
@@ -59,7 +59,7 @@ static void npdu_encode_npdu_network(
|
|||||||
|
|
||||||
/* find a specific router, or use -1 for limit if you want unlimited */
|
/* find a specific router, or use -1 for limit if you want unlimited */
|
||||||
void Send_Who_Is_Router_To_Network(
|
void Send_Who_Is_Router_To_Network(
|
||||||
BACNET_ADDRESS *dst,
|
BACNET_ADDRESS * dst,
|
||||||
int dnet)
|
int dnet)
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
@@ -68,8 +68,7 @@ void Send_Who_Is_Router_To_Network(
|
|||||||
BACNET_NPDU_DATA npdu_data;
|
BACNET_NPDU_DATA npdu_data;
|
||||||
|
|
||||||
npdu_encode_npdu_network(&npdu_data,
|
npdu_encode_npdu_network(&npdu_data,
|
||||||
NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK,
|
NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK, MESSAGE_PRIORITY_NORMAL);
|
||||||
MESSAGE_PRIORITY_NORMAL);
|
|
||||||
/* fixme: should dnet/dlen/dadr be set in NPDU? */
|
/* fixme: should dnet/dlen/dadr be set in NPDU? */
|
||||||
pdu_len =
|
pdu_len =
|
||||||
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
||||||
@@ -78,7 +77,7 @@ void Send_Who_Is_Router_To_Network(
|
|||||||
len = encode_unsigned16(&Handler_Transmit_Buffer[pdu_len], dnet);
|
len = encode_unsigned16(&Handler_Transmit_Buffer[pdu_len], dnet);
|
||||||
pdu_len += len;
|
pdu_len += len;
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
fprintf(stderr, "Send Who-Is-Router-To-Network message to %u\n",dnet);
|
fprintf(stderr, "Send Who-Is-Router-To-Network message to %u\n", dnet);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
@@ -90,7 +89,8 @@ void Send_Who_Is_Router_To_Network(
|
|||||||
pdu_len);
|
pdu_len);
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
if (bytes_sent <= 0)
|
if (bytes_sent <= 0)
|
||||||
fprintf(stderr, "Failed to Send Who-Is-Router-To-Network Request (%s)!\n",
|
fprintf(stderr,
|
||||||
|
"Failed to Send Who-Is-Router-To-Network Request (%s)!\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -98,7 +98,7 @@ void Send_Who_Is_Router_To_Network(
|
|||||||
/* pDNET_list: list of networks for which I am a router,
|
/* pDNET_list: list of networks for which I am a router,
|
||||||
terminated with -1 */
|
terminated with -1 */
|
||||||
void Send_I_Am_Router_To_Network(
|
void Send_I_Am_Router_To_Network(
|
||||||
const int DNET_list[])
|
const int DNET_list[])
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
int pdu_len = 0;
|
int pdu_len = 0;
|
||||||
@@ -109,8 +109,7 @@ void Send_I_Am_Router_To_Network(
|
|||||||
unsigned index = 0;
|
unsigned index = 0;
|
||||||
|
|
||||||
npdu_encode_npdu_network(&npdu_data,
|
npdu_encode_npdu_network(&npdu_data,
|
||||||
NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK,
|
NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK, MESSAGE_PRIORITY_NORMAL);
|
||||||
MESSAGE_PRIORITY_NORMAL);
|
|
||||||
pdu_len =
|
pdu_len =
|
||||||
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
||||||
/* encode the optional DNET list portion of the packet */
|
/* encode the optional DNET list portion of the packet */
|
||||||
@@ -123,7 +122,7 @@ void Send_I_Am_Router_To_Network(
|
|||||||
pdu_len += len;
|
pdu_len += len;
|
||||||
index++;
|
index++;
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
fprintf(stderr, "%u\n",dnet);
|
fprintf(stderr, "%u\n", dnet);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/* I-Am-Router-To-Network shall always be transmitted with
|
/* I-Am-Router-To-Network shall always be transmitted with
|
||||||
@@ -134,15 +133,16 @@ void Send_I_Am_Router_To_Network(
|
|||||||
pdu_len);
|
pdu_len);
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
if (bytes_sent <= 0)
|
if (bytes_sent <= 0)
|
||||||
fprintf(stderr, "Failed to send I-Am-Router-To-Network message (%s)!\n",
|
fprintf(stderr,
|
||||||
|
"Failed to send I-Am-Router-To-Network message (%s)!\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
void Send_Initialize_Routing_Table(
|
void Send_Initialize_Routing_Table(
|
||||||
BACNET_ADDRESS *dst,
|
BACNET_ADDRESS * dst,
|
||||||
BACNET_ROUTER_PORT *router_port_list)
|
BACNET_ROUTER_PORT * router_port_list)
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
int pdu_len = 0;
|
int pdu_len = 0;
|
||||||
@@ -150,10 +150,9 @@ void Send_Initialize_Routing_Table(
|
|||||||
BACNET_NPDU_DATA npdu_data;
|
BACNET_NPDU_DATA npdu_data;
|
||||||
uint8_t number_of_ports = 0;
|
uint8_t number_of_ports = 0;
|
||||||
BACNET_ROUTER_PORT *router_port;
|
BACNET_ROUTER_PORT *router_port;
|
||||||
unsigned i = 0; /* counter */
|
unsigned i = 0; /* counter */
|
||||||
|
|
||||||
npdu_encode_npdu_network(&npdu_data,
|
npdu_encode_npdu_network(&npdu_data, NETWORK_MESSAGE_INIT_RT_TABLE,
|
||||||
NETWORK_MESSAGE_INIT_RT_TABLE,
|
|
||||||
MESSAGE_PRIORITY_NORMAL);
|
MESSAGE_PRIORITY_NORMAL);
|
||||||
pdu_len =
|
pdu_len =
|
||||||
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
||||||
@@ -167,8 +166,8 @@ void Send_Initialize_Routing_Table(
|
|||||||
if (number_of_ports) {
|
if (number_of_ports) {
|
||||||
router_port = router_port_list;
|
router_port = router_port_list;
|
||||||
while (router_port) {
|
while (router_port) {
|
||||||
len = encode_unsigned16(
|
len =
|
||||||
&Handler_Transmit_Buffer[pdu_len],
|
encode_unsigned16(&Handler_Transmit_Buffer[pdu_len],
|
||||||
router_port->dnet);
|
router_port->dnet);
|
||||||
pdu_len += len;
|
pdu_len += len;
|
||||||
Handler_Transmit_Buffer[pdu_len++] = router_port->id;
|
Handler_Transmit_Buffer[pdu_len++] = router_port->id;
|
||||||
@@ -180,29 +179,29 @@ void Send_Initialize_Routing_Table(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
fprintf(stderr, "Send Initialize-Routing-Table message\n");
|
fprintf(stderr, "Send Initialize-Routing-Table message\n");
|
||||||
#endif
|
#endif
|
||||||
bytes_sent =
|
bytes_sent =
|
||||||
datalink_send_pdu(dst, &npdu_data, &Handler_Transmit_Buffer[0],
|
datalink_send_pdu(dst, &npdu_data, &Handler_Transmit_Buffer[0],
|
||||||
pdu_len);
|
pdu_len);
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
if (bytes_sent <= 0)
|
if (bytes_sent <= 0)
|
||||||
fprintf(stderr, "Failed to send Initialize-Routing-Table message (%s)!\n",
|
fprintf(stderr,
|
||||||
|
"Failed to send Initialize-Routing-Table message (%s)!\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
void Send_Initialize_Routing_Table_Ack(
|
void Send_Initialize_Routing_Table_Ack(
|
||||||
BACNET_ROUTER_PORT *router_port_list)
|
BACNET_ROUTER_PORT * router_port_list)
|
||||||
{
|
{
|
||||||
int pdu_len = 0;
|
int pdu_len = 0;
|
||||||
BACNET_ADDRESS dest;
|
BACNET_ADDRESS dest;
|
||||||
int bytes_sent = 0;
|
int bytes_sent = 0;
|
||||||
BACNET_NPDU_DATA npdu_data;
|
BACNET_NPDU_DATA npdu_data;
|
||||||
|
|
||||||
npdu_encode_npdu_network(&npdu_data,
|
npdu_encode_npdu_network(&npdu_data, NETWORK_MESSAGE_INIT_RT_TABLE_ACK,
|
||||||
NETWORK_MESSAGE_INIT_RT_TABLE_ACK,
|
|
||||||
MESSAGE_PRIORITY_NORMAL);
|
MESSAGE_PRIORITY_NORMAL);
|
||||||
pdu_len =
|
pdu_len =
|
||||||
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
||||||
@@ -213,7 +212,8 @@ void Send_Initialize_Routing_Table_Ack(
|
|||||||
pdu_len);
|
pdu_len);
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
if (bytes_sent <= 0)
|
if (bytes_sent <= 0)
|
||||||
fprintf(stderr, "Failed to Send Initialize-Routing-Table-Ack message (%s)!\n",
|
fprintf(stderr,
|
||||||
|
"Failed to Send Initialize-Routing-Table-Ack message (%s)!\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,42 +191,41 @@ static void Init_DataLink(
|
|||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
unsigned arg_count = 0;
|
unsigned arg_count = 0;
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
printf("Usage: %s DNET [DNET] [DNET] [...]\r\n",
|
printf("Usage: %s DNET [DNET] [DNET] [...]\r\n",
|
||||||
filename_remove_path(argv[0]));
|
filename_remove_path(argv[0]));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) {
|
if ((
|
||||||
|
argc > 1) && (
|
||||||
|
strcmp(argv[1],
|
||||||
|
"--help") == 0)) {
|
||||||
printf("Send BACnet I-Am-Router-To-Network message for \r\n"
|
printf("Send BACnet I-Am-Router-To-Network message for \r\n"
|
||||||
"one or more networks.\r\n"
|
"one or more networks.\r\n" "\r\nDNET:\r\n"
|
||||||
"\r\nDNET:\r\n"
|
|
||||||
"BACnet destination network number 0-65534\r\n"
|
"BACnet destination network number 0-65534\r\n"
|
||||||
"To send a I-Am-Router-To-Network message for DNET 86:\r\n"
|
"To send a I-Am-Router-To-Network message for DNET 86:\r\n"
|
||||||
"%s 86\r\n"
|
"%s 86\r\n"
|
||||||
"To send a I-Am-Router-To-Network message for multiple DNETs\r\n"
|
"To send a I-Am-Router-To-Network message for multiple DNETs\r\n"
|
||||||
"use the following command:\r\n"
|
"use the following command:\r\n" "%s 86 42 24 14\r\n",
|
||||||
"%s 86 42 24 14\r\n",
|
filename_remove_path(argv[0]), filename_remove_path(argv[0]));
|
||||||
filename_remove_path(argv[0]),
|
|
||||||
filename_remove_path(argv[0]));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* decode the command line parameters */
|
/* decode the command line parameters */
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
for (arg_count = 1; arg_count < argc; arg_count++) {
|
for (arg_count = 1; arg_count < argc; arg_count++) {
|
||||||
if (arg_count > MAX_ROUTER_DNETS) {
|
if (arg_count > MAX_ROUTER_DNETS) {
|
||||||
fprintf(stderr,
|
fprintf(stderr, "Limited to %u DNETS. Sorry!\r\n",
|
||||||
"Limited to %u DNETS. Sorry!\r\n",
|
|
||||||
MAX_ROUTER_DNETS);
|
MAX_ROUTER_DNETS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Target_Router_Networks[arg_count-1] = strtol(argv[arg_count], NULL, 0);
|
Target_Router_Networks[arg_count - 1] =
|
||||||
|
strtol(argv[arg_count], NULL, 0);
|
||||||
/* mark the end of list */
|
/* mark the end of list */
|
||||||
Target_Router_Networks[arg_count] = -1;
|
Target_Router_Networks[arg_count] = -1;
|
||||||
/* invalid DNET? */
|
/* invalid DNET? */
|
||||||
if (Target_Router_Networks[arg_count-1] >= 65535) {
|
if (Target_Router_Networks[arg_count - 1] >= 65535) {
|
||||||
fprintf(stderr,
|
fprintf(stderr, "DNET=%u - it must be less than %u\r\n",
|
||||||
"DNET=%u - it must be less than %u\r\n",
|
Target_Router_Networks[arg_count - 1], 65535);
|
||||||
Target_Router_Networks[arg_count-1], 65535);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
|
|
||||||
/* buffer used for receive */
|
/* buffer used for receive */
|
||||||
static uint8_t Rx_Buf[MAX_MPDU] = { 0 };
|
static uint8_t Rx_Buf[MAX_MPDU] = { 0 };
|
||||||
|
|
||||||
/* target address */
|
/* target address */
|
||||||
static BACNET_ADDRESS Target_Router_Address;
|
static BACNET_ADDRESS Target_Router_Address;
|
||||||
static BACNET_ROUTER_PORT *Target_Router_Port_List;
|
static BACNET_ROUTER_PORT *Target_Router_Port_List;
|
||||||
@@ -187,27 +188,27 @@ static void Init_DataLink(
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void address_parse(BACNET_ADDRESS *dst, int argc, char *argv[])
|
static void address_parse(BACNET_ADDRESS * dst,
|
||||||
{
|
int argc, char *argv[]) {
|
||||||
unsigned mac[6];
|
unsigned mac[6];
|
||||||
unsigned port;
|
unsigned port;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
|
||||||
if (argc > 0) {
|
if (argc > 0) {
|
||||||
count =
|
count =
|
||||||
sscanf(argv[0], "%u.%u.%u.%u:%u", &mac[0],
|
sscanf(argv[0], "%u.%u.%u.%u:%u", &mac[0], &mac[1], &mac[2],
|
||||||
&mac[1], &mac[2], &mac[3], &port);
|
&mac[3], &port);
|
||||||
if (count == 5) {
|
if (count == 5) {
|
||||||
dst->mac_len = 6;
|
dst->mac_len = 6;
|
||||||
for (index = 0; index < 4; index++) {
|
for (index = 0; index < 4; index++) {
|
||||||
dst->mac[index] = mac[index];
|
dst->mac[index] = mac[index];
|
||||||
}
|
} encode_unsigned16(&dst->mac[4],
|
||||||
encode_unsigned16(&dst->mac[4], port);
|
port);
|
||||||
} else {
|
} else {
|
||||||
count =
|
count =
|
||||||
sscanf(argv[0], "%x:%x:%x:%x:%x:%x", &mac[0],
|
sscanf(argv[0], "%x:%x:%x:%x:%x:%x", &mac[0], &mac[1], &mac[2],
|
||||||
&mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
|
&mac[3], &mac[4], &mac[5]);
|
||||||
dst->mac_len = count;
|
dst->mac_len = count;
|
||||||
for (index = 0; index < MAX_MAC_LEN; index++) {
|
for (index = 0; index < MAX_MAC_LEN; index++) {
|
||||||
if (index < count) {
|
if (index < count) {
|
||||||
@@ -232,29 +233,30 @@ int main(int argc, char *argv[]) {
|
|||||||
filename_remove_path(argv[0]));
|
filename_remove_path(argv[0]));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) {
|
if ((
|
||||||
|
argc > 1) && (
|
||||||
|
strcmp(argv[1],
|
||||||
|
"--help") == 0)) {
|
||||||
printf("Send BACnet Initialize-Routing-Table message to a network\r\n"
|
printf("Send BACnet Initialize-Routing-Table message to a network\r\n"
|
||||||
"and wait for responses. Displays their network information.\r\n"
|
"and wait for responses. Displays their network information.\r\n"
|
||||||
"\r\n"
|
"\r\n" "address:\r\n"
|
||||||
"address:\r\n"
|
|
||||||
"MAC address in xx:xx:xx:xx:xx:xx format or IP x.x.x.x:port\r\n"
|
"MAC address in xx:xx:xx:xx:xx:xx format or IP x.x.x.x:port\r\n"
|
||||||
"number-of-ports:\r\n"
|
"number-of-ports:\r\n"
|
||||||
"Number of ports to update along with port-info data\r\n"
|
"Number of ports to update along with port-info data\r\n"
|
||||||
"To query the complete routing table, use 0.\r\n"
|
"To query the complete routing table, use 0.\r\n"
|
||||||
"To query using Initialize-Routing-Table message to 192.168.0.18:\r\n"
|
"To query using Initialize-Routing-Table message to 192.168.0.18:\r\n"
|
||||||
"%s 192.168.0.18:47808 0\r\n",
|
"%s 192.168.0.18:47808 0\r\n", filename_remove_path(argv[0]));
|
||||||
filename_remove_path(argv[0]));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* decode the command line parameters */
|
/* decode the command line parameters */
|
||||||
address_parse(&Target_Router_Address, argc-1, &argv[1]);
|
address_parse(&Target_Router_Address, argc - 1, &argv[1]);
|
||||||
if (argc > 2) {
|
if (argc > 2) {
|
||||||
/* FIXME: add port info parse */
|
/* FIXME: add port info parse */
|
||||||
/* BACNET_ROUTER_PORT *router_port_list
|
/* BACNET_ROUTER_PORT *router_port_list
|
||||||
Target_Router_Port_List
|
Target_Router_Port_List
|
||||||
ports_parse(&router_port[0], argc-2, &argv[2]);
|
ports_parse(&router_port[0], argc-2, &argv[2]);
|
||||||
Target_Router_Port_List = router_port[0];
|
Target_Router_Port_List = router_port[0];
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
/* setup my info */
|
/* setup my info */
|
||||||
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
|
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
|
||||||
@@ -262,8 +264,7 @@ int main(int argc, char *argv[]) {
|
|||||||
address_init();
|
address_init();
|
||||||
Init_DataLink();
|
Init_DataLink();
|
||||||
/* send the request */
|
/* send the request */
|
||||||
Send_Initialize_Routing_Table(
|
Send_Initialize_Routing_Table(&Target_Router_Address,
|
||||||
&Target_Router_Address,
|
|
||||||
Target_Router_Port_List);
|
Target_Router_Port_List);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -806,8 +806,7 @@ int Device_Encode_Property_APDU(
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_MAX_APDU_LENGTH_ACCEPTED:
|
case PROP_MAX_APDU_LENGTH_ACCEPTED:
|
||||||
apdu_len =
|
apdu_len = encode_application_unsigned(&apdu[0], MAX_APDU);
|
||||||
encode_application_unsigned(&apdu[0],MAX_APDU);
|
|
||||||
break;
|
break;
|
||||||
case PROP_SEGMENTATION_SUPPORTED:
|
case PROP_SEGMENTATION_SUPPORTED:
|
||||||
apdu_len =
|
apdu_len =
|
||||||
@@ -818,8 +817,7 @@ int Device_Encode_Property_APDU(
|
|||||||
apdu_len = encode_application_unsigned(&apdu[0], apdu_timeout());
|
apdu_len = encode_application_unsigned(&apdu[0], apdu_timeout());
|
||||||
break;
|
break;
|
||||||
case PROP_NUMBER_OF_APDU_RETRIES:
|
case PROP_NUMBER_OF_APDU_RETRIES:
|
||||||
apdu_len =
|
apdu_len = encode_application_unsigned(&apdu[0], apdu_retries());
|
||||||
encode_application_unsigned(&apdu[0], apdu_retries());
|
|
||||||
break;
|
break;
|
||||||
case PROP_DEVICE_ADDRESS_BINDING:
|
case PROP_DEVICE_ADDRESS_BINDING:
|
||||||
/* FIXME: encode the list here, if it exists */
|
/* FIXME: encode the list here, if it exists */
|
||||||
@@ -894,8 +892,7 @@ bool Device_Write_Property(
|
|||||||
case PROP_NUMBER_OF_APDU_RETRIES:
|
case PROP_NUMBER_OF_APDU_RETRIES:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
||||||
/* FIXME: bounds check? */
|
/* FIXME: bounds check? */
|
||||||
apdu_retries_set((uint8_t) value.type.
|
apdu_retries_set((uint8_t) value.type.Unsigned_Int);
|
||||||
Unsigned_Int);
|
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
|||||||
@@ -325,8 +325,7 @@ int main(int argc, char *argv[]) {
|
|||||||
Init_DataLink();
|
Init_DataLink();
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
timeout_seconds =
|
timeout_seconds = (apdu_timeout() / 1000) * apdu_retries();
|
||||||
(apdu_timeout() / 1000) * apdu_retries();
|
|
||||||
/* try to bind with the device */
|
/* try to bind with the device */
|
||||||
Send_WhoIs(Target_Device_Object_Instance, Target_Device_Object_Instance);
|
Send_WhoIs(Target_Device_Object_Instance, Target_Device_Object_Instance);
|
||||||
/* loop forever */
|
/* loop forever */
|
||||||
|
|||||||
@@ -306,8 +306,7 @@ int main(int argc, char *argv[]) {
|
|||||||
Init_DataLink();
|
Init_DataLink();
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
timeout_seconds =
|
timeout_seconds = (apdu_timeout() / 1000) * apdu_retries();
|
||||||
(apdu_timeout() / 1000) * apdu_retries();
|
|
||||||
/* try to bind with the device */
|
/* try to bind with the device */
|
||||||
found =
|
found =
|
||||||
address_bind_request(Target_Device_Object_Instance, &max_apdu,
|
address_bind_request(Target_Device_Object_Instance, &max_apdu,
|
||||||
|
|||||||
@@ -267,8 +267,7 @@ int main(int argc, char *argv[]) {
|
|||||||
Init_DataLink();
|
Init_DataLink();
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
timeout_seconds =
|
timeout_seconds = (apdu_timeout() / 1000) * apdu_retries();
|
||||||
(apdu_timeout() / 1000) * apdu_retries();
|
|
||||||
/* try to bind with the device */
|
/* try to bind with the device */
|
||||||
Send_WhoIs(Target_Device_Object_Instance, Target_Device_Object_Instance);
|
Send_WhoIs(Target_Device_Object_Instance, Target_Device_Object_Instance);
|
||||||
/* loop forever */
|
/* loop forever */
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ int main(int argc, char *argv[]) {
|
|||||||
BACNET_ADDRESS src = {
|
BACNET_ADDRESS src = {
|
||||||
0}; /* address where message came from */
|
0}; /* address where message came from */
|
||||||
uint16_t pdu_len = 0;
|
uint16_t pdu_len = 0;
|
||||||
unsigned timeout = 1000; /* milliseconds */
|
unsigned timeout = 1000; /* milliseconds */
|
||||||
time_t last_seconds = 0;
|
time_t last_seconds = 0;
|
||||||
time_t current_seconds = 0;
|
time_t current_seconds = 0;
|
||||||
uint32_t elapsed_seconds = 0;
|
uint32_t elapsed_seconds = 0;
|
||||||
|
|||||||
@@ -212,8 +212,8 @@ int main(int argc, char *argv[]) {
|
|||||||
filename_remove_path(argv[0]), filename_remove_path(argv[0]));
|
filename_remove_path(argv[0]), filename_remove_path(argv[0]));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* decode the command line parameters */ cov_data.
|
/* decode the command line parameters */
|
||||||
subscriberProcessIdentifier = strtol(argv[1], NULL, 0);
|
cov_data.subscriberProcessIdentifier = strtol(argv[1], NULL, 0);
|
||||||
cov_data.initiatingDeviceIdentifier = strtol(argv[2], NULL, 0);
|
cov_data.initiatingDeviceIdentifier = strtol(argv[2], NULL, 0);
|
||||||
cov_data.monitoredObjectIdentifier.type = strtol(argv[3], NULL, 0);
|
cov_data.monitoredObjectIdentifier.type = strtol(argv[3], NULL, 0);
|
||||||
cov_data.monitoredObjectIdentifier.instance = strtol(argv[4], NULL, 0);
|
cov_data.monitoredObjectIdentifier.instance = strtol(argv[4], NULL, 0);
|
||||||
|
|||||||
@@ -188,17 +188,17 @@ static void Init_DataLink(
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void address_parse(BACNET_ADDRESS *dst, int argc, char *argv[])
|
static void address_parse(BACNET_ADDRESS * dst,
|
||||||
{
|
int argc, char *argv[]) {
|
||||||
int dnet = 0;
|
int dnet = 0;
|
||||||
unsigned mac[6];
|
unsigned mac[6];
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
|
||||||
if (argc > 0) {
|
if (argc > 0) {
|
||||||
count =
|
count =
|
||||||
sscanf(argv[0], "%x:%x:%x:%x:%x:%x", &mac[0],
|
sscanf(argv[0], "%x:%x:%x:%x:%x:%x", &mac[0], &mac[1], &mac[2],
|
||||||
&mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
|
&mac[3], &mac[4], &mac[5]);
|
||||||
dst->mac_len = count;
|
dst->mac_len = count;
|
||||||
for (index = 0; index < MAX_MAC_LEN; index++) {
|
for (index = 0; index < MAX_MAC_LEN; index++) {
|
||||||
if (index < count) {
|
if (index < count) {
|
||||||
@@ -215,8 +215,8 @@ static void address_parse(BACNET_ADDRESS *dst, int argc, char *argv[])
|
|||||||
if (dnet) {
|
if (dnet) {
|
||||||
if (argc > 2) {
|
if (argc > 2) {
|
||||||
count =
|
count =
|
||||||
sscanf(argv[2], "%x:%x:%x:%x:%x:%x", &mac[0],
|
sscanf(argv[2], "%x:%x:%x:%x:%x:%x", &mac[0], &mac[1], &mac[2],
|
||||||
&mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
|
&mac[3], &mac[4], &mac[5]);
|
||||||
dst->len = count;
|
dst->len = count;
|
||||||
for (index = 0; index < MAX_MAC_LEN; index++) {
|
for (index = 0; index < MAX_MAC_LEN; index++) {
|
||||||
if (index < count) {
|
if (index < count) {
|
||||||
@@ -226,7 +226,7 @@ static void address_parse(BACNET_ADDRESS *dst, int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr,"A non-zero DNET requires a DADR.\r\n");
|
fprintf(stderr, "A non-zero DNET requires a DADR.\r\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dst->len = 0;
|
dst->len = 0;
|
||||||
@@ -248,25 +248,19 @@ int main(int argc, char *argv[]) {
|
|||||||
time_t timeout_seconds = 0;
|
time_t timeout_seconds = 0;
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
printf("Usage: %s DNET [MAC]\r\n",
|
printf("Usage: %s DNET [MAC]\r\n", filename_remove_path(argv[0]));
|
||||||
filename_remove_path(argv[0]));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) {
|
if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) {
|
||||||
printf("Send BACnet Who-Is-Router-To-Network message to a network.\r\n"
|
printf("Send BACnet Who-Is-Router-To-Network message to a network.\r\n"
|
||||||
"\r\n"
|
"\r\n" "DNET:\r\n" "BACnet destination network number 0-65534\r\n"
|
||||||
"DNET:\r\n"
|
"MAC:\r\n" "Optional MAC address of router for unicast message\r\n"
|
||||||
"BACnet destination network number 0-65534\r\n"
|
|
||||||
"MAC:\r\n"
|
|
||||||
"Optional MAC address of router for unicast message\r\n"
|
|
||||||
"Format: xx[:xx:xx:xx:xx:xx] [dnet xx[:xx:xx:xx:xx:xx]]\r\n"
|
"Format: xx[:xx:xx:xx:xx:xx] [dnet xx[:xx:xx:xx:xx:xx]]\r\n"
|
||||||
"Use hexidecimal MAC addresses.\r\n"
|
"Use hexidecimal MAC addresses.\r\n" "\r\n"
|
||||||
"\r\n"
|
|
||||||
"To send a Who-Is-Router-To-Network request to DNET 86:\r\n"
|
"To send a Who-Is-Router-To-Network request to DNET 86:\r\n"
|
||||||
"%s 86\r\n"
|
"%s 86\r\n"
|
||||||
"To send a Who-Is-Router-To-Network request to all devices:\r\n"
|
"To send a Who-Is-Router-To-Network request to all devices:\r\n"
|
||||||
"%s -1\r\n",
|
"%s -1\r\n", filename_remove_path(argv[0]),
|
||||||
filename_remove_path(argv[0]),
|
|
||||||
filename_remove_path(argv[0]));
|
filename_remove_path(argv[0]));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -274,14 +268,13 @@ int main(int argc, char *argv[]) {
|
|||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
Target_Router_Network = strtol(argv[1], NULL, 0);
|
Target_Router_Network = strtol(argv[1], NULL, 0);
|
||||||
if (Target_Router_Network >= 65535) {
|
if (Target_Router_Network >= 65535) {
|
||||||
fprintf(stderr,
|
fprintf(stderr, "DNET=%u - it must be less than %u\r\n",
|
||||||
"DNET=%u - it must be less than %u\r\n",
|
|
||||||
Target_Router_Network, 65535);
|
Target_Router_Network, 65535);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (argc > 2) {
|
if (argc > 2) {
|
||||||
address_parse(&Target_Router_Address, argc-2, &argv[2]);
|
address_parse(&Target_Router_Address, argc - 2, &argv[2]);
|
||||||
} else {
|
} else {
|
||||||
datalink_get_broadcast_address(&Target_Router_Address);
|
datalink_get_broadcast_address(&Target_Router_Address);
|
||||||
}
|
}
|
||||||
@@ -294,8 +287,7 @@ int main(int argc, char *argv[]) {
|
|||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
timeout_seconds = apdu_timeout() / 1000;
|
timeout_seconds = apdu_timeout() / 1000;
|
||||||
/* send the request */
|
/* send the request */
|
||||||
Send_Who_Is_Router_To_Network(
|
Send_Who_Is_Router_To_Network(&Target_Router_Address,
|
||||||
&Target_Router_Address,
|
|
||||||
Target_Router_Network);
|
Target_Router_Network);
|
||||||
/* loop forever */
|
/* loop forever */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|||||||
@@ -282,8 +282,7 @@ int main(int argc, char *argv[]) {
|
|||||||
Init_DataLink();
|
Init_DataLink();
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
timeout_seconds =
|
timeout_seconds = (apdu_timeout() / 1000) * apdu_retries();
|
||||||
(apdu_timeout() / 1000) * apdu_retries();
|
|
||||||
/* try to bind with the device */
|
/* try to bind with the device */
|
||||||
Send_WhoIs(Target_Device_Object_Instance, Target_Device_Object_Instance);
|
Send_WhoIs(Target_Device_Object_Instance, Target_Device_Object_Instance);
|
||||||
/* loop forever */
|
/* loop forever */
|
||||||
|
|||||||
@@ -402,8 +402,7 @@ int main(int argc, char *argv[]) {
|
|||||||
Init_DataLink();
|
Init_DataLink();
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
timeout_seconds =
|
timeout_seconds = (apdu_timeout() / 1000) * apdu_retries();
|
||||||
(apdu_timeout() / 1000) * apdu_retries();
|
|
||||||
/* try to bind with the device */
|
/* try to bind with the device */
|
||||||
found =
|
found =
|
||||||
address_bind_request(Target_Device_Object_Instance, &max_apdu,
|
address_bind_request(Target_Device_Object_Instance, &max_apdu,
|
||||||
|
|||||||
@@ -176,10 +176,14 @@ extern "C" {
|
|||||||
uint8_t ** service_request,
|
uint8_t ** service_request,
|
||||||
uint16_t * service_request_len);
|
uint16_t * service_request_len);
|
||||||
|
|
||||||
uint16_t apdu_timeout(void);
|
uint16_t apdu_timeout(
|
||||||
void apdu_timeout_set(uint16_t value);
|
void);
|
||||||
uint8_t apdu_retries(void);
|
void apdu_timeout_set(
|
||||||
void apdu_retries_set(uint8_t value);
|
uint16_t value);
|
||||||
|
uint8_t apdu_retries(
|
||||||
|
void);
|
||||||
|
void apdu_retries_set(
|
||||||
|
uint8_t value);
|
||||||
|
|
||||||
void apdu_handler(
|
void apdu_handler(
|
||||||
BACNET_ADDRESS * src, /* source address */
|
BACNET_ADDRESS * src, /* source address */
|
||||||
|
|||||||
@@ -110,15 +110,15 @@ extern "C" {
|
|||||||
BACNET_OCTET_STRING * fileData);
|
BACNET_OCTET_STRING * fileData);
|
||||||
|
|
||||||
void Send_Who_Is_Router_To_Network(
|
void Send_Who_Is_Router_To_Network(
|
||||||
BACNET_ADDRESS *dst,
|
BACNET_ADDRESS * dst,
|
||||||
int dnet);
|
int dnet);
|
||||||
void Send_I_Am_Router_To_Network(
|
void Send_I_Am_Router_To_Network(
|
||||||
const int DNET_list[]);
|
const int DNET_list[]);
|
||||||
void Send_Initialize_Routing_Table(
|
void Send_Initialize_Routing_Table(
|
||||||
BACNET_ADDRESS *dst,
|
BACNET_ADDRESS * dst,
|
||||||
BACNET_ROUTER_PORT *router_port_list);
|
BACNET_ROUTER_PORT * router_port_list);
|
||||||
void Send_Initialize_Routing_Table_Ack(
|
void Send_Initialize_Routing_Table_Ack(
|
||||||
BACNET_ROUTER_PORT *router_port_list);
|
BACNET_ROUTER_PORT * router_port_list);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ static void debug_printf(
|
|||||||
const char *format,
|
const char *format,
|
||||||
...)
|
...)
|
||||||
{
|
{
|
||||||
format=format;
|
format = format;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ struct router_port_t;
|
|||||||
typedef struct router_port_t {
|
typedef struct router_port_t {
|
||||||
uint16_t dnet;
|
uint16_t dnet;
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
uint8_t info[256]; /* size could be 1-255 */
|
uint8_t info[256]; /* size could be 1-255 */
|
||||||
uint8_t info_len;
|
uint8_t info_len;
|
||||||
struct router_port_t *next; /* linked list */
|
struct router_port_t *next; /* linked list */
|
||||||
} BACNET_ROUTER_PORT;
|
} BACNET_ROUTER_PORT;
|
||||||
|
|||||||
@@ -397,8 +397,7 @@ int Device_Encode_Property_APDU(
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_MAX_APDU_LENGTH_ACCEPTED:
|
case PROP_MAX_APDU_LENGTH_ACCEPTED:
|
||||||
apdu_len =
|
apdu_len = encode_application_unsigned(&apdu[0], MAX_APDU);
|
||||||
encode_application_unsigned(&apdu[0], MAX_APDU);
|
|
||||||
break;
|
break;
|
||||||
case PROP_SEGMENTATION_SUPPORTED:
|
case PROP_SEGMENTATION_SUPPORTED:
|
||||||
apdu_len =
|
apdu_len =
|
||||||
@@ -406,13 +405,10 @@ int Device_Encode_Property_APDU(
|
|||||||
Device_Segmentation_Supported());
|
Device_Segmentation_Supported());
|
||||||
break;
|
break;
|
||||||
case PROP_APDU_TIMEOUT:
|
case PROP_APDU_TIMEOUT:
|
||||||
apdu_len =
|
apdu_len = encode_application_unsigned(&apdu[0], apdu_timeout());
|
||||||
encode_application_unsigned(&apdu[0], apdu_timeout());
|
|
||||||
break;
|
break;
|
||||||
case PROP_NUMBER_OF_APDU_RETRIES:
|
case PROP_NUMBER_OF_APDU_RETRIES:
|
||||||
apdu_len =
|
apdu_len = encode_application_unsigned(&apdu[0], apdu_retries());
|
||||||
encode_application_unsigned(&apdu[0],
|
|
||||||
apdu_retries());
|
|
||||||
break;
|
break;
|
||||||
case PROP_DEVICE_ADDRESS_BINDING:
|
case PROP_DEVICE_ADDRESS_BINDING:
|
||||||
/* FIXME: encode the list here, if it exists */
|
/* FIXME: encode the list here, if it exists */
|
||||||
|
|||||||
@@ -75,7 +75,9 @@ void dlmstp_millisecond_timer(
|
|||||||
INCREMENT_AND_LIMIT_UINT16(SilenceTime);
|
INCREMENT_AND_LIMIT_UINT16(SilenceTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_abstime(struct timespec *abstime, unsigned long milliseconds)
|
void get_abstime(
|
||||||
|
struct timespec *abstime,
|
||||||
|
unsigned long milliseconds)
|
||||||
{
|
{
|
||||||
struct timeval tp;
|
struct timeval tp;
|
||||||
unsigned long seconds;
|
unsigned long seconds;
|
||||||
@@ -86,8 +88,8 @@ void get_abstime(struct timespec *abstime, unsigned long milliseconds)
|
|||||||
abstime->tv_nsec = tp.tv_usec * 1000;
|
abstime->tv_nsec = tp.tv_usec * 1000;
|
||||||
seconds = milliseconds / 1000;
|
seconds = milliseconds / 1000;
|
||||||
abstime->tv_sec += seconds;
|
abstime->tv_sec += seconds;
|
||||||
abstime->tv_nsec += ((milliseconds - (seconds * 1000))*(1000*1000));
|
abstime->tv_nsec += ((milliseconds - (seconds * 1000)) * (1000 * 1000));
|
||||||
seconds = abstime->tv_nsec / (1000*1000*1000);
|
seconds = abstime->tv_nsec / (1000 * 1000 * 1000);
|
||||||
abstime->tv_sec += seconds;
|
abstime->tv_sec += seconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,10 +154,8 @@ uint16_t dlmstp_receive(
|
|||||||
(void) max_pdu;
|
(void) max_pdu;
|
||||||
/* see if there is a packet available, and a place
|
/* see if there is a packet available, and a place
|
||||||
to put the reply (if necessary) and process it */
|
to put the reply (if necessary) and process it */
|
||||||
get_abstime(&abstime,timeout);
|
get_abstime(&abstime, timeout);
|
||||||
rv = pthread_cond_timedwait(
|
rv = pthread_cond_timedwait(&Receive_Packet_Flag, &Receive_Packet_Mutex,
|
||||||
&Receive_Packet_Flag,
|
|
||||||
&Receive_Packet_Mutex,
|
|
||||||
&abstime);
|
&abstime);
|
||||||
if (rv == 0) {
|
if (rv == 0) {
|
||||||
if (Receive_Packet.ready) {
|
if (Receive_Packet.ready) {
|
||||||
@@ -227,8 +227,8 @@ static void *dlmstp_master_fsm_task(
|
|||||||
if (milliseconds) {
|
if (milliseconds) {
|
||||||
get_abstime(&abstime, milliseconds);
|
get_abstime(&abstime, milliseconds);
|
||||||
/* we want an OS effecient way to wait for a frame */
|
/* we want an OS effecient way to wait for a frame */
|
||||||
pthread_cond_timedwait(&Received_Frame_Flag,
|
pthread_cond_timedwait(&Received_Frame_Flag, &Received_Frame_Mutex,
|
||||||
&Received_Frame_Mutex, &abstime);
|
&abstime);
|
||||||
}
|
}
|
||||||
MSTP_Master_Node_FSM(&MSTP_Port);
|
MSTP_Master_Node_FSM(&MSTP_Port);
|
||||||
}
|
}
|
||||||
@@ -622,26 +622,28 @@ bool dlmstp_init(
|
|||||||
Receive_Packet.pdu_len = 0;
|
Receive_Packet.pdu_len = 0;
|
||||||
rv = pthread_cond_init(&Receive_Packet_Flag, NULL);
|
rv = pthread_cond_init(&Receive_Packet_Flag, NULL);
|
||||||
if (rv == -1) {
|
if (rv == -1) {
|
||||||
fprintf(stderr, "MS/TP Interface: %s\n cannot allocate PThread Condition.\n",
|
fprintf(stderr,
|
||||||
|
"MS/TP Interface: %s\n cannot allocate PThread Condition.\n",
|
||||||
ifname);
|
ifname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
rv = pthread_cond_init(&Received_Frame_Flag, NULL);
|
rv = pthread_cond_init(&Received_Frame_Flag, NULL);
|
||||||
if (rv == -1) {
|
if (rv == -1) {
|
||||||
fprintf(stderr, "MS/TP Interface: %s\n cannot allocate PThread Condition.\n",
|
fprintf(stderr,
|
||||||
|
"MS/TP Interface: %s\n cannot allocate PThread Condition.\n",
|
||||||
ifname);
|
ifname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
rv = pthread_mutex_init(&Receive_Packet_Mutex, NULL);
|
rv = pthread_mutex_init(&Receive_Packet_Mutex, NULL);
|
||||||
if (rv == -1) {
|
if (rv == -1) {
|
||||||
fprintf(stderr, "MS/TP Interface: %s\n cannot allocate PThread Mutex.\n",
|
fprintf(stderr,
|
||||||
ifname);
|
"MS/TP Interface: %s\n cannot allocate PThread Mutex.\n", ifname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
rv = pthread_mutex_init(&Received_Frame_Mutex, NULL);
|
rv = pthread_mutex_init(&Received_Frame_Mutex, NULL);
|
||||||
if (rv == -1) {
|
if (rv == -1) {
|
||||||
fprintf(stderr, "MS/TP Interface: %s\n cannot allocate PThread Mutex.\n",
|
fprintf(stderr,
|
||||||
ifname);
|
"MS/TP Interface: %s\n cannot allocate PThread Mutex.\n", ifname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
/* initialize hardware */
|
/* initialize hardware */
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ static int ethernet_bind(
|
|||||||
/* alias net-pf-17 af_packet */
|
/* alias net-pf-17 af_packet */
|
||||||
/* Then follow it by: # modprobe af_packet */
|
/* Then follow it by: # modprobe af_packet */
|
||||||
/* Note: PF_INET/SOCK_PACKET has been replaced with
|
/* Note: PF_INET/SOCK_PACKET has been replaced with
|
||||||
PF_PACKET/(SOCK_PACKET, SOCK_DGRAM, SOCK_RAW).*/
|
PF_PACKET/(SOCK_PACKET, SOCK_DGRAM, SOCK_RAW). */
|
||||||
|
|
||||||
/* Attempt to open the socket for 802.2 ethernet frames */
|
/* Attempt to open the socket for 802.2 ethernet frames */
|
||||||
if ((sock_fd = socket(PF_INET, SOCK_PACKET, htons(ETH_P_802_2))) < 0) {
|
if ((sock_fd = socket(PF_INET, SOCK_PACKET, htons(ETH_P_802_2))) < 0) {
|
||||||
@@ -129,9 +129,9 @@ static int ethernet_bind(
|
|||||||
/* It is very advisable to do a IP_HDRINCL call, to make sure
|
/* It is very advisable to do a IP_HDRINCL call, to make sure
|
||||||
that the kernel knows the header is included in the data,
|
that the kernel knows the header is included in the data,
|
||||||
and doesn't insert its own header into the packet before our data */
|
and doesn't insert its own header into the packet before our data */
|
||||||
if (setsockopt (sock_fd, IPPROTO_IP, IP_HDRINCL, &sockopt,
|
if (setsockopt(sock_fd, IPPROTO_IP, IP_HDRINCL, &sockopt,
|
||||||
sizeof(sockopt)) < 0) {
|
sizeof(sockopt)) < 0) {
|
||||||
printf ("Warning: Cannot set HDRINCL!\n");
|
printf("Warning: Cannot set HDRINCL!\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Bind the socket to an address */
|
/* Bind the socket to an address */
|
||||||
|
|||||||
@@ -117,12 +117,13 @@ uint16_t MSTP_Get_Reply(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int network_init(const char *name, int protocol)
|
static int network_init(
|
||||||
|
const char *name,
|
||||||
|
int protocol)
|
||||||
{
|
{
|
||||||
/* check to see if we are being run as root */
|
/* check to see if we are being run as root */
|
||||||
if (getuid() != 0) {
|
if (getuid() != 0) {
|
||||||
fprintf(stderr,
|
fprintf(stderr, "Requires root priveleges.\n");
|
||||||
"Requires root priveleges.\n");
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,9 +163,9 @@ static void snap_received_packet(
|
|||||||
volatile struct mstp_port_struct_t *mstp_port,
|
volatile struct mstp_port_struct_t *mstp_port,
|
||||||
int sockfd)
|
int sockfd)
|
||||||
{
|
{
|
||||||
uint16_t mtu_len = 0; /* number of octets of packet saved in file */
|
uint16_t mtu_len = 0; /* number of octets of packet saved in file */
|
||||||
unsigned i = 0; /* counter */
|
unsigned i = 0; /* counter */
|
||||||
static uint8_t mtu[1500] = {0};
|
static uint8_t mtu[1500] = { 0 };
|
||||||
|
|
||||||
mtu[0] = 0;
|
mtu[0] = 0;
|
||||||
mtu[1] = 0;
|
mtu[1] = 0;
|
||||||
@@ -177,7 +178,7 @@ static void snap_received_packet(
|
|||||||
mtu[8] = 0;
|
mtu[8] = 0;
|
||||||
mtu[9] = 0;
|
mtu[9] = 0;
|
||||||
mtu[10] = 0;
|
mtu[10] = 0;
|
||||||
mtu[11]= mstp_port->SourceAddress;
|
mtu[11] = mstp_port->SourceAddress;
|
||||||
/* length - 12, 13 */
|
/* length - 12, 13 */
|
||||||
mtu[14] = 0xaa; /* DSAP for SNAP */
|
mtu[14] = 0xaa; /* DSAP for SNAP */
|
||||||
mtu[15] = 0xaa; /* SSAP for SNAP */
|
mtu[15] = 0xaa; /* SSAP for SNAP */
|
||||||
@@ -199,15 +200,15 @@ static void snap_received_packet(
|
|||||||
mtu_len = 31;
|
mtu_len = 31;
|
||||||
if (mstp_port->DataLength) {
|
if (mstp_port->DataLength) {
|
||||||
for (i = 0; i < mstp_port->DataLength; i++) {
|
for (i = 0; i < mstp_port->DataLength; i++) {
|
||||||
mtu[31+i] = mstp_port->InputBuffer[i];
|
mtu[31 + i] = mstp_port->InputBuffer[i];
|
||||||
}
|
}
|
||||||
mtu[31+mstp_port->DataLength] = mstp_port->DataCRCActualMSB;
|
mtu[31 + mstp_port->DataLength] = mstp_port->DataCRCActualMSB;
|
||||||
mtu[31+mstp_port->DataLength+1] = mstp_port->DataCRCActualLSB;
|
mtu[31 + mstp_port->DataLength + 1] = mstp_port->DataCRCActualLSB;
|
||||||
mtu_len += (mstp_port->DataLength+2);
|
mtu_len += (mstp_port->DataLength + 2);
|
||||||
}
|
}
|
||||||
/* Ethernet length is data only - not address or length bytes */
|
/* Ethernet length is data only - not address or length bytes */
|
||||||
encode_unsigned16(&mtu[12], mtu_len-14);
|
encode_unsigned16(&mtu[12], mtu_len - 14);
|
||||||
write(sockfd,&mtu[0], mtu_len);
|
write(sockfd, &mtu[0], mtu_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -409,8 +409,7 @@ int Device_Encode_Property_APDU(
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_MAX_APDU_LENGTH_ACCEPTED:
|
case PROP_MAX_APDU_LENGTH_ACCEPTED:
|
||||||
apdu_len =
|
apdu_len = encode_application_unsigned(&apdu[0], MAX_APDU);
|
||||||
encode_application_unsigned(&apdu[0], MAX_APDU);
|
|
||||||
break;
|
break;
|
||||||
case PROP_SEGMENTATION_SUPPORTED:
|
case PROP_SEGMENTATION_SUPPORTED:
|
||||||
apdu_len =
|
apdu_len =
|
||||||
@@ -418,13 +417,10 @@ int Device_Encode_Property_APDU(
|
|||||||
Device_Segmentation_Supported());
|
Device_Segmentation_Supported());
|
||||||
break;
|
break;
|
||||||
case PROP_APDU_TIMEOUT:
|
case PROP_APDU_TIMEOUT:
|
||||||
apdu_len =
|
apdu_len = encode_application_unsigned(&apdu[0], apdu_timeout());
|
||||||
encode_application_unsigned(&apdu[0], apdu_timeout());
|
|
||||||
break;
|
break;
|
||||||
case PROP_NUMBER_OF_APDU_RETRIES:
|
case PROP_NUMBER_OF_APDU_RETRIES:
|
||||||
apdu_len =
|
apdu_len = encode_application_unsigned(&apdu[0], apdu_retries());
|
||||||
encode_application_unsigned(&apdu[0],
|
|
||||||
apdu_retries());
|
|
||||||
break;
|
break;
|
||||||
case PROP_DEVICE_ADDRESS_BINDING:
|
case PROP_DEVICE_ADDRESS_BINDING:
|
||||||
/* FIXME: encode the list here, if it exists */
|
/* FIXME: encode the list here, if it exists */
|
||||||
|
|||||||
@@ -285,22 +285,26 @@ uint16_t apdu_decode_confirmed_service_request(
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t apdu_timeout(void)
|
uint16_t apdu_timeout(
|
||||||
|
void)
|
||||||
{
|
{
|
||||||
return Timeout_Milliseconds;
|
return Timeout_Milliseconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
void apdu_timeout_set(uint16_t milliseconds)
|
void apdu_timeout_set(
|
||||||
|
uint16_t milliseconds)
|
||||||
{
|
{
|
||||||
Timeout_Milliseconds = milliseconds;
|
Timeout_Milliseconds = milliseconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t apdu_retries(void)
|
uint8_t apdu_retries(
|
||||||
|
void)
|
||||||
{
|
{
|
||||||
return Number_Of_Retries;
|
return Number_Of_Retries;
|
||||||
}
|
}
|
||||||
|
|
||||||
void apdu_retries_set(uint8_t value)
|
void apdu_retries_set(
|
||||||
|
uint8_t value)
|
||||||
{
|
{
|
||||||
Number_Of_Retries = value;
|
Number_Of_Retries = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,8 +49,7 @@ int arf_encode_apdu(
|
|||||||
|
|
||||||
if (apdu) {
|
if (apdu) {
|
||||||
apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST;
|
apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST;
|
||||||
apdu[1] =
|
apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU);
|
||||||
encode_max_segs_max_apdu(0, MAX_APDU);
|
|
||||||
apdu[2] = invoke_id;
|
apdu[2] = invoke_id;
|
||||||
apdu[3] = SERVICE_CONFIRMED_ATOMIC_READ_FILE; /* service choice */
|
apdu[3] = SERVICE_CONFIRMED_ATOMIC_READ_FILE; /* service choice */
|
||||||
apdu_len = 4;
|
apdu_len = 4;
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ static inline void printf_receive(
|
|||||||
const char *format,
|
const char *format,
|
||||||
...)
|
...)
|
||||||
{
|
{
|
||||||
format=format;
|
format = format;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ static inline void printf_receive_data(
|
|||||||
const char *format,
|
const char *format,
|
||||||
...)
|
...)
|
||||||
{
|
{
|
||||||
format=format;
|
format = format;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -94,7 +94,7 @@ static inline void printf_receive_error(
|
|||||||
const char *format,
|
const char *format,
|
||||||
...)
|
...)
|
||||||
{
|
{
|
||||||
format=format;
|
format = format;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ static inline void printf_master(
|
|||||||
const char *format,
|
const char *format,
|
||||||
...)
|
...)
|
||||||
{
|
{
|
||||||
format=format;
|
format = format;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user