1/* 2 PIM for Quagga 3 Copyright (C) 2008 Everton da Silva Marques 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, but 11 WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; see the file COPYING; if not, write to the 17 Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, 18 MA 02110-1301 USA 19 20 $QuaggaId: $Format:%an, %ai, %h$ $ 21*/ 22 23#include <sys/types.h> 24#include <sys/socket.h> 25#include <string.h> 26 27#include "pim_igmp_join.h" 28 29#ifndef SOL_IP 30#define SOL_IP IPPROTO_IP 31#endif 32 33#ifndef MCAST_JOIN_SOURCE_GROUP 34#define MCAST_JOIN_SOURCE_GROUP 46 35struct group_source_req 36{ 37 uint32_t gsr_interface; 38 struct sockaddr_storage gsr_group; 39 struct sockaddr_storage gsr_source; 40}; 41#endif 42 43int pim_igmp_join_source(int fd, int ifindex, 44 struct in_addr group_addr, 45 struct in_addr source_addr) 46{ 47 struct group_source_req req; 48 struct sockaddr_in *group_sa = (struct sockaddr_in *) &req.gsr_group; 49 struct sockaddr_in *source_sa = (struct sockaddr_in *) &req.gsr_source; 50 51 memset(group_sa, 0, sizeof(*group_sa)); 52 group_sa->sin_family = AF_INET; 53 group_sa->sin_addr = group_addr; 54 group_sa->sin_port = htons(0); 55 56 memset(source_sa, 0, sizeof(*source_sa)); 57 source_sa->sin_family = AF_INET; 58 source_sa->sin_addr = source_addr; 59 source_sa->sin_port = htons(0); 60 61 req.gsr_interface = ifindex; 62 63 return setsockopt(fd, SOL_IP, MCAST_JOIN_SOURCE_GROUP, 64 &req, sizeof(req)); 65 66 return 0; 67} 68