1
0
This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Files
2024-07-22 01:58:46 -03:00

268 lines
5.4 KiB
C
Executable File

/*
* Database handling functions
*
* $Id: //BBN_Linux/Branch/Branch_for_Rel_TP_ASEAN_20161216/tclinux_phoenix/apps/public/linux-atm/lane/db.c#1 $
*
*/
/* System includes */
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <assert.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
/* Local includes */
#include "mem.h"
#include "lane.h"
#include "dump.h"
#include "load.h"
#include "connect.h"
#include "events.h"
#include "db.h"
Reg_t *reglist;
Proxy_t *proxylist;
Lecdb_t *leclist;
/* Protos */
/* Adds entry to PROXY-DB */
void
proxydb_add(const Conn_t *conn, int fd)
{
Proxy_t *tmp;
assert(conn != NULL);
Debug_unit(&conn_unit,"Proxydb_add");
tmp = (Proxy_t *) mem_alloc(&conn_unit, sizeof(Proxy_t));
tmp->lecid = conn->lecid;
tmp->fd = fd;
tmp->next = proxylist;
proxylist = tmp;
return;
}
/* Removes entry from PROXY-DB */
int
proxydb_remove(const Conn_t *conn)
{
Proxy_t *tmp, *tmp2;
Debug_unit(&conn_unit,"Proxydb_remove");
if (proxylist == NULL) {
return 0;
}
tmp = proxylist;
if (conn->lecid == tmp->lecid) {
proxylist =tmp->next;
mem_free(&conn_unit, tmp);
return 1;
}
tmp2 = tmp;
tmp = tmp->next;
while(tmp) {
if (conn->lecid == tmp->lecid) {
tmp2->next = tmp->next;
mem_free(&conn_unit, tmp);
return 1;
}
tmp = tmp->next;
}
dump_error(&conn_unit,"Trying to remove unexisting entry from PROXY-DB");
return 0;
}
Proxy_t*
proxydb_find(LecId_t to_find)
{
Proxy_t *tmp;
tmp = proxylist;
while(tmp) {
if (to_find == tmp->lecid) {
Debug_unit(&conn_unit, "Proxy_t found");
return tmp;
}
tmp = tmp->next;
}
Debug_unit(&conn_unit,"Proxy_t not found from database");
return NULL;
}
/* Adds entry to LECID-DB */
void
leciddb_add(LecId_t lecid, AtmAddr_t address, const int fd)
{
Lecdb_t *tmp;
Debug_unit(&conn_unit, "Leciddb_add called");
tmp = (Lecdb_t *) mem_alloc(&conn_unit, sizeof(Lecdb_t));
tmp->fd = fd;
memcpy(&tmp->address, &address, sizeof(AtmAddr_t));
tmp->lecid = lecid;
tmp->next = leclist;
leclist = tmp;
return;
}
int leciddb_remove(LecId_t to_remove)
{
Lecdb_t *tmp, *tmp2;
Debug_unit(&conn_unit,"Leciddb_remove");
if (leclist == NULL) {
return 0;
}
tmp = leclist;
if (to_remove == tmp->lecid) {
leclist =tmp->next;
mem_free(&conn_unit, tmp);
return 1;
}
tmp2 = tmp;
tmp = tmp->next;
while(tmp) {
if (to_remove == tmp->lecid) {
tmp2->next = tmp->next;
mem_free(&conn_unit, tmp);
return 1;
}
tmp = tmp->next;
}
dump_error(&conn_unit,"Trying to remove unexisting entry from LECID-DB");
return 0;
}
/* Searches LECID-DB for entry */
Lecdb_t *leciddb_find(LecId_t to_find)
{
Lecdb_t *tmp;
tmp = leclist;
while(tmp) {
if (to_find == tmp->lecid) {
Debug_unit(&conn_unit, "Lecdb_t found");
return tmp;
}
tmp = tmp->next;
}
Debug_unit(&conn_unit,"Lecdb_t not found from database");
return NULL;
}
Lecdb_t *leciddb_find_atm(AtmAddr_t to_find)
{
Lecdb_t *tmp;
tmp = leclist;
while (tmp) {
if (memcmp(&to_find,&(tmp->address), sizeof(AtmAddr_t)) == 0) {
Debug_unit(&conn_unit, "Lecdb_t found");
return tmp;
}
tmp= tmp->next;
}
Debug_unit(&conn_unit,"Lecid_t not found from database");
return NULL;
}
/* Adds entry to REG-DB */
void regdb_add(AtmAddr_t aaddr, LaneDestination_t maddr)
{
Reg_t *tmp;
Debug_unit(&conn_unit,"Regdb_add");
tmp = (Reg_t *)mem_alloc(&conn_unit, sizeof(Reg_t));
memcpy(&tmp->mac_address, &maddr,sizeof(LaneDestination_t));
memcpy(&tmp->atm_address, &aaddr, sizeof(AtmAddr_t));
tmp->next = reglist;
reglist = tmp;
return;
}
/* Removes entry from REG-DB.
Returns 0 if entry is not found. 1 otherwise.
*/
int
regdb_remove(AtmAddr_t to_remove)
{
Reg_t *tmp, *tmp2;
Debug_unit(&conn_unit,"Regdb_remove");
if (reglist == NULL) {
return 0;
}
tmp = reglist;
if (memcmp((char *)&to_remove, (char *)&tmp->atm_address,
sizeof(AtmAddr_t)) == 0) {
reglist =tmp->next;
mem_free(&conn_unit, tmp);
return 1;
}
tmp2 = tmp;
tmp = tmp->next;
while(tmp) {
if (memcmp((char *)&to_remove, (char *)&tmp->atm_address,
sizeof(AtmAddr_t)) == 0) {
tmp2->next = tmp->next;
mem_free(&conn_unit, tmp);
return 1;
}
tmp = tmp->next;
}
dump_error(&conn_unit,"Trying to remove unexisting entry from REG-DB");
return 0;
}
/* Finds entry from REG_DB by comparing mac address */
Reg_t*
regdb_find_mac(LaneDestination_t maddr)
{
Reg_t *tmp;
tmp = reglist;
while (tmp) {
if((tmp->mac_address).tag == htons(LANE_DEST_MAC)) {
if (memcmp((char *)&(tmp->mac_address).a_r.mac_address,
(char *)&maddr.a_r.mac_address, 6) ==0) {
Debug_unit(&conn_unit, "MAC found from database");
return tmp;
}
}
else if ((tmp->mac_address).tag == htons(LANE_DEST_RD)) {
if (memcmp((char *)&(tmp->mac_address.a_r.route),
(char *)&maddr.a_r.route,
4 + sizeof(unsigned short)) == 0) {
Debug_unit(&conn_unit, "MAC found from database");
return tmp;
}
else if (memcmp((char *)&(tmp->mac_address),
(char *)&maddr,
sizeof(LaneDestination_t)) == 0) {
Debug_unit(&conn_unit, "MAC found from database");
return tmp;
}
}
tmp = tmp->next;
}
Debug_unit(&conn_unit, "MAC address not found from database");
return NULL;
}