From patchwork Sun Oct 24 01:14:17 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Lindner X-Patchwork-Id: 442 Return-Path: Received: from nm17.bullet.mail.ukl.yahoo.com (nm17.bullet.mail.ukl.yahoo.com [217.146.183.191]) by open-mesh.org (Postfix) with SMTP id 3B1AA154540 for ; Sun, 24 Oct 2010 03:16:22 +0200 (CEST) Received: from [217.146.183.214] by nm17.bullet.mail.ukl.yahoo.com with NNFMP; 24 Oct 2010 01:16:21 -0000 Received: from [217.146.183.166] by tm7.bullet.mail.ukl.yahoo.com with NNFMP; 24 Oct 2010 01:16:20 -0000 Received: from [127.0.0.1] by omp1007.mail.ukl.yahoo.com with NNFMP; 24 Oct 2010 01:16:20 -0000 X-Yahoo-Newman-Id: 933080.18502.bm@omp1007.mail.ukl.yahoo.com Received: (qmail 79689 invoked from network); 24 Oct 2010 01:16:20 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.de; h=DKIM-Signature:Received:X-Yahoo-SMTP:X-YMail-OSG:X-Yahoo-Newman-Property:From:To:Cc:Subject:Date:Message-Id:X-Mailer:In-Reply-To:References; b=VMPjkcEVmyFa0rMbK9ST73WXj2gWBClFRX9omctjIQ69qmq9menH6be2ym7QL/EvRbiHaW1xD3FavUTZJyLj6ssx70g3H5I54DAbH19fNNoqrRTTSbYcps9N5IEs7rfBAg2PInDDvUjY2/Z7u1MUWmfucnocqx19yKACa7udTiY= ; DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s1024; t=1287882980; bh=Fv0ymnsamWKq0Z2hMB0aMqXUX+siZtmb3sEbH17ukl8=; h=Received:X-Yahoo-SMTP:X-YMail-OSG:X-Yahoo-Newman-Property:From:To:Cc:Subject:Date:Message-Id:X-Mailer:In-Reply-To:References; b=UtODiXBV0WmYQi1iAiHfHBVJv85k9aCqVSpEuGoBHpI3OZC8H+fE7VQOKBXOQYp1ajR0ftGoi+199zFRHJC0LNmhtj9Z+Z7wyP38NBI4Z3FnR+M1LNQhtRoT7qt8dvTHTxbWf5puQ+Q8Hkm9dadGw0D4jNzQ5Zn2frZ7YBL3Gpg= Received: from localhost (lindner_marek@78.225.40.81 with plain) by smtp133.mail.ukl.yahoo.com with SMTP; 24 Oct 2010 01:16:20 +0000 GMT X-Yahoo-SMTP: tW.h3tiswBBMXO2coYcbPigGD5Lt6zY_.Zc- X-YMail-OSG: LtPn550VM1mwIDEts7Se50vCEji_3KzrXqYYHCJrxMefEiE O_iw_yJ.vntORpjrUnvXgadsdANJAktNT006J0k2JB7T7dKLs2xzsJ.0HNtf U9J1Owfu8ndvoAW0Qal_dhGdyCtlJVrmCi3x2uvnglrGDvBlrw44Vd_jS502 SuqTof62NyipgLkr2_jXXD9JpqcH1kYeddQP_9JKmww4ax1i_F9A8vj4TMRC s9cncnaAIJRAWplIbfa7huw8.r.dEhlFv1gSb8I.2Mu_S_0f6 X-Yahoo-Newman-Property: ymail-3 From: Marek Lindner To: b.a.t.m.a.n@lists.open-mesh.org Date: Sun, 24 Oct 2010 03:14:17 +0200 Message-Id: <1287882863-11314-2-git-send-email-lindner_marek@yahoo.de> X-Mailer: git-send-email 1.7.1 In-Reply-To: <201010240313.35215.lindner_marek@yahoo.de> References: <201010240313.35215.lindner_marek@yahoo.de> Cc: Marek Lindner Subject: [B.A.T.M.A.N.] [PATCH 2/8] batman-adv: gateways silently drop DHCP requests X-BeenThere: b.a.t.m.a.n@lists.open-mesh.org X-Mailman-Version: 2.1.11 Precedence: list Reply-To: The list for a Better Approach To Mobile Ad-hoc Networking List-Id: The list for a Better Approach To Mobile Ad-hoc Networking List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 Oct 2010 01:16:22 -0000 Signed-off-by: Marek Lindner --- batman-adv/gateway_client.c | 31 +++++++++++++++++-------------- batman-adv/gateway_client.h | 2 +- batman-adv/soft-interface.c | 16 ++++++++++------ 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/batman-adv/gateway_client.c b/batman-adv/gateway_client.c index 1cd7e0a..6c6a0b3 100644 --- a/batman-adv/gateway_client.c +++ b/batman-adv/gateway_client.c @@ -400,54 +400,57 @@ int gw_client_seq_print_text(struct seq_file *seq, void *offset) return 0; } -bool gw_is_target(struct bat_priv *bat_priv, struct sk_buff *skb) +int gw_is_target(struct bat_priv *bat_priv, struct sk_buff *skb) { struct ethhdr *ethhdr; struct iphdr *iphdr; struct udphdr *udphdr; unsigned int header_len = 0; - if (atomic_read(&bat_priv->gw_mode) != GW_MODE_CLIENT) - return false; - - if (!bat_priv->curr_gw) - return false; + if (atomic_read(&bat_priv->gw_mode) == GW_MODE_OFF) + return 0; /* check for ethernet header */ if (!pskb_may_pull(skb, header_len + ETH_HLEN)) - return false; + return 0; ethhdr = (struct ethhdr *)skb->data; header_len += ETH_HLEN; /* check for initial vlan header */ if (ntohs(ethhdr->h_proto) == ETH_P_8021Q) { if (!pskb_may_pull(skb, header_len + VLAN_HLEN)) - return false; + return 0; ethhdr = (struct ethhdr *)(skb->data + VLAN_HLEN); header_len += VLAN_HLEN; } /* check for ip header */ if (ntohs(ethhdr->h_proto) != ETH_P_IP) - return false; + return 0; if (!pskb_may_pull(skb, header_len + sizeof(struct iphdr))) - return false; + return 0; iphdr = (struct iphdr *)(skb->data + header_len); header_len += iphdr->ihl * 4; /* check for udp header */ if (iphdr->protocol != IPPROTO_UDP) - return false; + return 0; if (!pskb_may_pull(skb, header_len + sizeof(struct udphdr))) - return false; + return 0; udphdr = (struct udphdr *)(skb->data + header_len); header_len += sizeof(struct udphdr); /* check for bootp port */ if (ntohs(udphdr->dest) != 67) - return false; + return 0; + + if (atomic_read(&bat_priv->gw_mode) == GW_MODE_SERVER) + return -1; + + if (!bat_priv->curr_gw) + return 0; - return true; + return 1; } diff --git a/batman-adv/gateway_client.h b/batman-adv/gateway_client.h index 38699ba..4585e65 100644 --- a/batman-adv/gateway_client.h +++ b/batman-adv/gateway_client.h @@ -31,6 +31,6 @@ void gw_node_update(struct bat_priv *bat_priv, void gw_node_delete(struct bat_priv *bat_priv, struct orig_node *orig_node); void gw_node_purge(struct bat_priv *bat_priv); int gw_client_seq_print_text(struct seq_file *seq, void *offset); -bool gw_is_target(struct bat_priv *bat_priv, struct sk_buff *skb); +int gw_is_target(struct bat_priv *bat_priv, struct sk_buff *skb); #endif /* _NET_BATMAN_ADV_GATEWAY_CLIENT_H_ */ diff --git a/batman-adv/soft-interface.c b/batman-adv/soft-interface.c index a13276b..25564c3 100644 --- a/batman-adv/soft-interface.c +++ b/batman-adv/soft-interface.c @@ -349,7 +349,7 @@ int interface_tx(struct sk_buff *skb, struct net_device *soft_iface) struct vlan_ethhdr *vhdr; int data_len = skb->len, ret; short vid = -1; - bool bcast_dst = false, do_bcast = true; + bool do_bcast = false; if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE) goto dropped; @@ -380,14 +380,18 @@ int interface_tx(struct sk_buff *skb, struct net_device *soft_iface) /* TODO: check this for locks */ hna_local_add(soft_iface, ethhdr->h_source); - if (is_bcast(ethhdr->h_dest) || is_mcast(ethhdr->h_dest)) - bcast_dst = true; + if (is_bcast(ethhdr->h_dest) || is_mcast(ethhdr->h_dest)) { + ret = gw_is_target(bat_priv, skb); - if ((bcast_dst) && gw_is_target(bat_priv, skb)) - do_bcast = false; + if (ret < 0) + goto dropped; + + if (ret == 0) + do_bcast = true; + } /* ethernet packet should be broadcasted */ - if (bcast_dst && do_bcast) { + if (do_bcast) { if (!bat_priv->primary_if) goto dropped;