public inbox for netdev@vger.kernel.org 
 help / color / mirror / Atom feed
From: Roger Luethi <rl@hellgate•ch>
To: David Stevens <dlstevens@us•ibm.com>
Cc: Andrew Morton <akpm@osdl•org>, David Dillow <dave@thedillows•org>,
	Jeff Garzik <jgarzik@pobox•com>, Netdev <netdev@oss•sgi.com>
Subject: Re: [0/3] mc_filter on big-endian arch
Date: Thu, 10 Jun 2004 12:20:45 +0200	[thread overview]
Message-ID: <20040610102045.GA11616@k3.hellgate.ch> (raw)
In-Reply-To: <OFCBC67DF9.898B09C6-ON88256EAF.001BFC9E-88256EAF.001C4AB8@us.ibm.com>

On Wed, 09 Jun 2004 23:09:53 -0600, David Stevens wrote:
> netdev-bounce@oss•sgi.com wrote on 06/07/2004 04:59:21 AM:
> 
> > One thing maybe worth mentioning: If you want to play with different
> > addresses, remember that IP addresses are in decimal notation, ethernet
> > in hex. So if you set
> 
> > target# ip maddr add 01:00:5e:00:00:25 dev eth0
> 
> > the test would be
> 
> > tester# ping -r -I eth0 -t 1 -c 2 224.0.0.37
> 
> This will add "01:00:5e:00:00:25" to the device multicast address filter,
> which will mean the host will receive the packet. But because it doesn't
> join the group at the IP level, it'll be dropped and the ping won't be
> answered (it isn't for a local address).
> 
> If you want the machine to answer, you need to join the group, which
> will conveniently add the hardware multicast address automatically. :-)

Correct. The method I described does the trick using standard tools
(iproute2, packet sniffer), though.

> PS - Here's a trivial program that will join a group. If you run this on
> one side, then a ping to the multicast address will work when it's in
> the group, and stop answering when it exits. There are more general
> things that have been around for years for testing-- I just threw this
> together just now. (I hope it doesn't have any bugs! :-) ) Should be
> suitable for testing hardware multicast address filters...

Sure, why not? Fixed up and added to the How-To below.

Roger

Multicast Driver Testing Quick How-To (version 0.2)
=====================================

Preparation
-----------
Make sure the host you are testing replies to broadcasts:

target# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
target# cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
0

Our test packets need to go to the target host, so either have a
route or use ping "-r -I <ifname>" option:
tester# route add -net 224.0.0.0 netmask 240.0.0.0 eth0

Test default group
------------------
Since every multicast capable host interface joins 224.0.0.1, you
can already ping your target:

tester# ping -r -I eth0 -t 1 -c 2 224.0.0.1

Your target host should answer this (so may your tester, depending on
your setup).

Join group on Ethernet level
----------------------------
We haven't joined the next group yet, so there should be no answer:

tester# ping -r -I eth0 -t 1 -c 2 224.1.1.37

Use packet sniffer to confirm that target is not seeing the request
(use -p option for tcpdump or tethereal to prevent promiscuous mode)

Now join the group (Ethernet level):

target# ip maddr add 01:00:5e:01:01:25 dev eth0

tester# ping -r -I eth0 -t 1 -c 2 224.1.1.37

Use packet sniffer to confirm that target is seeing the request now.

Join group on IP level
----------------------
The program below will join a multicast group at IP level and thus
at Ethernet level as well -- provided driver and hardware work
properly. Group membership end with termination of the program.

Remove hardware filter (if any left from previous test):

target# ip maddr del 01:00:5e:01:01:25 dev eth0

Join multicast group:

target# ./mcjoin eth0 224.1.1.37

tester# ping -r -I eth0 -t 1 -c 2 224.1.1.37

No need for packet sniffer this time, the target will answer since the
IP layer is aware of our group membership.

--------------------------------------------------------------------------------
/* Purpose: Join a multicast group (for testing)	*/
/* Author: David Stevens <dlstevens@us•ibm.com>, 2004	*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <net/if.h>

int
main(int argc, char *argv[])
{
	struct ip_mreqn mreqn;
	int s;

	if (argc != 3) {
		fprintf(stderr, "usage: %s <dev> <group>\n", argv[0]);
		exit(1);
	}
	s = socket(PF_INET, SOCK_DGRAM, 0);
	if (s < 0) {
		perror("socket");
		exit(1);
	}
	memset(&mreqn, 0, sizeof(mreqn));
	mreqn.imr_ifindex = if_nametoindex(argv[1]);
	if (!mreqn.imr_ifindex) {
		fprintf(stderr, "%s: \"%s\" invalid interface\n", argv[0],
		        argv[1]);
		exit(1);
	}
	if (inet_pton(AF_INET, argv[2], &mreqn.imr_multiaddr) <= 0) {
		fprintf(stderr, "%s: \"%s\" invalid group address\n", argv[0],
		        argv[2]);
		exit(1);
	}
	if (setsockopt(s, SOL_IP, IP_ADD_MEMBERSHIP, &mreqn,sizeof mreqn) < 0) {
		perror("IP_ADD_MEMBERSHIP");
		exit(1);
	}
	printf("joined group %s on %s (pausing...)\n", argv[2], argv[1]);
	fflush(stdout);
	pause();
	exit(0);
}
--------------------------------------------------------------------------------

  parent reply	other threads:[~2004-06-10 10:20 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-06-06 16:53 [0/3] mc_filter on big-endian arch Roger Luethi
2004-06-07  2:29 ` David Dillow
2004-06-07 11:48   ` Roger Luethi
2004-06-07 11:59     ` Roger Luethi
2004-06-10  5:09       ` David Stevens
2004-06-10  5:45         ` David Stevens
2004-06-13  3:01           ` David Dillow
2004-06-10 10:20         ` Roger Luethi [this message]
2004-06-10 13:37           ` Dave Dillow
2004-06-10 22:47             ` David Stevens
2004-06-07 13:52     ` David Dillow
2004-06-19 21:37 ` Jeff Garzik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040610102045.GA11616@k3.hellgate.ch \
    --to=rl@hellgate$(echo .)ch \
    --cc=akpm@osdl$(echo .)org \
    --cc=dave@thedillows$(echo .)org \
    --cc=dlstevens@us$(echo .)ibm.com \
    --cc=jgarzik@pobox$(echo .)com \
    --cc=netdev@oss$(echo .)sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox