e15c3449f3
git-svn-id: svn://kolibrios.org@298 a494cfbc-eb01-0410-851d-a64ba20cac60
243 lines
5.2 KiB
C
243 lines
5.2 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <errno.h>
|
|
#include "i_system.h"
|
|
#include "d_event.h"
|
|
#include "d_net.h"
|
|
#include "m_argv.h"
|
|
#include "doomstat.h"
|
|
#include "i_net.h"
|
|
|
|
#ifndef B_HOST_IS_LENDIAN
|
|
#define B_HOST_IS_LENDIAN 1
|
|
#endif
|
|
#if !defined(sparc) && B_HOST_IS_LENDIAN
|
|
#ifndef ntohl
|
|
#define ntohl(x) \
|
|
((unsigned long int)((((unsigned long int)(x) & 0x000000ffU) << 24) | \
|
|
(((unsigned long int)(x) & 0x0000ff00U) << 8) | \
|
|
(((unsigned long int)(x) & 0x00ff0000U) >> 8) | \
|
|
(((unsigned long int)(x) & 0xff000000U) >> 24)))
|
|
#endif
|
|
|
|
#ifndef ntohs
|
|
#define ntohs(x) \
|
|
((unsigned short int)((((unsigned short int)(x) & 0x00ff) << 8) | \
|
|
(((unsigned short int)(x) & 0xff00) >> 8)))
|
|
#endif
|
|
|
|
#ifndef htonl
|
|
#define htonl(x) ntohl(x)
|
|
#endif
|
|
#ifndef htons
|
|
#define htons(x) ntohs(x)
|
|
#endif
|
|
#endif
|
|
|
|
void NetSend (void);
|
|
int NetListen (void);
|
|
|
|
|
|
//
|
|
// NETWORKING
|
|
//
|
|
|
|
#ifndef IPPORT_USERRESERVED
|
|
#define IPPORT_USERRESERVED 5000
|
|
#endif
|
|
|
|
int DOOMPORT = (IPPORT_USERRESERVED+0x1d);
|
|
int sendsocket[MAXNETNODES];
|
|
int insocket;
|
|
|
|
void (*netget) (void);
|
|
void (*netsend) (void);
|
|
|
|
static int first_user_port=IPPORT_USERRESERVED+0x1D+0x10;
|
|
|
|
int GetAvailPort(void)
|
|
{
|
|
int i,d0;
|
|
//for(i=0;i<1024;i++)
|
|
//{
|
|
// __asm__ __volatile__(
|
|
// "int $0x40"
|
|
// :"=a"(d0)
|
|
// :"0"(53),"b"(9),"c"(first_user_port+i));
|
|
// if(d0==1) return i+first_user_port;
|
|
//}
|
|
I_Error("Unable to get new port\n");
|
|
return -1;
|
|
}
|
|
|
|
|
|
int CreateInputUDPsocket(void)
|
|
{
|
|
int d0;
|
|
//__asm__ __volatile__(
|
|
// "int $0x40"
|
|
// :"=a"(d0)
|
|
// :"0"(53),"b"(1),"c"(DOOMPORT),"d"(0),"S"(0));
|
|
//if(d0==0xffffffff)
|
|
//{
|
|
I_Error("Unable to create socket\n");
|
|
//}
|
|
return d0;
|
|
}
|
|
|
|
int CreateOutputUDPSocket(int remote_ip)
|
|
{
|
|
int d0;
|
|
int p;
|
|
// p=GetAvailPort();
|
|
// __asm__ __volatile__(
|
|
// "int $0x40"
|
|
// :"=a"(d0)
|
|
// :"0"(53),"b"(0),"c"(p),"d"(DOOMPORT),"S"(remote_ip));
|
|
// if(d0==0xffffffff)
|
|
// {
|
|
I_Error("Unable to create output socket\n");
|
|
// }
|
|
return d0;
|
|
}
|
|
|
|
//
|
|
// PacketSend
|
|
//
|
|
void PacketSend (void)
|
|
{
|
|
int c;
|
|
doomdata_t sw;
|
|
// byte swap
|
|
sw.checksum = htonl(netbuffer->checksum);
|
|
sw.player = netbuffer->player;
|
|
sw.retransmitfrom = netbuffer->retransmitfrom;
|
|
sw.starttic = netbuffer->starttic;
|
|
sw.numtics = netbuffer->numtics;
|
|
for (c=0 ; c< netbuffer->numtics ; c++)
|
|
{
|
|
sw.cmds[c].forwardmove = netbuffer->cmds[c].forwardmove;
|
|
sw.cmds[c].sidemove = netbuffer->cmds[c].sidemove;
|
|
sw.cmds[c].angleturn = htons(netbuffer->cmds[c].angleturn);
|
|
sw.cmds[c].consistancy = htons(netbuffer->cmds[c].consistancy);
|
|
sw.cmds[c].chatchar = netbuffer->cmds[c].chatchar;
|
|
sw.cmds[c].buttons = netbuffer->cmds[c].buttons;
|
|
}
|
|
// __libclog_printf("Sending packet %u to node %u\n",gametic,
|
|
// doomcom->remotenode);
|
|
// __asm__ __volatile__(
|
|
// "int $0x40"
|
|
// :"=a"(c)
|
|
// :"0"(53),"b"(4),"c"(sendsocket[doomcom->remotenode]),
|
|
// "d"(doomcom->datalength),"S"((long)&sw));
|
|
// if(c==-1)
|
|
// {
|
|
// __libclog_printf("Unable to send packet to remote node\n");
|
|
// }
|
|
}
|
|
|
|
//
|
|
// PacketGet
|
|
//
|
|
void PacketGet (void)
|
|
{
|
|
}
|
|
|
|
int GetLocalAddress (void)
|
|
{
|
|
int d0;
|
|
// __asm__ __volatile__(
|
|
// "int $0x40"
|
|
// :"=a"(d0)
|
|
// :"0"(52),"b"(1));
|
|
return d0;
|
|
}
|
|
|
|
|
|
//
|
|
// I_InitNetwork
|
|
//
|
|
void I_InitNetwork (void)
|
|
{
|
|
boolean trueval = true;
|
|
int i;
|
|
int p;
|
|
|
|
doomcom = malloc (sizeof (*doomcom) );
|
|
memset (doomcom, 0, sizeof(*doomcom) );
|
|
|
|
// set up for network
|
|
i = M_CheckParm ("-dup");
|
|
if (i && i< myargc-1)
|
|
{
|
|
doomcom->ticdup = myargv[i+1][0]-'0';
|
|
if (doomcom->ticdup < 1)
|
|
doomcom->ticdup = 1;
|
|
if (doomcom->ticdup > 9)
|
|
doomcom->ticdup = 9;
|
|
}
|
|
else
|
|
doomcom-> ticdup = 1;
|
|
|
|
if (M_CheckParm ("-extratic"))
|
|
doomcom-> extratics = 1;
|
|
else
|
|
doomcom-> extratics = 0;
|
|
|
|
p = M_CheckParm ("-port");
|
|
if (p && p<myargc-1)
|
|
{
|
|
DOOMPORT = atoi (myargv[p+1]);
|
|
// __libclog_printf ("using alternate port %i\n",DOOMPORT);
|
|
}
|
|
|
|
// parse network game options,
|
|
// -net <consoleplayer> <host> <host> ...
|
|
i = M_CheckParm ("-net");
|
|
|
|
if (!i)
|
|
{
|
|
// single player game
|
|
netgame = false;
|
|
doomcom->id = DOOMCOM_ID;
|
|
doomcom->numplayers = doomcom->numnodes = 1;
|
|
doomcom->deathmatch = false;
|
|
doomcom->consoleplayer = 0;
|
|
return;
|
|
}
|
|
|
|
netsend = PacketSend;
|
|
netget = PacketGet;
|
|
netgame = true;
|
|
|
|
// parse player number and host list
|
|
doomcom->consoleplayer = myargv[i+1][0]-'1';
|
|
|
|
doomcom->numnodes = 1; // this node for sure
|
|
doomcom->id = DOOMCOM_ID;
|
|
doomcom->numplayers = doomcom->numnodes;
|
|
sendsocket[0]=0;
|
|
for(i=1;i<MAXNETNODES;i++)
|
|
{
|
|
sendsocket[i]=-1;
|
|
}
|
|
insocket=CreateInputUDPsocket();
|
|
// __libclog_printf("DOOM: Input UDP socket is %d\n",insocket);
|
|
}
|
|
|
|
|
|
void I_NetCmd (void)
|
|
{
|
|
if (doomcom->command == CMD_SEND)
|
|
{
|
|
netsend ();
|
|
}
|
|
else if (doomcom->command == CMD_GET)
|
|
{
|
|
netget ();
|
|
}
|
|
else
|
|
I_Error ("Bad net cmd: %i\n",doomcom->command);
|
|
}
|