|
|
|
@ -1012,7 +1012,7 @@ send_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
/* forward the packet to all who are behind a firewall */
|
|
|
|
|
void
|
|
|
|
|
fwd_pkg (struct pkg *packet)
|
|
|
|
|
fwd_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
|
{
|
|
|
|
|
int pl;
|
|
|
|
|
|
|
|
|
@ -1025,110 +1025,113 @@ fwd_pkg (struct pkg *packet)
|
|
|
|
|
|| packet->h.typ == PKG_special)
|
|
|
|
|
for (pl = 1; pl < MAX_PLAYERS; pl++)
|
|
|
|
|
if (PS_IS_netplayer (bman.players[pl].state)
|
|
|
|
|
&& (bman.players[pl].net.flags & NETF_firewall) == NETF_firewall)
|
|
|
|
|
&& (bman.players[pl].net.flags & NETF_firewall) == NETF_firewall
|
|
|
|
|
&& ((strncmp (bman.players[pl].net.addr.host, addr->host, LEN_SERVERNAME) != 0)
|
|
|
|
|
|| (strncmp (bman.players[pl].net.addr.port, addr->port, LEN_PORT) != 0))) {
|
|
|
|
|
d_printf ("fwd_pkg %s:%s --> %s:%s\n", addr->host, addr->port, bman.players[pl].net.addr.host, bman.players[pl].net.addr.port);
|
|
|
|
|
send_pkg (packet, &bman.players[pl].net.addr);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
do_pkg (struct pkg *packet, _net_addr * addr) {
|
|
|
|
|
if ((((packet->h.flags & PKGF_ipv6) == 0 && bman.net_ai_family != PF_INET) ||
|
|
|
|
|
((packet->h.flags & PKGF_ipv6) != 0 && bman.net_ai_family == PF_INET)) &&
|
|
|
|
|
packet->h.typ != PKG_bcmservchat) {
|
|
|
|
|
d_printf ("-----packet comes from the wrong network type\n");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
int
|
|
|
|
|
do_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
|
{
|
|
|
|
|
if ((((packet->h.flags & PKGF_ipv6) == 0 && bman.net_ai_family != PF_INET) ||
|
|
|
|
|
((packet->h.flags & PKGF_ipv6) != 0 && bman.net_ai_family == PF_INET)) &&
|
|
|
|
|
packet->h.typ != PKG_bcmservchat) {
|
|
|
|
|
d_printf ("-----packet comes from the wrong network type\n");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* get the addr and set the ping timeout value */
|
|
|
|
|
addr->pl_nr = get_player_nr (addr->host, addr->port);
|
|
|
|
|
bman.players[addr->pl_nr].net.timestamp = timestamp;
|
|
|
|
|
bman.players[addr->pl_nr].net.pingreq = bman.players[addr->pl_nr].net.pingack + 5;
|
|
|
|
|
|
|
|
|
|
/* test if we have any important packet */
|
|
|
|
|
if (packet->h.flags & PKGF_ackreq && packet->h.typ != PKG_bcmservchat)
|
|
|
|
|
send_pkgack (addr, packet->h.typ, packet->h.id);
|
|
|
|
|
|
|
|
|
|
/* check the packet with the index */
|
|
|
|
|
if (packet->h.typ != PKG_bcmservchat
|
|
|
|
|
&& inpkg_check (packet->h.typ, packet->h.id, addr) != -1) {
|
|
|
|
|
/* we have got this packet already */
|
|
|
|
|
d_printf ("-----packet ignored\n");
|
|
|
|
|
if (addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS)
|
|
|
|
|
bman.players[addr->pl_nr].net.pkgopt.to_2sec++;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
/* get the addr and set the ping timeout value */
|
|
|
|
|
addr->pl_nr = get_player_nr (addr->host, addr->port);
|
|
|
|
|
bman.players[addr->pl_nr].net.timestamp = timestamp;
|
|
|
|
|
bman.players[addr->pl_nr].net.pingreq = bman.players[addr->pl_nr].net.pingack + 5;
|
|
|
|
|
|
|
|
|
|
/* test if we have any important packet */
|
|
|
|
|
if (packet->h.flags & PKGF_ackreq && packet->h.typ != PKG_bcmservchat)
|
|
|
|
|
send_pkgack (addr, packet->h.typ, packet->h.id);
|
|
|
|
|
|
|
|
|
|
/* check the packet with the index */
|
|
|
|
|
if (packet->h.typ != PKG_bcmservchat && inpkg_check (packet->h.typ, packet->h.id, addr) != -1) {
|
|
|
|
|
/* we have got this packet already */
|
|
|
|
|
d_printf ("-----packet ignored\n");
|
|
|
|
|
if (addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS)
|
|
|
|
|
bman.players[addr->pl_nr].net.pkgopt.to_2sec++;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* check if the incoming packet have the right size */
|
|
|
|
|
if (packet->h.typ == PKG_servermode && packet->h.len != sizeof (struct pkg_servermode))
|
|
|
|
|
send_error (addr, "pkg_servermode: packetsize incorrect.");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* forward packet */
|
|
|
|
|
if (GT_MP_PTPM)
|
|
|
|
|
fwd_pkg (packet);
|
|
|
|
|
|
|
|
|
|
switch (packet->h.typ) {
|
|
|
|
|
case (PKG_error):
|
|
|
|
|
if (do_error ((struct pkg_error *) packet, addr) < 0)
|
|
|
|
|
return -1;
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_playerid):
|
|
|
|
|
do_playerid ((struct pkg_playerid *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_servermode):
|
|
|
|
|
do_servermode ((struct pkg_servermode *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_field):
|
|
|
|
|
do_field ((struct pkg_field *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_pingreq):
|
|
|
|
|
do_ping ((struct pkg_ping *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_pingack):
|
|
|
|
|
do_ping ((struct pkg_ping *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_bombdata):
|
|
|
|
|
do_bombdata ((struct pkg_bombdata *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_playerdata):
|
|
|
|
|
do_playerdata ((struct pkg_playerdata *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_quit):
|
|
|
|
|
do_quit ((struct pkg_quit *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_getfield):
|
|
|
|
|
do_getfield ((struct pkg_getfield *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_getplayerdata):
|
|
|
|
|
do_getplayerdata ((struct pkg_getplayerdata *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_fieldline):
|
|
|
|
|
do_fieldline ((struct pkg_fieldline *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_playerstatus):
|
|
|
|
|
do_playerstatus ((struct pkg_playerstatus *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_pkgack):
|
|
|
|
|
do_pkgack ((struct pkg_pkgack *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_chat):
|
|
|
|
|
do_chat ((struct pkg_chat *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_playermove):
|
|
|
|
|
do_playermove ((struct pkg_playermove *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_bcmservchat):
|
|
|
|
|
do_bcmservchat ((struct pkg_bcmservchat *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_ill):
|
|
|
|
|
do_ill ((struct pkg_ill *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_special):
|
|
|
|
|
do_special ((struct pkg_special *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
send_error (addr, "BomberClone: unknown data packet");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
/* check if the incoming packet have the right size */
|
|
|
|
|
if (packet->h.typ == PKG_servermode && packet->h.len != sizeof (struct pkg_servermode))
|
|
|
|
|
send_error (addr, "pkg_servermode: packetsize incorrect.");
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
};
|
|
|
|
|
/* forward packet */
|
|
|
|
|
if (GT_MP_PTPM)
|
|
|
|
|
fwd_pkg (packet, addr);
|
|
|
|
|
|
|
|
|
|
switch (packet->h.typ) {
|
|
|
|
|
case (PKG_error):
|
|
|
|
|
if (do_error ((struct pkg_error *) packet, addr) < 0)
|
|
|
|
|
return -1;
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_playerid):
|
|
|
|
|
do_playerid ((struct pkg_playerid *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_servermode):
|
|
|
|
|
do_servermode ((struct pkg_servermode *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_field):
|
|
|
|
|
do_field ((struct pkg_field *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_pingreq):
|
|
|
|
|
do_ping ((struct pkg_ping *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_pingack):
|
|
|
|
|
do_ping ((struct pkg_ping *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_bombdata):
|
|
|
|
|
do_bombdata ((struct pkg_bombdata *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_playerdata):
|
|
|
|
|
do_playerdata ((struct pkg_playerdata *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_quit):
|
|
|
|
|
do_quit ((struct pkg_quit *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_getfield):
|
|
|
|
|
do_getfield ((struct pkg_getfield *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_getplayerdata):
|
|
|
|
|
do_getplayerdata ((struct pkg_getplayerdata *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_fieldline):
|
|
|
|
|
do_fieldline ((struct pkg_fieldline *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_playerstatus):
|
|
|
|
|
do_playerstatus ((struct pkg_playerstatus *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_pkgack):
|
|
|
|
|
do_pkgack ((struct pkg_pkgack *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_chat):
|
|
|
|
|
do_chat ((struct pkg_chat *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_playermove):
|
|
|
|
|
do_playermove ((struct pkg_playermove *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_bcmservchat):
|
|
|
|
|
do_bcmservchat ((struct pkg_bcmservchat *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_ill):
|
|
|
|
|
do_ill ((struct pkg_ill *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_special):
|
|
|
|
|
do_special ((struct pkg_special *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
send_error (addr, "BomberClone: unknown data packet");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
};
|
|
|
|
|