All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Lamparter <equinox@diac24.net>
To: netdev@oss.sgi.com
Subject: user space multicast routing interface
Date: Sun, 25 Jan 2004 18:37:13 +0100	[thread overview]
Message-ID: <4013FEC9.1070900@diac24.net> (raw)

Hi,

[...skip down if you don't like long "sorry for mailing" mails ;)]

first of all, please excuse me mailing to netdev for a not directly
kernel related Linux networking question - i didn't find any other place
where i could ask...

I recently started playing around with multicast routing for educational
purposes; multicast client software was easy to write, ran well and
there were lots of docs about setsockopts etc.

Continuing on my way, I'm trying to write a simple IGMP querier now, but
even getting started turns out to be pretty difficult here, almost no
docs exist (well, the FreeBSD manpage...). I tried everything coming to
my mind, but i wasn't even able to get to receiving all IGMP packets on
an interface.

[...stop skipping here]

so, 2 questions:
* what sockopts are neccessary to get all IGMP packets (all multicast
groups) on a raw socket? (MRT_INIT / MRT_ADD_VIF should do it, but it
doesn't work)
* is it possible to bind VIFs to interface indices? in ipmr.c / struct
vifctl there is no ifindex parameter (real interface, not vif)

as you can see from the 2nd question, i at least tried reading the
kernel source (2.6.1), but i don't know the stack so its difficult to
understand...

David Lamparter



Appended: testing code for IGMP

no error messages on 2.6.1, interface has
<BROADCAST,MULTICAST,ALLMULTI,UP> flags while code is running, vif shows
up under /proc/net/ip_mr_vif:
Interface      BytesIn  PktsIn  BytesOut PktsOut Flags Local    Remote
  1 eth0              0       0         0       0 08000 160216AC 00000000

<cut includes for space issues>

#define E(x) if (x) printf ("error doing %s: %d [%s]\n", \
         #x, errno, strerror (errno));
int main(int argc, char **argv)
{
         int mrouter_s4; int p = 1; struct vifctl vc;

         mrouter_s4 = socket(AF_INET, SOCK_RAW, IPPROTO_IGMP);
         E(setsockopt(mrouter_s4, IPPROTO_IP, MRT_INIT,
                 (void *)&p, sizeof(p)));

         memset(&vc, 0, sizeof(vc));
         vc.vifc_vifi = vc.vifc_threshold = 1;
         vc.vifc_rate_limit = 4096;
         vc.vifc_lcl_addr.s_addr = inet_addr(argv[1]);
         E(setsockopt(mrouter_s4, IPPROTO_IP, MRT_ADD_VIF,
                 (void *)&vc, sizeof(vc)));

         while(1) {
                 char buf[4096]; struct sockaddr_in sender;
                 socklen_t sendsize = sizeof(sender);
                 int size = recvfrom(mrouter_s4, buf, 4096, 0,
                         (struct sockaddr *) &sender, &sendsize);
                 printf ("got %d from %s\n", size,
                         inet_ntoa(sender.sin_addr));
         }
}

             reply	other threads:[~2004-01-25 17:37 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-01-25 17:37 David Lamparter [this message]
2004-01-25 19:35 ` user space multicast routing interface jamal
  -- strict thread matches above, loose matches on Subject: below --
2004-01-25 21:35 David Stevens

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=4013FEC9.1070900@diac24.net \
    --to=equinox@diac24.net \
    --cc=netdev@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.