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