Annotation of embedaddon/freevrrpd/vrrp_multicast.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (c) 2001,2002 Sebastien Petit <spe@bsdfr.org>
                      3:  *
                      4:  * Redistribution and use in source forms, with and without modification,
                      5:  * are permitted provided that the following conditions are met:
                      6:  * 1. Redistributions of source code must retain the above copyright notice,
                      7:  *    this list of conditions and the following disclaimer.
                      8:  * 2. Redistributions in binary form must reproduce the above copyright notice,
                      9:  *    this list of conditions and the following disclaimer in the documentation
                     10:  *    and/or other materials provided with the distribution. Obviously, it
                     11:  *    would be nice if you gave credit where credit is due but requiring it
                     12:  *    would be too onerous.
                     13:  * 3. All advertising materials mentioning features or use of this software
                     14:  *    must display the following acknowledgement:
                     15:  *      This product includes software developed by Sebastien Petit.
                     16:  * 4. Neither the name of its contributors may be used to endorse or promote
                     17:  *    products derived from this software without specific prior written
                     18:  *    permission.
                     19:  *
                     20:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     21:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     22:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     23:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     24:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     25:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     26:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     27:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     28:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     29:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     30:  * SUCH DAMAGE.
                     31:  *
                     32:  * $Id: vrrp_multicast.c,v 1.7 2004/04/01 15:40:52 spe Exp $
                     33:  */
                     34: 
                     35: #include <errno.h>
                     36: #include "vrrp_multicast.h"
                     37: 
                     38: /* join multicast group with ip address */
                     39: char 
                     40: vrrp_multicast_join_group(int sd, u_char * multicast_ip, struct in_addr * interface_ip)
                     41: {
                     42:        struct ip_mreq  imr;
                     43: 
                     44:        bzero(&imr, sizeof(imr));
                     45:        imr.imr_multiaddr.s_addr = inet_addr(multicast_ip);
                     46:        imr.imr_interface.s_addr = interface_ip->s_addr;
                     47:        if (setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(imr)) == -1) {
                     48:                syslog(LOG_ERR, "cannot join multicast group %s with ip source %s [ IP_ADD_MEMBERSHIP ]", multicast_ip, inet_ntoa(*interface_ip));
                     49:                return -1;
                     50:        }
                     51:        return 0;
                     52: }
                     53: 
                     54: /* Set multicast ttl IP */
                     55: char 
                     56: vrrp_multicast_set_ttl(int sd, u_char ttl)
                     57: {
                     58:        if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) == -1) {
                     59:                syslog(LOG_ERR, "cannot set multicast TTL: %s", strerror(errno));
                     60:                return -1;
                     61:        }
                     62:        return 0;
                     63: }
                     64: 
                     65: char 
                     66: vrrp_multicast_set_if(int sd, struct in_addr * addr, char *if_name)
                     67: {
                     68:        if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, addr, sizeof(*addr)) == -1) {
                     69:                syslog(LOG_ERR, "cannot setsockopt IP_MULTICAST_IF on primary address of %s: %s", if_name, strerror(errno));
                     70:                return -1;
                     71:        }
                     72:        return 0;
                     73: }
                     74: 
                     75: int vrrp_multicast_set_loopback(int sd, u_char flag) {
                     76:        if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, &flag, sizeof(flag)) == -1) {
                     77:                syslog(LOG_ERR, "cannot setsockopt IP_MULTICAST_LOOP: %s", strerror(errno));
                     78:                return -1;
                     79:        }
                     80: 
                     81:        return 0;
                     82: }
                     83: 
                     84: /* Open VRRP socket and join multicast group */
                     85: char 
                     86: vrrp_multicast_set_socket(struct vrrp_vr * vr)
                     87: {
                     88:        if (vrrp_multicast_join_group(vr->sd, VRRP_MULTICAST_IP, (struct in_addr *) & vr->vr_if->ip_addrs[0]) == -1) {
                     89:                close(vr->sd);
                     90:                return -1;
                     91:        }
                     92:        if (vrrp_multicast_set_ttl(vr->sd, VRRP_MULTICAST_TTL) == -1) {
                     93:                close(vr->sd);
                     94:                return -1;
                     95:        }
                     96:        /* XXX don't need to force interface for multicast. Let the kernel
                     97:         * choose by itself. this setsockopt doesn't work with ipsec/ah...
                     98:         * don't know why */
                     99:        if (vrrp_multicast_set_if(vr->sd, &vr->vr_if->ip_addrs[0], vr->vr_if->if_name) == -1) {
                    100:                close(vr->sd);
                    101:                return -1;
                    102:        }
                    103:        if (vrrp_multicast_set_loopback(vr->sd, VRRP_MULTICAST_DISABLE_LOOPBACK) == -1) {
                    104:                close(vr->sd);
                    105:                return -1;
                    106:        }
                    107: 
                    108:        return 0;
                    109: }
                    110: 
                    111: char 
                    112: vrrp_multicast_open_socket(struct vrrp_vr * vr)
                    113: {
                    114:        if (vrrp_network_open_socket(vr) == -1)
                    115:                return -1;
                    116:        if (vrrp_multicast_set_socket(vr) == -1)
                    117:                return -1;
                    118: 
                    119:        return 0;
                    120: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>