Home | History | Annotate | Line # | Download | only in mrouted
kern.c revision 1.2
      1  1.1   brezak /*
      2  1.1   brezak  * The mrouted program is covered by the license in the accompanying file
      3  1.1   brezak  * named "LICENSE".  Use of the mrouted program represents acceptance of
      4  1.1   brezak  * the terms and conditions listed in that file.
      5  1.1   brezak  *
      6  1.1   brezak  * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of
      7  1.1   brezak  * Leland Stanford Junior University.
      8  1.1   brezak  *
      9  1.1   brezak  *
     10  1.2  mycroft  * $Id: kern.c,v 1.2 1995/06/01 02:25:56 mycroft Exp $
     11  1.1   brezak  */
     12  1.1   brezak 
     13  1.1   brezak 
     14  1.1   brezak #include "defs.h"
     15  1.1   brezak 
     16  1.1   brezak 
     17  1.1   brezak void k_set_rcvbuf(bufsize)
     18  1.1   brezak     int bufsize;
     19  1.1   brezak {
     20  1.1   brezak     if (setsockopt(igmp_socket, SOL_SOCKET, SO_RCVBUF,
     21  1.2  mycroft 		   (char *)&bufsize, sizeof(bufsize)) < 0)
     22  1.1   brezak 	log(LOG_ERR, errno, "setsockopt SO_RCVBUF %u", bufsize);
     23  1.1   brezak }
     24  1.1   brezak 
     25  1.1   brezak 
     26  1.1   brezak void k_hdr_include(bool)
     27  1.1   brezak     int bool;
     28  1.1   brezak {
     29  1.1   brezak #ifdef IP_HDRINCL
     30  1.1   brezak     if (setsockopt(igmp_socket, IPPROTO_IP, IP_HDRINCL,
     31  1.2  mycroft 		   (char *)&bool, sizeof(bool)) < 0)
     32  1.1   brezak 	log(LOG_ERR, errno, "setsockopt IP_HDRINCL %u", bool);
     33  1.1   brezak #endif
     34  1.1   brezak }
     35  1.1   brezak 
     36  1.1   brezak 
     37  1.1   brezak void k_set_ttl(t)
     38  1.1   brezak     int t;
     39  1.1   brezak {
     40  1.1   brezak     u_char ttl;
     41  1.1   brezak 
     42  1.1   brezak     ttl = t;
     43  1.1   brezak     if (setsockopt(igmp_socket, IPPROTO_IP, IP_MULTICAST_TTL,
     44  1.1   brezak 		   (char *)&ttl, sizeof(ttl)) < 0)
     45  1.1   brezak 	log(LOG_ERR, errno, "setsockopt IP_MULTICAST_TTL %u", ttl);
     46  1.1   brezak }
     47  1.1   brezak 
     48  1.1   brezak 
     49  1.1   brezak void k_set_loop(l)
     50  1.1   brezak     int l;
     51  1.1   brezak {
     52  1.1   brezak     u_char loop;
     53  1.1   brezak 
     54  1.1   brezak     loop = l;
     55  1.1   brezak     if (setsockopt(igmp_socket, IPPROTO_IP, IP_MULTICAST_LOOP,
     56  1.1   brezak 		   (char *)&loop, sizeof(loop)) < 0)
     57  1.1   brezak 	log(LOG_ERR, errno, "setsockopt IP_MULTICAST_LOOP %u", loop);
     58  1.1   brezak }
     59  1.1   brezak 
     60  1.1   brezak 
     61  1.1   brezak void k_set_if(ifa)
     62  1.2  mycroft     u_int32_t ifa;
     63  1.1   brezak {
     64  1.1   brezak     struct in_addr adr;
     65  1.1   brezak 
     66  1.1   brezak     adr.s_addr = ifa;
     67  1.1   brezak     if (setsockopt(igmp_socket, IPPROTO_IP, IP_MULTICAST_IF,
     68  1.1   brezak 		   (char *)&adr, sizeof(adr)) < 0)
     69  1.1   brezak 	log(LOG_ERR, errno, "setsockopt IP_MULTICAST_IF %s",
     70  1.1   brezak 	    		    inet_fmt(ifa, s1));
     71  1.1   brezak }
     72  1.1   brezak 
     73  1.1   brezak 
     74  1.1   brezak void k_join(grp, ifa)
     75  1.2  mycroft     u_int32_t grp;
     76  1.2  mycroft     u_int32_t ifa;
     77  1.1   brezak {
     78  1.1   brezak     struct ip_mreq mreq;
     79  1.1   brezak 
     80  1.1   brezak     mreq.imr_multiaddr.s_addr = grp;
     81  1.1   brezak     mreq.imr_interface.s_addr = ifa;
     82  1.1   brezak 
     83  1.1   brezak     if (setsockopt(igmp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
     84  1.1   brezak 		   (char *)&mreq, sizeof(mreq)) < 0)
     85  1.1   brezak 	log(LOG_WARNING, errno, "can't join group %s on interface %s",
     86  1.1   brezak 				inet_fmt(grp, s1), inet_fmt(ifa, s2));
     87  1.1   brezak }
     88  1.1   brezak 
     89  1.1   brezak 
     90  1.1   brezak void k_leave(grp, ifa)
     91  1.2  mycroft     u_int32_t grp;
     92  1.2  mycroft     u_int32_t ifa;
     93  1.1   brezak {
     94  1.1   brezak     struct ip_mreq mreq;
     95  1.1   brezak 
     96  1.1   brezak     mreq.imr_multiaddr.s_addr = grp;
     97  1.1   brezak     mreq.imr_interface.s_addr = ifa;
     98  1.1   brezak 
     99  1.1   brezak     if (setsockopt(igmp_socket, IPPROTO_IP, IP_DROP_MEMBERSHIP,
    100  1.1   brezak 		   (char *)&mreq, sizeof(mreq)) < 0)
    101  1.1   brezak 	log(LOG_WARNING, errno, "can't leave group %s on interface %s",
    102  1.1   brezak 				inet_fmt(grp, s1), inet_fmt(ifa, s2));
    103  1.1   brezak }
    104  1.1   brezak 
    105  1.1   brezak 
    106  1.1   brezak void k_init_dvmrp()
    107  1.1   brezak {
    108  1.2  mycroft #ifdef OLD_KERNEL
    109  1.2  mycroft     if (setsockopt(igmp_socket, IPPROTO_IP, MRT_INIT,
    110  1.2  mycroft 		   (char *)NULL, 0) < 0)
    111  1.2  mycroft #else
    112  1.2  mycroft     int v=1;
    113  1.2  mycroft 
    114  1.2  mycroft     if (setsockopt(igmp_socket, IPPROTO_IP, MRT_INIT,
    115  1.2  mycroft 		   (char *)&v, sizeof(int)) < 0)
    116  1.2  mycroft #endif
    117  1.2  mycroft 	log(LOG_ERR, errno, "can't enable Multicast routing in kernel");
    118  1.1   brezak }
    119  1.1   brezak 
    120  1.1   brezak 
    121  1.1   brezak void k_stop_dvmrp()
    122  1.1   brezak {
    123  1.2  mycroft     if (setsockopt(igmp_socket, IPPROTO_IP, MRT_DONE,
    124  1.2  mycroft 		   (char *)NULL, 0) < 0)
    125  1.2  mycroft 	log(LOG_WARNING, errno, "can't disable Multicast routing in kernel");
    126  1.1   brezak }
    127  1.1   brezak 
    128  1.1   brezak 
    129  1.1   brezak void k_add_vif(vifi, v)
    130  1.1   brezak     vifi_t vifi;
    131  1.1   brezak     struct uvif *v;
    132  1.1   brezak {
    133  1.1   brezak     struct vifctl vc;
    134  1.1   brezak 
    135  1.1   brezak     vc.vifc_vifi            = vifi;
    136  1.1   brezak     vc.vifc_flags           = v->uv_flags & VIFF_KERNEL_FLAGS;
    137  1.1   brezak     vc.vifc_threshold       = v->uv_threshold;
    138  1.2  mycroft     vc.vifc_rate_limit	    = v->uv_rate_limit;
    139  1.1   brezak     vc.vifc_lcl_addr.s_addr = v->uv_lcl_addr;
    140  1.1   brezak     vc.vifc_rmt_addr.s_addr = v->uv_rmt_addr;
    141  1.1   brezak 
    142  1.2  mycroft     if (setsockopt(igmp_socket, IPPROTO_IP, MRT_ADD_VIF,
    143  1.2  mycroft 		   (char *)&vc, sizeof(vc)) < 0)
    144  1.2  mycroft 	log(LOG_ERR, errno, "setsockopt MRT_ADD_VIF");
    145  1.1   brezak }
    146  1.1   brezak 
    147  1.1   brezak 
    148  1.1   brezak void k_del_vif(vifi)
    149  1.1   brezak     vifi_t vifi;
    150  1.1   brezak {
    151  1.2  mycroft     if (setsockopt(igmp_socket, IPPROTO_IP, MRT_DEL_VIF,
    152  1.2  mycroft 		   (char *)&vifi, sizeof(vifi)) < 0)
    153  1.2  mycroft 	log(LOG_ERR, errno, "setsockopt MRT_DEL_VIF");
    154  1.1   brezak }
    155  1.1   brezak 
    156  1.1   brezak 
    157  1.2  mycroft /*
    158  1.2  mycroft  * Adds a (source, mcastgrp) entry to the kernel
    159  1.2  mycroft  */
    160  1.2  mycroft void k_add_rg(origin, g)
    161  1.2  mycroft     u_long origin;
    162  1.2  mycroft     struct gtable *g;
    163  1.2  mycroft {
    164  1.2  mycroft     struct mfcctl mc;
    165  1.2  mycroft     int i;
    166  1.2  mycroft 
    167  1.2  mycroft     /* copy table values so that setsockopt can process it */
    168  1.2  mycroft     mc.mfcc_origin.s_addr = origin;
    169  1.2  mycroft #ifdef OLD_KERNEL
    170  1.2  mycroft     mc.mfcc_originmask.s_addr = 0xffffffff;
    171  1.2  mycroft #endif
    172  1.2  mycroft     mc.mfcc_mcastgrp.s_addr = g->gt_mcastgrp;
    173  1.2  mycroft     mc.mfcc_parent = g->gt_route ? g->gt_route->rt_parent : NO_VIF;
    174  1.2  mycroft     for (i = 0; i < numvifs; i++)
    175  1.2  mycroft 	mc.mfcc_ttls[i] = g->gt_ttls[i];
    176  1.1   brezak 
    177  1.2  mycroft     /* write to kernel space */
    178  1.2  mycroft     if (setsockopt(igmp_socket, IPPROTO_IP, MRT_ADD_MFC,
    179  1.2  mycroft 		   (char *)&mc, sizeof(mc)) < 0)
    180  1.2  mycroft 	log(LOG_WARNING, errno, "setsockopt MRT_ADD_MFC");
    181  1.1   brezak }
    182  1.1   brezak 
    183  1.1   brezak 
    184  1.2  mycroft /*
    185  1.2  mycroft  * Deletes a (source, mcastgrp) entry from the kernel
    186  1.2  mycroft  */
    187  1.2  mycroft int k_del_rg(origin, g)
    188  1.2  mycroft     u_long origin;
    189  1.2  mycroft     struct gtable *g;
    190  1.2  mycroft {
    191  1.2  mycroft     struct mfcctl mc;
    192  1.2  mycroft     int retval, i;
    193  1.2  mycroft 
    194  1.2  mycroft     /* copy table values so that setsockopt can process it */
    195  1.2  mycroft     mc.mfcc_origin.s_addr = origin;
    196  1.2  mycroft #ifdef OLD_KERNEL
    197  1.2  mycroft     mc.mfcc_originmask.s_addr = 0xffffffff;
    198  1.2  mycroft #endif
    199  1.2  mycroft     mc.mfcc_mcastgrp.s_addr = g->gt_mcastgrp;
    200  1.1   brezak 
    201  1.2  mycroft     /* write to kernel space */
    202  1.2  mycroft     if ((retval = setsockopt(igmp_socket, IPPROTO_IP, MRT_DEL_MFC,
    203  1.2  mycroft 		   (char *)&mc, sizeof(mc))) < 0)
    204  1.2  mycroft 	log(LOG_WARNING, errno, "setsockopt MRT_DEL_MFC");
    205  1.1   brezak 
    206  1.2  mycroft     return retval;
    207  1.2  mycroft }
    208  1.1   brezak 
    209  1.2  mycroft /*
    210  1.2  mycroft  * Get the kernel's idea of what version of mrouted needs to run with it.
    211  1.2  mycroft  */
    212  1.2  mycroft int k_get_version()
    213  1.1   brezak {
    214  1.2  mycroft     int vers;
    215  1.2  mycroft     int len = sizeof(vers);
    216  1.1   brezak 
    217  1.2  mycroft     if (getsockopt(igmp_socket, IPPROTO_IP, MRT_VERSION,
    218  1.2  mycroft 			(char *)&vers, &len) < 0)
    219  1.2  mycroft 	log(LOG_ERR, errno,
    220  1.2  mycroft 		"getsockopt MRT_VERSION: perhaps your kernel is too old");
    221  1.1   brezak 
    222  1.2  mycroft     return vers;
    223  1.1   brezak }
    224