1 /*****************************************************************************\
3 ** Linux Call Router **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
8 ** The Endpoint is the link between the join and the port. **
10 \*****************************************************************************/
14 unsigned int epoint_serial = 1; /* initial value must be 1, because 0== no epoint */
16 class Endpoint *epoint_first = NULL;
20 * find the epoint with epoint_id
22 class Endpoint *find_epoint_id(unsigned int epoint_id)
24 class Endpoint *epoint = epoint_first;
27 //printf("comparing: '%s' with '%s'\n", name, epoint->name);
28 if (epoint->ep_serial == epoint_id)
30 epoint = epoint->next;
36 int delete_endpoint(struct lcr_work *work, void *instance, int index);
39 * endpoint constructor (link with either port or join id)
41 Endpoint::Endpoint(unsigned int port_id, unsigned int join_id)
44 class Endpoint **epointpointer;
47 /* epoint structure */
48 PDEBUG(DEBUG_EPOINT, "EPOINT(%d): Allocating enpoint %d and connecting it with:%s%s\n", epoint_serial, epoint_serial, (port_id)?" ioport":"", (join_id)?" join":"");
52 memset(&ep_delete, 0, sizeof(ep_delete));
53 add_work(&ep_delete, delete_endpoint, this, 0);
56 /* add endpoint to chain */
58 epointpointer = &epoint_first;
60 epointpointer = &((*epointpointer)->next);
61 *epointpointer = this;
64 ep_serial = epoint_serial++;
66 /* link to join or port */
68 port = find_port_id(port_id);
70 if ((port->p_type&PORT_CLASS_MASK) == PORT_CLASS_mISDN)
71 earlyb = ((class PmISDN *)port)->p_m_mISDNport->earlyb;
72 if (!portlist_new(port_id, port->p_type, earlyb))
73 FATAL("No memory for portlist.\n");
88 Endpoint::~Endpoint(void)
90 class Endpoint *temp, **tempp;
91 struct port_list *portlist, *mtemp;
95 /* remote application */
101 PERROR("warning: still relation to join.\n");
105 portlist = ep_portlist;
107 if (portlist->port_id) {
108 PERROR("warning: still relation to port (portlist list)\n");
111 portlist = portlist->next;
112 memset(mtemp, 0, sizeof(struct port_list));
113 FREE(mtemp, sizeof(struct port_list));
119 tempp = &epoint_first;
128 FATAL("Endpoint not in Endpoint's list.\n");
131 del_work(&ep_delete);
134 PDEBUG(DEBUG_EPOINT, "removed endpoint %d.\n", ep_serial);
137 /* create new portlist relation
139 struct port_list *Endpoint::portlist_new(unsigned int port_id, int port_type, int earlyb)
141 struct port_list *portlist, **portlistpointer;
143 /* portlist structure */
144 portlist = (struct port_list *)MALLOC(sizeof(struct port_list));
146 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) allocating port_list.\n", ep_serial);
148 /* add port_list to chain */
149 portlist->next = NULL;
150 portlistpointer = &ep_portlist;
151 while(*portlistpointer)
152 portlistpointer = &((*portlistpointer)->next);
153 *portlistpointer = portlist;
155 /* link to join or port */
156 portlist->port_id = port_id;
157 portlist->port_type = port_type;
158 portlist->early_b = earlyb;
164 /* free portlist relation
166 void Endpoint::free_portlist(struct port_list *portlist)
168 struct port_list *temp, **tempp;
171 tempp = &ep_portlist;
173 if (temp == portlist)
180 FATAL("port_list not in Endpoint's list.\n");
182 *tempp=portlist->next;
185 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) removed port_list from endpoint\n", ep_serial);
186 FREE(portlist, sizeof(struct port_list));
191 int delete_endpoint(struct lcr_work *work, void *instance, int index)
193 class Endpoint *ep = (class Endpoint *)instance;