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

124 lines
2.6 KiB
C
Executable File

/*
* Functions to send packets
*
* $Id: //BBN_Linux/Branch/Branch_for_Rel_TP_ASEAN_20161216/tclinux_phoenix/apps/public/linux-atm/lane/packet.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 <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"
#include "packet.h"
int
forward_arp_request(LaneControl_t *to_forward,
Proxy_t *proxyl)
{
Proxy_t *tmp;
int a;
Debug_unit(&conn_unit,"Forward_arp called");
tmp = proxyl;
while(tmp) {
a = write(tmp->fd, to_forward, sizeof(LaneControl_t));
if (a == -1)
dump_error(&conn_unit, "Forward arp failed");
tmp = tmp->next;
}
return 1;
}
int
send_arp_response(int fd, LaneControl_t *lc,
unsigned int status, Reg_t *found)
{
Debug_unit(&conn_unit,"Send_arp_response called to %d",fd);
lc->opcode = htons(LE_ARP_RESPONSE);
lc->status = (unsigned short)htons((0xffff & status));
/* Clear the potential Remote flag */
if ((lc->flags & htons(LE_FLAG_REMOTE)) == htons(LE_FLAG_REMOTE)) {
lc->flags = (lc->flags ^ htons(LE_FLAG_REMOTE));
}
if (found) {
memcpy(&lc->target_addr,&found->atm_address, sizeof(lc->target_addr));
}
if (send_control_frame(fd, lc) == 0) {
dump_error(&conn_unit,"Send arp response failed");
return 0;
}
return 1;
}
int
send_register_response(int fd, LaneControl_t *lc,
unsigned int status, int reg)
{
Debug_unit(&conn_unit,"Send_register_response called to %d",fd);
if (reg == 1)
lc->opcode = htons(LE_REGISTER_RESPONSE);
else
lc->opcode = htons(LE_UNREGISTER_RESPONSE);
lc->status = (unsigned short)htons(0xffff & status);
if (send_control_frame(fd, lc) == 0) {
dump_error(&conn_unit,"Send register response failed");
return 0;
}
return 1;
}
int
send_join_response(int fd, LaneControl_t *lc, int lecid,
unsigned int status)
{
Debug_unit(&conn_unit,"Send_join_response called to %d",fd);
lc->opcode = htons(LE_JOIN_RESPONSE);
lc->status = (unsigned short)htons(0xffff & status);
lc->lecid = lecid;
if (send_control_frame(fd, lc) == 0) {
dump_error(&conn_unit,"Send join response failed");
return 0;
}
return 1;
}
int
send_control_frame(int fd, LaneControl_t *to_send)
{
int a;
Debug_unit(&conn_unit,"Send control frame");
dump_control(to_send);
a = write(fd, to_send, sizeof(LaneControl_t));
if (a == -1) {
dump_error(&conn_unit,"Write error");
return 0;
}
return 1;
}