/*---------------------------------------------------------------------------*/ PROCESS_THREAD(mcast_sink_process, ev, data) { PROCESS_BEGIN(); PRINTF("Multicast Engine: '%s'\n", UIP_MCAST6.name); if(join_mcast_group() == NULL) { PRINTF("Failed to join multicast group\n"); PROCESS_EXIT(); } count = 0; sink_conn = udp_new(NULL, UIP_HTONS(0), NULL); udp_bind(sink_conn, UIP_HTONS(MCAST_SINK_UDP_PORT)); PRINTF("Listening: "); PRINT6ADDR(&sink_conn->ripaddr); PRINTF(" local/remote port %u/%u\n", UIP_HTONS(sink_conn->lport), UIP_HTONS(sink_conn->rport)); while(1) { PROCESS_YIELD(); if(ev == tcpip_event) { tcpip_handler(); } } PROCESS_END(); }
/* * Set up receiving multicast socket over UDP */ static struct socket * make_receive_sock(void) { struct socket *sock; /* First create a socket */ if (sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) { IP_VS_ERR("Error during creation of socket; terminating\n"); return NULL; } /* it is equivalent to the REUSEADDR option in user-space */ sock->sk->reuse = 1; if (sock->ops->bind(sock, (struct sockaddr*)&mcast_addr, sizeof(struct sockaddr)) < 0) { IP_VS_ERR("Error binding to the multicast addr\n"); goto error; } /* join the multicast group */ if (join_mcast_group(sock->sk, (struct in_addr*)&mcast_addr.sin_addr, ip_vs_mcast_ifn) < 0) { IP_VS_ERR("Error joining to the multicast group\n"); goto error; } return sock; error: sock_release(sock); return NULL; }