mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2024-11-29 15:04:23 +01:00
First round of network refactoring: The network connection will be
stateless. Currently only getting the list of peers will work, but more is on the way.
This commit is contained in:
parent
52952df100
commit
240c89f783
@ -171,24 +171,6 @@ void C64::network_vblank()
|
|||||||
js = &TheCIA1->Joystick1;
|
js = &TheCIA1->Joystick1;
|
||||||
else
|
else
|
||||||
js = &TheCIA1->Joystick2;
|
js = &TheCIA1->Joystick2;
|
||||||
} else if (this->network_connection_type == CONNECT) {
|
|
||||||
network_connection_error_t err = this->network->ConnectFSM();
|
|
||||||
|
|
||||||
if (err == OK) {
|
|
||||||
if (this->network->is_master)
|
|
||||||
this->network_connection_type = MASTER;
|
|
||||||
else
|
|
||||||
this->network_connection_type = CLIENT;
|
|
||||||
this->linecnt = 0;
|
|
||||||
}
|
|
||||||
else if (err != AGAIN_ERROR)
|
|
||||||
{
|
|
||||||
if (err == VERSION_ERROR)
|
|
||||||
Gui::gui->status_bar->queueMessage("Get a new version at http://www.c64-network.org");
|
|
||||||
delete remote;
|
|
||||||
this->network = NULL;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
} else {
|
} else {
|
||||||
if (ThePrefs.JoystickSwap)
|
if (ThePrefs.JoystickSwap)
|
||||||
js = &TheCIA1->Joystick2;
|
js = &TheCIA1->Joystick2;
|
||||||
@ -196,6 +178,7 @@ void C64::network_vblank()
|
|||||||
js = &TheCIA1->Joystick1;
|
js = &TheCIA1->Joystick1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
remote->ResetNetworkUpdate();
|
||||||
/* Has the peer sent any data? */
|
/* Has the peer sent any data? */
|
||||||
if (remote->ReceiveUpdate() == true)
|
if (remote->ReceiveUpdate() == true)
|
||||||
{
|
{
|
||||||
@ -214,6 +197,8 @@ void C64::network_vblank()
|
|||||||
if (this->network_connection_type == CLIENT)
|
if (this->network_connection_type == CLIENT)
|
||||||
this->TheDisplay->Update(remote->GetScreen());
|
this->TheDisplay->Update(remote->GetScreen());
|
||||||
}
|
}
|
||||||
|
if (this->network_connection_type == CONNECT)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Encode and send updates to the other side (what is determined by
|
/* Encode and send updates to the other side (what is determined by
|
||||||
* if this is the master or not) */
|
* if this is the master or not) */
|
||||||
@ -239,7 +224,6 @@ void C64::network_vblank()
|
|||||||
/* Disconnect or broken data */
|
/* Disconnect or broken data */
|
||||||
printf("Could not send update\n");
|
printf("Could not send update\n");
|
||||||
}
|
}
|
||||||
remote->ResetNetworkUpdate();
|
|
||||||
|
|
||||||
static uint32_t last_traffic_update;
|
static uint32_t last_traffic_update;
|
||||||
|
|
||||||
|
@ -561,18 +561,18 @@ bool Network::ReceiveUpdate(NetworkUpdate *dst, size_t total_sz,
|
|||||||
size_t received = 0;
|
size_t received = 0;
|
||||||
bool has_stop = false;
|
bool has_stop = false;
|
||||||
|
|
||||||
if (this->Select(this->sock, tv) == false)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (sz_left <= 0)
|
if (sz_left <= 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
printf("Have something\n");
|
|
||||||
/* Receive the header */
|
/* Receive the header */
|
||||||
do {
|
do {
|
||||||
|
if (this->Select(this->sock, tv) == false)
|
||||||
|
return false;
|
||||||
|
/* Only timeout the first run */
|
||||||
|
tv = NULL;
|
||||||
|
|
||||||
ssize_t actual_sz = this->ReceiveFrom(p, this->sock,
|
ssize_t actual_sz = this->ReceiveFrom(p, this->sock,
|
||||||
4096, NULL);
|
4096, NULL);
|
||||||
printf("AS: %d\n", actual_sz);
|
|
||||||
if (actual_sz <= 0)
|
if (actual_sz <= 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -904,7 +904,8 @@ bool Network::DecodeUpdate(C64Display *display, uint8 *js, MOS6581 *dst)
|
|||||||
|
|
||||||
while (p->type != STOP)
|
while (p->type != STOP)
|
||||||
{
|
{
|
||||||
printf("decoding %d\n", p->type);
|
if (p->magic != FRODO_NETWORK_MAGIC)
|
||||||
|
break;
|
||||||
switch(p->type)
|
switch(p->type)
|
||||||
{
|
{
|
||||||
case SOUND_UPDATE:
|
case SOUND_UPDATE:
|
||||||
@ -940,15 +941,8 @@ bool Network::DecodeUpdate(C64Display *display, uint8 *js, MOS6581 *dst)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TEXT_MESSAGE:
|
case TEXT_MESSAGE:
|
||||||
{
|
Gui::gui->status_bar->queueMessage((const char*)p->data);
|
||||||
static char display_buf[80];
|
break;
|
||||||
|
|
||||||
strncpy(display_buf, (char*)p->data, 80);
|
|
||||||
display->display_status_string(display_buf, 4);
|
|
||||||
} break;
|
|
||||||
case LIST_PEERS:
|
|
||||||
{
|
|
||||||
} break;
|
|
||||||
case REGISTER_DATA:
|
case REGISTER_DATA:
|
||||||
{
|
{
|
||||||
NetworkUpdateRegisterData *rd = (NetworkUpdateRegisterData *)p->data;
|
NetworkUpdateRegisterData *rd = (NetworkUpdateRegisterData *)p->data;
|
||||||
@ -965,7 +959,50 @@ bool Network::DecodeUpdate(C64Display *display, uint8 *js, MOS6581 *dst)
|
|||||||
if (ud->type == BANDWIDTH_PING)
|
if (ud->type == BANDWIDTH_PING)
|
||||||
type = BANDWIDTH_ACK;
|
type = BANDWIDTH_ACK;
|
||||||
this->SendPingAck(ping->seq, type, ud->size);
|
this->SendPingAck(ping->seq, type, ud->size);
|
||||||
|
this->SendServerUpdate();
|
||||||
|
this->ResetNetworkUpdate();
|
||||||
} break;
|
} break;
|
||||||
|
case LIST_PEERS:
|
||||||
|
{
|
||||||
|
NetworkUpdateListPeers *lp = (NetworkUpdateListPeers *)this->ud->data;
|
||||||
|
|
||||||
|
if (lp->n_peers == 1 && (lp->flags & NETWORK_UPDATE_LIST_PEERS_IS_CONNECT))
|
||||||
|
{
|
||||||
|
NetworkUpdatePeerInfo *pi = &lp->peers[0];
|
||||||
|
|
||||||
|
printf("FiXME! Got peer: %s, %d\n", (char*)pi->public_ip, pi->public_port);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < lp->n_peers; i++)
|
||||||
|
{
|
||||||
|
if (lp->peers[i].version != FRODO_NETWORK_PROTOCOL_VERSION)
|
||||||
|
{
|
||||||
|
warning("Peer %d has wrong version: %d vs %d\n",
|
||||||
|
i, lp->peers[i].version, FRODO_NETWORK_PROTOCOL_VERSION);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lp->n_peers == 0)
|
||||||
|
{
|
||||||
|
Gui::gui->status_bar->queueMessage("No peers, waiting for connection...");
|
||||||
|
this->is_master = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* FIXME! Not necessarily true! */
|
||||||
|
this->is_master = false;
|
||||||
|
|
||||||
|
Gui::gui->status_bar->queueMessage("Got list of peers");
|
||||||
|
Gui::gui->nuv->setPeers(lp);
|
||||||
|
Gui::gui->activate();
|
||||||
|
Gui::gui->pushView(Gui::gui->nuv);
|
||||||
|
} break;
|
||||||
|
case CONNECT_TO_PEER:
|
||||||
|
if (this->is_master)
|
||||||
|
TheC64->network_connection_type = MASTER;
|
||||||
|
else
|
||||||
|
TheC64->network_connection_type = CLIENT;
|
||||||
|
break;
|
||||||
case BANDWIDTH_ACK:
|
case BANDWIDTH_ACK:
|
||||||
case ACK:
|
case ACK:
|
||||||
/* We won't receive this, but it also doesn't really matter */
|
/* We won't receive this, but it also doesn't really matter */
|
||||||
@ -1028,7 +1065,6 @@ bool Network::ConnectToBroker()
|
|||||||
/* Reset peer selection */
|
/* Reset peer selection */
|
||||||
this->peer_selected = -1;
|
this->peer_selected = -1;
|
||||||
|
|
||||||
pi->is_master = 0; /* Will be set later */
|
|
||||||
pi->key = ThePrefs.NetworkKey;
|
pi->key = ThePrefs.NetworkKey;
|
||||||
pi->version = FRODO_NETWORK_PROTOCOL_VERSION;
|
pi->version = FRODO_NETWORK_PROTOCOL_VERSION;
|
||||||
pi->avatar = ThePrefs.NetworkAvatar;
|
pi->avatar = ThePrefs.NetworkAvatar;
|
||||||
|
@ -157,12 +157,14 @@ struct NetworkUpdatePeerInfo
|
|||||||
uint32 screenshot_key; /* Key number of the screenshot */
|
uint32 screenshot_key; /* Key number of the screenshot */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define NETWORK_UPDATE_LIST_PEERS_IS_CONNECT 1
|
||||||
struct NetworkUpdateListPeers
|
struct NetworkUpdateListPeers
|
||||||
{
|
{
|
||||||
uint32 n_peers;
|
uint32 n_peers;
|
||||||
uint8 your_ip[16];
|
uint8 your_ip[16];
|
||||||
uint16 your_port;
|
uint16 your_port;
|
||||||
uint8 d[2]; /* Pad to 4 bytes */
|
uint8 flags;
|
||||||
|
uint8 d; /* Pad to 4 bytes */
|
||||||
|
|
||||||
/* Followed by the actual peers */
|
/* Followed by the actual peers */
|
||||||
NetworkUpdatePeerInfo peers[];
|
NetworkUpdatePeerInfo peers[];
|
||||||
@ -264,11 +266,31 @@ public:
|
|||||||
void Disconnect();
|
void Disconnect();
|
||||||
|
|
||||||
bool is_master; /* Some peers are more equal than others */
|
bool is_master; /* Some peers are more equal than others */
|
||||||
protected:
|
|
||||||
void InitNetwork();
|
void InitNetwork();
|
||||||
|
|
||||||
void ShutdownNetwork();
|
void ShutdownNetwork();
|
||||||
|
|
||||||
|
|
||||||
|
bool ConnectToBroker();
|
||||||
|
|
||||||
|
bool ConnectToPeer();
|
||||||
|
|
||||||
|
bool WaitForPeerReply();
|
||||||
|
|
||||||
|
bool SendBandWidthTest();
|
||||||
|
|
||||||
|
network_connection_error_t WaitForBandWidthReply();
|
||||||
|
|
||||||
|
network_connection_error_t WaitForPeerList();
|
||||||
|
|
||||||
|
network_connection_error_t WaitForPeerAddress();
|
||||||
|
|
||||||
|
network_connection_error_t WaitForPeerSelection();
|
||||||
|
|
||||||
|
bool SelectPeer(uint32 id);
|
||||||
|
|
||||||
|
protected:
|
||||||
/** Encode part of a screen into @a dst in a single sweep
|
/** Encode part of a screen into @a dst in a single sweep
|
||||||
*
|
*
|
||||||
* @param dst the destination update structure
|
* @param dst the destination update structure
|
||||||
@ -347,26 +369,8 @@ protected:
|
|||||||
|
|
||||||
bool ScanDataForStop(NetworkUpdate *ud, size_t max_size);
|
bool ScanDataForStop(NetworkUpdate *ud, size_t max_size);
|
||||||
|
|
||||||
bool ConnectToBroker();
|
|
||||||
|
|
||||||
bool AppendScreenshot(NetworkUpdatePeerInfo *pi);
|
bool AppendScreenshot(NetworkUpdatePeerInfo *pi);
|
||||||
|
|
||||||
bool ConnectToPeer();
|
|
||||||
|
|
||||||
bool WaitForPeerReply();
|
|
||||||
|
|
||||||
bool SendBandWidthTest();
|
|
||||||
|
|
||||||
network_connection_error_t WaitForBandWidthReply();
|
|
||||||
|
|
||||||
network_connection_error_t WaitForPeerList();
|
|
||||||
|
|
||||||
network_connection_error_t WaitForPeerAddress();
|
|
||||||
|
|
||||||
network_connection_error_t WaitForPeerSelection();
|
|
||||||
|
|
||||||
bool SelectPeer(uint32 id);
|
|
||||||
|
|
||||||
size_t FillNetworkBuffer(NetworkUpdate *p);
|
size_t FillNetworkBuffer(NetworkUpdate *p);
|
||||||
|
|
||||||
NetworkUpdate *GetNext(NetworkUpdate *p)
|
NetworkUpdate *GetNext(NetworkUpdate *p)
|
||||||
|
@ -74,6 +74,7 @@ public:
|
|||||||
TheC64->network = new Network(Gui::gui->np->NetworkServer,
|
TheC64->network = new Network(Gui::gui->np->NetworkServer,
|
||||||
Gui::gui->np->NetworkPort);
|
Gui::gui->np->NetworkPort);
|
||||||
TheC64->network_connection_type = CONNECT;
|
TheC64->network_connection_type = CONNECT;
|
||||||
|
TheC64->network->ConnectToBroker();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
|
@ -192,8 +192,11 @@ public:
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this->freePeers();
|
this->freePeers();
|
||||||
|
this->n_peers = peerList->n_peers;
|
||||||
messages = (const char **)xmalloc( (peerList->n_peers + 1) *
|
messages = (const char **)xmalloc( (peerList->n_peers + 1) *
|
||||||
sizeof(const char*));
|
sizeof(const char*));
|
||||||
|
this->peers = (PeerInfo**)xrealloc((void*)this->peers,
|
||||||
|
peerList->n_peers * sizeof(PeerInfo*));
|
||||||
|
|
||||||
for (unsigned i = 0; i < peerList->n_peers; i++)
|
for (unsigned i = 0; i < peerList->n_peers; i++)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user