Example #1
0
File: ip_gre.c Project: 3null/linux
static int ipgre_open(struct net_device *dev)
{
	struct ip_tunnel *t = netdev_priv(dev);

	if (ipv4_is_multicast(t->parms.iph.daddr)) {
		struct flowi4 fl4;
		struct rtable *rt;

		rt = ip_route_output_gre(t->net, &fl4,
					 t->parms.iph.daddr,
					 t->parms.iph.saddr,
					 t->parms.o_key,
					 RT_TOS(t->parms.iph.tos),
					 t->parms.link);
		if (IS_ERR(rt))
			return -EADDRNOTAVAIL;
		dev = rt->dst.dev;
		ip_rt_put(rt);
		if (__in_dev_get_rtnl(dev) == NULL)
			return -EADDRNOTAVAIL;
		t->mlink = dev->ifindex;
		ip_mc_inc_group(__in_dev_get_rtnl(dev), t->parms.iph.daddr);
	}
	return 0;
}
Example #2
0
int ip_mc_join_group(struct sock *sk , struct device *dev, unsigned long addr)
{
	int unused= -1;
	int i;
	if(!MULTICAST(addr))
		return -EINVAL;
	if(!(dev->flags&IFF_MULTICAST))
		return -EADDRNOTAVAIL;
	if(sk->ip_mc_list==NULL)
	{
		if((sk->ip_mc_list=(struct ip_mc_socklist *)kmalloc(sizeof(*sk->ip_mc_list), GFP_KERNEL))==NULL)
			return -ENOMEM;
		memset(sk->ip_mc_list,'\0',sizeof(*sk->ip_mc_list));
	}
	for(i=0;i<IP_MAX_MEMBERSHIPS;i++)
	{
		if(sk->ip_mc_list->multiaddr[i]==addr && sk->ip_mc_list->multidev[i]==dev)
			return -EADDRINUSE;
		if(sk->ip_mc_list->multidev[i]==NULL)
			unused=i;
	}

	if(unused==-1)
		return -ENOBUFS;
	sk->ip_mc_list->multiaddr[unused]=addr;
	sk->ip_mc_list->multidev[unused]=dev;
	ip_mc_inc_group(dev,addr);
	return 0;
}
int ip_mc_join_group(struct sock *sk , struct ip_mreqn *imr)
{
    int err;
    u32 addr = imr->imr_multiaddr.s_addr;
    struct ip_mc_socklist *iml, *i;
    struct in_device *in_dev;
    int count = 0;

    if (!MULTICAST(addr))
        return -EINVAL;

    rtnl_shlock();

    if (!imr->imr_ifindex)
        in_dev = ip_mc_find_dev(imr);
    else {
        in_dev = inetdev_by_index(imr->imr_ifindex);
        if (in_dev)
            __in_dev_put(in_dev);
    }

    if (!in_dev) {
        iml = NULL;
        err = -ENODEV;
        goto done;
    }

    iml = (struct ip_mc_socklist *)sock_kmalloc(sk, sizeof(*iml), GFP_KERNEL);

    err = -EADDRINUSE;
    for (i=sk->protinfo.af_inet.mc_list; i; i=i->next) {
        if (memcmp(&i->multi, imr, sizeof(*imr)) == 0) {
            /* New style additions are reference counted */
            if (imr->imr_address.s_addr == 0) {
                i->count++;
                err = 0;
            }
            goto done;
        }
        count++;
    }
    err = -ENOBUFS;
    if (iml == NULL || count >= sysctl_igmp_max_memberships)
        goto done;
    memcpy(&iml->multi, imr, sizeof(*imr));
    iml->next = sk->protinfo.af_inet.mc_list;
    iml->count = 1;
    sk->protinfo.af_inet.mc_list = iml;
    ip_mc_inc_group(in_dev, addr);
    iml = NULL;
    err = 0;

done:
    rtnl_shunlock();
    if (iml)
        sock_kfree_s(sk, iml, sizeof(*iml));
    return err;
}
Example #4
0
void ip_mc_up(struct in_device *in_dev)
{
	struct ip_mc_list *i;

	ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS);

	for (i=in_dev->mc_list; i; i=i->next)
		igmp_group_added(i);
}
void ip_mc_up(struct in_device *in_dev)
{
    struct ip_mc_list *i;

    ASSERT_RTNL();

    ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS);

    for (i=in_dev->mc_list; i; i=i->next)
        igmp_group_added(i);

#ifdef CONFIG_RG_IGMP_PROXY
    igmprx_if_up(in_dev);
#endif
#ifdef CONFIG_RG_IGMP_PROXY_MODULE
    if (igmp_proxy_if_up)
        igmp_proxy_if_up(in_dev);
#endif
}
Example #6
0
static int ipgre_open(struct net_device *dev)
{
	struct ip_tunnel *t = netdev_priv(dev);

	if (ipv4_is_multicast(t->parms.iph.daddr)) {
		struct flowi fl = { .oif = t->parms.link,
				    .nl_u = { .ip4_u =
					      { .daddr = t->parms.iph.daddr,
						.saddr = t->parms.iph.saddr,
						.tos = RT_TOS(t->parms.iph.tos) } },
				    .proto = IPPROTO_GRE };
		struct rtable *rt;
		if (ip_route_output_key(dev_net(dev), &rt, &fl))
			return -EADDRNOTAVAIL;
		dev = rt->u.dst.dev;
		ip_rt_put(rt);
		if (__in_dev_get_rtnl(dev) == NULL)
			return -EADDRNOTAVAIL;
		t->mlink = dev->ifindex;
		ip_mc_inc_group(__in_dev_get_rtnl(dev), t->parms.iph.daddr);
	}