2 #include <proto/exec.h>
3 #include <clib/alib_protos.h>
6 #include <aros/debug.h>
13 #include "aros_netspecial.h"
14 #include "aros_net_local.h"
16 /****************************************************************************/
18 arosnetdriver_t local_netdriver
=
22 AROSNetLocal_InitNetwork
,
23 AROSNetLocal_CleanupNetwork
,
27 /****************************************************************************/
29 static struct ComPort
*comport
;
30 static struct ComMsg sendmsg
, *getmsg
;
31 static struct ComMsg fastmsg
[NUM_FASTMSG
];
32 static struct MsgPort fastmsg_freeport
;
33 static struct MsgPort
*sendport
[MAX_PLAYERS
];
34 static WORD playerid_to_node
[MAX_PLAYERS
];
37 /****************************************************************************/
39 boolean
AROSNetLocal_InitNetwork(void)
44 i
= M_CheckParm ("-netlocal");
48 // parse player number and host list
49 doomcom
->consoleplayer
= consoleplayer
= playerid
= myargv
[i
+ 1][0] - '1';
51 doomcom
->numnodes
= 1; // this node for sure
54 while (++i
< myargc
&& myargv
[i
][0] != '-')
59 doomcom
->id
= DOOMCOM_ID
;
60 doomcom
->numplayers
= doomcom
->numnodes
;
63 if (!(comport
= (struct ComPort
*)FindSemaphore(COMNAME
)))
65 comport
= AllocVec(sizeof(struct ComPort
), MEMF_PUBLIC
| MEMF_CLEAR
);
69 I_Error("AROS_Net_Local: Out of memory!");
72 InitSemaphore(&comport
->sem
);
73 comport
->sem
.ss_Link
.ln_Name
= COMNAME
;
74 comport
->sem
.ss_Link
.ln_Pri
= -128;
76 comport
->pool
= CreatePool(MEMF_PUBLIC
, sizeof(struct ComMsg
) * 20,
77 sizeof(struct ComMsg
) * 20);
81 FreeVec(comport
);comport
=0;
83 I_Error("AROS_Net_Local: Out of memory!");
86 AddSemaphore(&comport
->sem
);
88 for(i
= 0;i
< MAX_PLAYERS
; i
++)
90 comport
->playerport
[i
].msgport
.mp_Node
.ln_Type
= NT_MSGPORT
;
91 comport
->playerport
[i
].msgport
.mp_Flags
= PA_IGNORE
;
92 comport
->playerport
[i
].msgport
.mp_SigBit
= 0;
93 comport
->playerport
[i
].msgport
.mp_SigTask
= NULL
;
95 NewList(&comport
->playerport
[i
].msgport
.mp_MsgList
);
99 if (comport
->playerport
[playerid
].inuse
)
102 I_Error("AROS_Net_Local: ComPort %ld already in use!\n", playerid
+ 1);
105 comport
->playerport
[playerid
].inuse
= TRUE
;
110 sendmsg
.playerid
= playerid
;
112 for(i
= 0;i
< doomcom
->numplayers
; i
++)
114 playerid_to_node
[i
] = -1;
118 for(i
= 0;i
< doomcom
->numplayers
; i
++)
122 D(bug("Player: %d playerid_to_node[%d] = %d\n",playerid
,i
,i2
));
123 playerid_to_node
[i
] = i2
++;
125 D(bug("Player: %d sendport[%d] = %d\n",playerid
,i3
,i
));
126 sendport
[i3
++] = &comport
->playerport
[i
].msgport
;
131 fastmsg_freeport
.mp_Node
.ln_Type
= NT_MSGPORT
;
132 fastmsg_freeport
.mp_Flags
= PA_IGNORE
;
133 NewList(&fastmsg_freeport
.mp_MsgList
);
135 for(i
= 0;i
< NUM_FASTMSG
; i
++)
137 fastmsg
[i
].msg
.mn_Node
.ln_Type
= NT_MESSAGE
;
138 fastmsg
[i
].msg
.mn_ReplyPort
= &fastmsg_freeport
;
139 fastmsg
[i
].msg
.mn_Length
= sizeof(struct ComMsg
);
141 PutMsg(&fastmsg_freeport
, &fastmsg
[i
].msg
);
147 /****************************************************************************/
149 void AROSNetLocal_NetCmd (void)
151 if (doomcom
->command
== CMD_SEND
) {
152 AROSNetLocal_NetSend ();
153 } else if (doomcom
->command
== CMD_GET
) {
154 AROSNetLocal_NetGet ();
156 I_Error ("AROS_Net_Local: Bad net cmd: %i\n",doomcom
->command
);
159 /****************************************************************************/
161 void AROSNetLocal_NetSend(void)
163 /* static int counter = 0; */
165 struct ComMsg
*msg
= (struct ComMsg
*)GetMsg(&fastmsg_freeport
);
166 /* no msg free ==> let's allocate one */
172 msg = AllocPooled(comport->pool,sizeof(struct ComMsg));
175 if (!msg) I_Error("AROS_Net_Local: Could not alloc ComMsg!");
176 msg->flags = CMF_ALLOCED;
177 msg->pool = comport->pool;
181 D(bug("Player %d (%06d): send to %d\n",playerid
,counter
++,doomcom
->remotenode
));
183 msg
->dd
= *netbuffer
;
185 msg
->datalen
= doomcom
->datalength
;
186 msg
->playerid
= playerid
;
188 PutMsg(sendport
[doomcom
->remotenode
], &msg
->msg
);
191 /****************************************************************************/
193 void AROSNetLocal_NetGet(void)
196 getmsg
= (struct ComMsg
*)GetMsg(&comport
->playerport
[playerid
].msgport
);
200 doomcom
->remotenode
= -1; // no packet
204 D(bug("player %d: -------- netget %d (node = %d)\n",
207 playerid_to_node
[getmsg
->playerid
]));
209 doomcom
->remotenode
= playerid_to_node
[getmsg
->playerid
];
210 doomcom
->datalength
= getmsg
->datalen
;
212 if (doomcom
->remotenode
< 0 || doomcom
->remotenode
>= MAX_PLAYERS
)
214 doomcom
->remotenode
= - 1;
216 *netbuffer
= getmsg
->dd
;
219 if (getmsg
->flags
& CMF_ALLOCED
)
222 FreePooled(getmsg
->pool
, getmsg
, sizeof(struct ComMsg
));
225 else if (!(getmsg
->flags
& CMF_DEAD
))
227 ReplyMsg(&getmsg
->msg
);
232 /****************************************************************************/
234 void AROSNetLocal_CleanupNetwork(void)
240 comport
->playerport
[playerid
].inuse
= FALSE
;
243 /* Make sure sent fastmsg's are not replied back */
245 for(i
= 0;i
< NUM_FASTMSG
; i
++)
247 fastmsg
[i
].flags
|= CMF_DEAD
;
250 if (comport
->users
== 0)
252 RemSemaphore(&comport
->sem
);
258 /****************************************************************************/