bridge: simplify ip_mc_check_igmp() and ipv6_mc_check_mld() calls
This patch refactors ip_mc_check_igmp(), ipv6_mc_check_mld() and their callers (more precisely, the Linux bridge) to not rely on the skb_trimmed parameter anymore. An skb with its tail trimmed to the IP packet length was initially introduced for the following three reasons: 1) To be able to verify the ICMPv6 checksum. 2) To be able to distinguish the version of an IGMP or MLD query. They are distinguishable only by their size. 3) To avoid parsing data for an IGMPv3 or MLDv2 report that is beyond the IP packet but still within the skb. The first case still uses a cloned and potentially trimmed skb to verfiy. However, there is no need to propagate it to the caller. For the second and third case explicit IP packet length checks were added. This hopefully makes ip_mc_check_igmp() and ipv6_mc_check_mld() easier to read and verfiy, as well as easier to use. Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
6679cf099b
commit
ba5ea61462
@@ -674,7 +674,7 @@ static void batadv_mcast_mla_update(struct work_struct *work)
|
||||
*/
|
||||
static bool batadv_mcast_is_report_ipv4(struct sk_buff *skb)
|
||||
{
|
||||
if (ip_mc_check_igmp(skb, NULL) < 0)
|
||||
if (ip_mc_check_igmp(skb) < 0)
|
||||
return false;
|
||||
|
||||
switch (igmp_hdr(skb)->type) {
|
||||
@@ -741,7 +741,7 @@ static int batadv_mcast_forw_mode_check_ipv4(struct batadv_priv *bat_priv,
|
||||
*/
|
||||
static bool batadv_mcast_is_report_ipv6(struct sk_buff *skb)
|
||||
{
|
||||
if (ipv6_mc_check_mld(skb, NULL) < 0)
|
||||
if (ipv6_mc_check_mld(skb) < 0)
|
||||
return false;
|
||||
|
||||
switch (icmp6_hdr(skb)->icmp6_type) {
|
||||
|
Reference in New Issue
Block a user