{
class Port *temp, **tempp;
- PDEBUG(DEBUG_PORT, "new port of type 0x%x, name '%s'\n", type, portname);
-
/* initialize object */
if (settings)
memcpy(&p_settings, settings, sizeof(struct port_settings));
*tempp = this;
classuse++;
+
+ PDEBUG(DEBUG_PORT, "new port (%d) of type 0x%x, name '%s'\n", p_serial, type, portname);
}
class Port *temp, **tempp;
struct lcr_msg *message;
- PDEBUG(DEBUG_PORT, "removing port of type 0x%x, name '%s'\n", p_type, p_name);
+ PDEBUG(DEBUG_PORT, "removing port (%d) of type 0x%x, name '%s'\n", p_serial, p_type, p_name);
if (p_bridge) {
PDEBUG(DEBUG_PORT, "Removing us from bridge %u\n", p_bridge->bridge_id);
if (name == NULL)
name = "";
- if (!dir && !dir[0])
+ if (!dir || !dir[0])
dir = options.tones_dir; /* just in case we have no PmISDN instance */
/* no counter, no eof, normal speed */
struct port_bridge **temp = &p_bridge_first;
while (*temp) {
if (*temp == bridge) {
- int remove = 0;
-
- /* Remove us from bridge. If bridge is empty, remove it completely. */
- if (bridge->sunrise == port) {
- bridge->sunrise = NULL;
- if (!bridge->sunset)
- remove = 1;
- }
- if (bridge->sunset == port) {
- bridge->sunset = NULL;
- if (!bridge->sunrise)
- remove = 1;
+ struct port_bridge_member **memberp = &bridge->first, *member;
+
+ /* loop until we are found */
+ while(*memberp) {
+ if ((*memberp)->port == port) {
+ member = *memberp;
+ *memberp = member->next;
+ FREE(member, sizeof(struct port_bridge_member));
+ memuse--;
+ break;
+ }
+ memberp = &((*memberp)->next);
}
- if (remove) {
+ /* if bridge is empty, remove it */
+ if (bridge->first == NULL) {
PDEBUG(DEBUG_PORT, "Remove bridge %u\n", bridge->bridge_id);
*temp = bridge->next;
FREE(bridge, sizeof(struct port_bridge));
void Port::bridge(unsigned int bridge_id)
{
+ struct port_bridge_member **memberp;
+
/* Remove bridge, if we leave bridge or if we join a different bridge. */
if (p_bridge && bridge_id != p_bridge->bridge_id) {
PDEBUG(DEBUG_PORT, "Remove port %u from bridge %u, because out new bridge is %u\n", p_serial, p_bridge->bridge_id, bridge_id);
p_bridge = (struct port_bridge *) MALLOC(sizeof(struct port_bridge));
memuse++;
p_bridge->bridge_id = bridge_id;
- p_bridge->sunrise = this;
/* attach bridge instance to list */
while (*temp)
PDEBUG(DEBUG_PORT, "Port %d creating not existing bridge %u.\n", p_serial, p_bridge->bridge_id);
}
- /* already joined */
- if (p_bridge->sunrise == this || p_bridge->sunset == this)
- return;
-
- /* join bridge */
- if (!p_bridge->sunrise) {
- p_bridge->sunrise = this;
- return;
- }
- if (!p_bridge->sunset) {
- p_bridge->sunset = this;
- return;
+ /* attach to bridge */
+ memberp = &p_bridge->first;
+ while(*memberp) {
+ if ((*memberp)->port == this) {
+ /* already joined */
+ return;
+ }
+ memberp = &((*memberp)->next);
}
-
- PERROR("Bridge ID %u cannot be joined by port %u, because it is already occupied by ports %u and %u.\n", p_bridge->bridge_id, p_serial, p_bridge->sunrise->p_serial, p_bridge->sunset->p_serial);
- p_bridge = NULL;
+ *memberp = (struct port_bridge_member *) MALLOC(sizeof(struct port_bridge_member));
+ memuse++;
+ (*memberp)->port = this;
+}
+
+class Port *Port::bridge_remote(void)
+{
+ class Port *remote = NULL;
+
+ /* get remote port from bridge */
+ if (!p_bridge || !p_bridge->first || !p_bridge->first->next)
+ return NULL;
+ if (p_bridge->first->port == this)
+ remote = p_bridge->first->next->port;
+ if (p_bridge->first->next->port == this)
+ remote = p_bridge->first->port;
+
+ return remote;
}
/* send data to remote Port */
int Port::bridge_tx(unsigned char *data, int len)
{
- class Port *to_port = NULL;
+ class Port *remote = bridge_remote();
- /* get remote port from bridge */
- if (!p_bridge)
- return -EINVAL;
- if (p_bridge->sunrise == this)
- to_port = p_bridge->sunset;
- if (p_bridge->sunset == this)
- to_port = p_bridge->sunrise;
- if (!to_port)
+ if (!remote)
return -EINVAL;
-// printf("Traffic: %u -> %u (bridge %u)\n", p_serial, to_port->p_serial, p_bridge->bridge_id);
- return to_port->bridge_rx(data, len);
+// printf("Traffic: %u -> %u (bridge %u)\n", p_serial, remote->p_serial, p_bridge->bridge_id);
+ return remote->bridge_rx(data, len);
}
/* receive data from remote Port (dummy, needs to be inherited) */