From 22de75c69a60c8e89e39d03885ef261dcdae46eb Mon Sep 17 00:00:00 2001 From: stpohle Date: Thu, 29 May 2003 21:35:03 +0000 Subject: [PATCH] Network Packet Forwarding added for people behind a firewall --- src/network.c | 18 ++--- src/network.h | 2 + src/packets.c | 207 +++++++++++++++++++++++++------------------------- src/packets.h | 2 +- src/udp.c | 6 +- 5 files changed, 120 insertions(+), 115 deletions(-) diff --git a/src/network.c b/src/network.c index 2cbbc30..d8b31e7 100644 --- a/src/network.c +++ b/src/network.c @@ -1,4 +1,4 @@ -/* $Id: network.c,v 1.26 2003/05/29 20:49:53 stpohle Exp $ */ +/* $Id: network.c,v 1.27 2003/05/29 21:35:03 stpohle Exp $ */ /* network routines. */ @@ -546,7 +546,7 @@ net_game_send_player (int p_nr) } else if (p_nr == bman.p_nr) { for (p = 0; p < MAX_PLAYERS; p++) - if (PS_IS_netplayer (bman.players[p].state) && p != bman.p_nr && (bman.players[p].net.flags & NETF_firewall) == 0) + if (PS_IS_netplayer (bman.players[p].state) && p != bman.p_nr && NET_CANSEND(p)) send_playerdata (&bman.players[p].net.addr, p_nr, &bman.players[p_nr]); } }; @@ -563,7 +563,7 @@ net_game_send_playermove (int p_nr, int mustsend) pl = &bman.players[p_nr]; pl->net.pkgopt.send_to--; - if ((pl->net.pkgopt.send_to <= 0 || mustsend) && ( GT_MP_PTPM || (bman.players[p].net.flags & NETF_firewall) == 0)) + if ((pl->net.pkgopt.send_to <= 0 || mustsend) && NET_CANSEND(p)) send_playermove (&bman.players[p].net.addr, p_nr, pl); /* network packet send control */ @@ -587,7 +587,7 @@ net_game_send_bomb (int p, int b) return; for (pl = 0; pl < MAX_PLAYERS; pl++) - if (PS_IS_netplayer (bman.players[pl].state) && pl != bman.p_nr && ( GT_MP_PTPM || (bman.players[p].net.flags & NETF_firewall) == 0)) + if (PS_IS_netplayer (bman.players[pl].state) && pl != bman.p_nr && NET_CANSEND(pl)) send_bombdata (&bman.players[pl].net.addr, p, b, &bman.players[p].bombs[b]); }; @@ -603,7 +603,7 @@ net_game_send_field (int x, int y) return; for (pl = 0; pl < MAX_PLAYERS; pl++) - if (PS_IS_netplayer (bman.players[pl].state) && pl != bman.p_nr && ( GT_MP_PTPM || (bman.players[pl].net.flags & NETF_firewall) == 0)) + if (PS_IS_netplayer (bman.players[pl].state) && pl != bman.p_nr && NET_CANSEND(pl)) send_field (&bman.players[pl].net.addr, x, y, &bman.field[x][y]); }; @@ -674,7 +674,7 @@ net_send_servermode () int i; for (i = 0; i < MAX_PLAYERS; i++) - if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr && ( GT_MP_PTPM || (bman.players[i].net.flags & NETF_firewall) == 0)) + if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr && NET_CANSEND(i)) send_servermode (&bman.players[i].net.addr, i); if (GT_MP_PTPM && bman.notifygamemaster) /* send notification the the gamemaster */ @@ -707,7 +707,7 @@ net_send_chat (char *text, signed char notigamesrv) int i; for (i = 0; i < MAX_PLAYERS; i++) - if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr && ( GT_MP_PTPM || (bman.players[i].net.flags & NETF_firewall) == 0)) + if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr && NET_CANSEND(i)) send_chat (&bman.players[i].net.addr, text); if (GT_MP_PTPM && bman.notifygamemaster && notigamesrv == 1) /* send notification the the gamemaster */ @@ -723,7 +723,7 @@ net_game_send_ill (int p_nr) d_printf ("net_game_send_ill (%d)\n", p_nr); for (i = 0; i < MAX_PLAYERS; i++) - if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr && ( GT_MP_PTPM || (bman.players[i].net.flags & NETF_firewall) == 0)) + if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr && NET_CANSEND(i)) send_ill (&bman.players[i].net.addr, p_nr, &bman.players[p_nr]); }; @@ -801,6 +801,6 @@ net_game_send_special (int pl_nr, int ex_nr) return; for (pl = 0; pl < MAX_PLAYERS; pl++) - if (PS_IS_netplayer (bman.players[pl].state) && pl != pl_nr && ( GT_MP_PTPM || (bman.players[pl].net.flags & NETF_firewall) == 0)) + if (PS_IS_netplayer (bman.players[pl].state) && pl != pl_nr && NET_CANSEND(pl)) send_special (&bman.players[pl].net.addr, pl_nr, bman.players[pl_nr].special, ex_nr); }; diff --git a/src/network.h b/src/network.h index 51b23c8..cba9cd9 100644 --- a/src/network.h +++ b/src/network.h @@ -21,6 +21,8 @@ network.h file... for everything what have to do with the network stuff #define GS_WAITRUNNING (bman.state == GS_wait || bman.state == GS_ready || bman.state == GS_running) +#define NET_CANSEND(__pl) (( __pl == 0 || GT_MP_PTPM || (bman.players[__pl].net.flags & NETF_firewall) == 0)) + #ifdef _WIN32 #define _sockaddr sockaddr #else diff --git a/src/packets.c b/src/packets.c index fc835de..38670c7 100644 --- a/src/packets.c +++ b/src/packets.c @@ -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; +}; diff --git a/src/packets.h b/src/packets.h index 9a62645..6ccc45c 100644 --- a/src/packets.h +++ b/src/packets.h @@ -272,7 +272,7 @@ extern void send_chat (_net_addr *addr, char *text); extern void send_ill (_net_addr *addr, int p_nr, _player *pl); extern void send_special (_net_addr *addr, int p_nr, int typ, int ex_nr); -extern void fwd_pkg (struct pkg *packet); +extern void fwd_pkg (struct pkg *packet, _net_addr *addr); extern int get_player_nr (char *host, char *port); extern int inpkg_check (unsigned char typ, short int id, _net_addr *addr); diff --git a/src/udp.c b/src/udp.c index 45de805..c32b7cf 100644 --- a/src/udp.c +++ b/src/udp.c @@ -1,4 +1,4 @@ -/* $Id: udp.c,v 1.8 2003/05/12 12:36:34 stpohle Exp $ */ +/* $Id: udp.c,v 1.9 2003/05/29 21:35:04 stpohle Exp $ */ /* udp.c code for the network File Version 0.2 */ @@ -141,11 +141,11 @@ dns_filladdr (char *host, int hostlen, char *port, int portlen, int ai_family, void udp_send (int sock, char *text, int len, struct _sockaddr *sAddr, int ai_family) { - int addrlen; + int addrlen = sizeof (struct sockaddr_in); +#ifndef _WIN32 if (ai_family == PF_INET) addrlen = sizeof (struct sockaddr_in); -#ifndef _WIN32 else addrlen = sizeof (struct sockaddr_in6); #endif