dxx-rebirth/arch/linux/ipx_kali.c

119 lines
2.5 KiB
C

/* IPX driver for KaliNix interface */
#include <stdio.h>
#include <string.h>
#include <netinet/in.h> /* for htons & co. */
#include "net_ipx.h"
#include "ukali.h"
#include "console.h"
static int open_sockets = 0;
static int dynamic_socket = 0x401;
int have_empty_address() {
int i;
for (i = 0; i < 10 && !MyAddress[i]; i++) ;
return i == 10;
}
int kali_get_my_address(void)
{
kaliaddr_ipx mKaliAddr;
if (!have_empty_address())
return 0;
if (KaliGetNodeNum(&mKaliAddr) < 0)
return -1;
memset(MyAddress, 0, 4);
memcpy(MyAddress + 4, mKaliAddr.sa_nodenum, sizeof(mKaliAddr.sa_nodenum));
return 0;
}
int kali_open_socket(socket_t *sk, int port)
{
con_printf(CON_DEBUG,"kali: OpenSocket on port(%d)\n", port);
if (!open_sockets) {
if (have_empty_address()) {
if (kali_get_my_address() < 0) {
con_printf(CON_CRITICAL,"kali: Error communicating with KaliNix\n");
return -1;
}
}
}
if (!port)
port = dynamic_socket++;
if ((sk->fd = KaliOpenSocket(htons(port))) < 0) {
con_printf(CON_CRITICAL,"kali: OpenSocket Failed on port(%d)\n", port);
sk->fd = -1;
return -1;
}
open_sockets++;
sk->socket = port;
return 0;
}
void kali_close_socket(socket_t *mysock)
{
if (!open_sockets) {
con_printf(CON_CRITICAL,"kali: close w/o open\n");
return;
}
con_printf(CON_DEBUG,"kali: CloseSocket on port(%d)\n", mysock->socket);
KaliCloseSocket(mysock->fd);
if (--open_sockets) {
con_printf(CON_URGENT,"kali: (closesocket) %d sockets left\n", open_sockets);
return;
}
}
int kali_send_packet(socket_t *mysock, IPXPacket_t *IPXHeader, u_char *data, int dataLen)
{
kaliaddr_ipx toaddr;
int i;
memcpy(toaddr.sa_nodenum, IPXHeader->Destination.Node, sizeof(toaddr.sa_nodenum));
toaddr.sa_socket=htons(mysock->socket);
if ((i = KaliSendPacket(mysock->fd, (char *)data, dataLen, &toaddr)) < 0)
return -1;
return i;
}
int kali_receive_packet(socket_t *s, char *outbuf, int outbufsize, struct recv_data *rd)
{
int size;
kaliaddr_ipx fromaddr;
if ((size = KaliReceivePacket(s->fd, outbuf, outbufsize, &fromaddr)) < 0)
return -1;
rd->dst_socket = s->socket;
rd->src_socket = ntohs(fromaddr.sa_socket);
memcpy(rd->src_node, fromaddr.sa_nodenum, sizeof(fromaddr.sa_nodenum));
memset(rd->src_network, 0, 4);
rd->pkt_type = 0;
return size;
}
static int kali_general_packet_ready(socket_t *s)
{
return ipxdrv_general_packet_ready(s->fd);
}
struct net_driver ipxdrv_kali = {
kali_open_socket,
kali_close_socket,
kali_send_packet,
kali_receive_packet,
kali_general_packet_ready,
1,
NETPROTO_KALINIX
};