int ospf_if_ipmulticast (struct ospf *top, struct prefix *p, unsigned int ifindex) { u_char val; int ret, len; val = 0; len = sizeof (val); /* Prevent receiving self-origined multicast packets. */ ret = setsockopt (top->fd, IPPROTO_IP, IP_MULTICAST_LOOP, (void *)&val, len); if (ret < 0) zlog_warn ("can't setsockopt IP_MULTICAST_LOOP(0): %s", strerror (errno)); /* Explicitly set multicast ttl to 1 -- endo. */ val = 1; ret = setsockopt (top->fd, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&val, len); if (ret < 0) zlog_warn ("can't setsockopt IP_MULTICAST_TTL(1): %s", strerror (errno)); ret = setsockopt_multicast_ipv4 (top->fd, IP_MULTICAST_IF, p->u.prefix4, 0, ifindex); if (ret < 0) zlog_warn ("can't setsockopt IP_MULTICAST_IF: %s", strerror (errno)); return ret; }
int ospf_if_add_allspfrouters_oisock (struct ospf *top, struct prefix *p, unsigned int ifindex,struct ospf_interface *oi) { int ret; ret = setsockopt_multicast_ipv4 (oi->packet_fd, IP_ADD_MEMBERSHIP, p->u.prefix4, htonl (OSPF_ALLSPFROUTERS),ifindex); return ret; }
int set_mcast_if(struct sockaddr *int_addr) { struct in_addr if_addr; if_addr.s_addr = satosin(*int_addr)->sin_addr.s_addr; return setsockopt_multicast_ipv4(sock, IP_MULTICAST_IF, if_addr, 0xE0000009, 0); }
int mcast_leave(struct sockaddr *int_addr) { struct in_addr if_addr; if_addr.s_addr = satosin(*int_addr)->sin_addr.s_addr; return setsockopt_multicast_ipv4(sock, IP_DROP_MEMBERSHIP, if_addr, 0xE0000009, 0); }
/* Join to the OSPF ALL Designated ROUTERS multicast group. */ int ospf_if_add_alldrouters (struct ospf *top, struct prefix *p, unsigned int ifindex) { int ret; ret = setsockopt_multicast_ipv4 (top->fd, IP_ADD_MEMBERSHIP, p->u.prefix4, htonl (OSPF_ALLDROUTERS), ifindex); if (ret < 0) zlog_warn ("can't setsockopt IP_ADD_MEMBERSHIP (AllDRouters): %s", strerror (errno)); else zlog_info ("interface %s join AllDRouters Multicast group.", inet_ntoa (p->u.prefix4)); return ret; }
int ospf_if_drop_allspfrouters (struct ospf *top, struct prefix *p, unsigned int ifindex) { int ret; ret = setsockopt_multicast_ipv4 (top->fd, IP_DROP_MEMBERSHIP, p->u.prefix4, htonl (OSPF_ALLSPFROUTERS), ifindex); if (ret < 0) zlog_warn ("can't setsockopt IP_DROP_MEMBERSHIP (fd %d, addr %s, " "ifindex %u, AllSPFRouters): %s", top->fd, inet_ntoa(p->u.prefix4), ifindex, safe_strerror(errno)); else zlog_info ("interface %s [%u] leave AllSPFRouters Multicast group.", inet_ntoa (p->u.prefix4), ifindex); return ret; }
int ospf_if_ipmulticast_hello (struct ospf *top, struct prefix *p, unsigned int ifindex) { u_char val; int ret, len; val = 0; len = sizeof (val); /* Prevent receiving self-origined multicast packets. */ ret = setsockopt (top->fd_hello, IPPROTO_IP, IP_MULTICAST_LOOP, (void *)&val, len); /* Explicitly set multicast ttl to 1 -- endo. */ val = 1; ret = setsockopt (top->fd_hello, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&val, len); ret = setsockopt_multicast_ipv4 (top->fd_hello, IP_MULTICAST_IF, p->u.prefix4, 0, ifindex); return ret; }
/* Join to the OSPF ALL SPF ROUTERS multicast group. */ int ospf_if_add_allspfrouters (struct ospf *top, struct prefix *p, unsigned int ifindex) { int ret; ret = setsockopt_multicast_ipv4 (top->fd, IP_ADD_MEMBERSHIP, p->u.prefix4, htonl (OSPF_ALLSPFROUTERS), ifindex); if (ret < 0) zlog_warn ("can't setsockopt IP_ADD_MEMBERSHIP (fd %d, addr %s, " "ifindex %u, AllSPFRouters): %s; perhaps a kernel limit " "on # of multicast group memberships has been exceeded?", top->fd, inet_ntoa(p->u.prefix4), ifindex, safe_strerror(errno)); else zlog_info ("interface %s [%u] join AllSPFRouters Multicast group.", inet_ntoa (p->u.prefix4), ifindex); return ret; }