/* Copyright (C) 2012 Andriy Sukhynyuk, Vasyl Tkhir, Andriy Ivasiv This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include "portthread.h" ROUTER_PORT *find_snet( MSGBOX_ID id) { ROUTER_PORT *port = head; while (port != NULL) { if (port->port_id == id) return port; port = port->next; } return NULL; } ROUTER_PORT *find_dnet( uint16_t net, BACNET_ADDRESS * addr) { ROUTER_PORT *port = head; DNET *dnet; /* for broadcast messages no search is needed */ if (net == BACNET_BROADCAST_NETWORK) return port; while (port != NULL) { /* check if DNET is directly connected to the router */ if (net == port->route_info.net) return port; /* else search router ports DNET list */ else if (port->route_info.dnets) { dnet = port->route_info.dnets; while (dnet != NULL) { if (net == dnet->net) { if (addr) { memmove(&addr->len, &dnet->mac_len, 1); memmove(&addr->adr[0], &dnet->mac[0], MAX_MAC_LEN); } return port; } dnet = dnet->next; } } port = port->next; } return NULL; } void add_dnet( RT_ENTRY * route_info, uint16_t net, BACNET_ADDRESS addr) { DNET *dnet = route_info->dnets; DNET *tmp; if (dnet == NULL) { route_info->dnets = (DNET *) malloc(sizeof(DNET)); memmove(&route_info->dnets->mac_len, &addr.len, 1); memmove(&route_info->dnets->mac[0], &addr.adr[0], MAX_MAC_LEN); route_info->dnets->net = net; route_info->dnets->state = true; route_info->dnets->next = NULL; } else { while (dnet != NULL) { if (dnet->net == net) /* make sure NETs are not repeated */ return; tmp = dnet; dnet = dnet->next; } dnet = (DNET *) malloc(sizeof(DNET)); memmove(&dnet->mac_len, &addr.len, 1); memmove(&dnet->mac[0], &addr.adr[0], MAX_MAC_LEN); dnet->net = net; dnet->state = true; dnet->next = NULL; tmp->next = dnet; } } void cleanup_dnets( DNET * dnets) { DNET *dnet = dnets; while (dnet != NULL) { dnet = dnet->next; free(dnets); dnets = dnet; } }