Lines Matching refs:mcast

162 inline static struct pico_tree *mcast_get_src_tree(struct pico_socket *s, struct pico_mcast *mcast)
165 mcast->listen->MCASTSources.compare = mcast_sources_cmp;
166 return &mcast->listen->MCASTSources;
171 mcast->listen->MCASTSources_ipv6.compare = mcast_sources_cmp_ipv6;
172 return &mcast->listen->MCASTSources_ipv6;
847 struct pico_mcast mcast;
854 mcast.listen = listen;
855 tree = mcast_get_src_tree(s, &mcast);
935 static int mcast_get_param(struct pico_mcast *mcast, struct pico_socket *s, void *value, int alloc, int by_source)
938 mcast->mreq_s = (struct pico_ip_mreq_source *)value;
940 mcast->mreq = (struct pico_ip_mreq *)value;
942 mcast->mcast_link = setopt_multicast_check(s, value, alloc, by_source);
943 if (!mcast->mcast_link)
946 mcast->address = pico_mcast_get_link_address(s, mcast->mcast_link);
948 mcast->listen = listen_find(s, &(mcast->mreq_s)->mcast_link_addr, &mcast->mreq_s->mcast_group_addr);
950 mcast->listen = listen_find(s, &(mcast->mreq)->mcast_link_addr, &mcast->mreq->mcast_group_addr);
957 struct pico_mcast mcast;
959 if(mcast_get_param(&mcast, s, value, 1, 0) < 0)
962 if (mcast.listen) {
963 if (mcast.listen->filter_mode != PICO_IP_MULTICAST_EXCLUDE) {
973 mcast.listen = PICO_ZALLOC(sizeof(struct pico_mcast_listen));
974 if (!mcast.listen) {
979 mcast.listen->filter_mode = PICO_IP_MULTICAST_EXCLUDE;
980 mcast.listen->mcast_link = mcast.mreq->mcast_link_addr;
981 mcast.listen->mcast_group = mcast.mreq->mcast_group_addr;
982 mcast.listen->proto = s->net->proto_number;
984 tree = mcast_get_src_tree(s, &mcast);
988 mcast.listen->proto = PICO_PROTO_IPV6;
992 if (pico_tree_insert(listen_tree, mcast.listen)) {
993 PICO_FREE(mcast.listen);
998 pico_tree_delete(listen_tree, mcast.listen);
999 PICO_FREE(mcast.listen);
1003 filter_mode = pico_socket_aggregate_mcastfilters(mcast.address, &mcast.mreq->mcast_group_addr);
1009 return pico_ipv4_mcast_join((struct pico_ip4*)&mcast.mreq->mcast_link_addr, (struct pico_ip4*) &mcast.mreq->mcast_group_addr, 1, (uint8_t)filter_mode, &MCASTFilter);
1013 return pico_ipv6_mcast_join((struct pico_ip6*)&mcast.mreq->mcast_link_addr, (struct pico_ip6*)&mcast.mreq->mcast_group_addr, 1, (uint8_t)filter_mode, &MCASTFilter_ipv6);
1024 struct pico_mcast mcast;
1026 if(mcast_get_param(&mcast, s, value, 0, 0) < 0)
1029 if (!mcast.listen) {
1035 tree = mcast_get_src_tree(s, &mcast);
1043 pico_tree_delete(listen_tree, mcast.listen);
1044 PICO_FREE(mcast.listen);
1051 filter_mode = pico_socket_aggregate_mcastfilters(mcast.address, &mcast.mreq->mcast_group_addr);
1056 return pico_ipv4_mcast_leave((struct pico_ip4*) &mcast.mreq->mcast_link_addr, (struct pico_ip4 *) &mcast.mreq->mcast_group_addr, 1, (uint8_t)filter_mode, &MCASTFilter);
1060 return pico_ipv6_mcast_leave((struct pico_ip6*)&mcast.mreq->mcast_link_addr, (struct pico_ip6*)&mcast.mreq->mcast_group_addr, 1, (uint8_t)filter_mode, &MCASTFilter_ipv6);
1069 struct pico_mcast mcast;
1070 if(mcast_get_param(&mcast, s, value, 0, 1) < 0)
1074 if (!mcast.listen) {
1080 if (mcast.listen->filter_mode != PICO_IP_MULTICAST_EXCLUDE) {
1086 stest = mcast.mreq_s->mcast_source_addr;
1088 source = pico_tree_findKey(&mcast.listen->MCASTSources, &stest);
1092 source = pico_tree_findKey(&mcast.listen->MCASTSources_ipv6, &stest);
1101 pico_tree_delete(&mcast.listen->MCASTSources, source);
1105 pico_tree_delete(&mcast.listen->MCASTSources_ipv6, source);
1108 filter_mode = pico_socket_aggregate_mcastfilters(mcast.address, &mcast.mreq_s->mcast_group_addr);
1113 return pico_ipv4_mcast_leave((struct pico_ip4 *)&mcast.mreq_s->mcast_link_addr, (struct pico_ip4*) &mcast.mreq_s->mcast_group_addr, 0, (uint8_t)filter_mode, &MCASTFilter);
1117 return pico_ipv6_mcast_leave((struct pico_ip6*)&mcast.mreq_s->mcast_link_addr, (struct pico_ip6*)&mcast.mreq_s->mcast_group_addr, 0, (uint8_t)filter_mode, &MCASTFilter_ipv6);
1126 struct pico_mcast mcast;
1127 if(mcast_get_param(&mcast, s, value, 0, 1) < 0)
1131 if (!mcast.listen) {
1137 if (mcast.listen->filter_mode != PICO_IP_MULTICAST_EXCLUDE) {
1143 stest = mcast.mreq_s->mcast_source_addr;
1145 source = pico_tree_findKey(&mcast.listen->MCASTSources, &stest);
1149 source = pico_tree_findKey(&mcast.listen->MCASTSources_ipv6, &stest);
1163 *source = mcast.mreq_s->mcast_source_addr;
1165 if (pico_tree_insert(&mcast.listen->MCASTSources, source)) {
1173 if (pico_tree_insert(&mcast.listen->MCASTSources_ipv6, source)) {
1179 filter_mode = pico_socket_aggregate_mcastfilters(mcast.address, &mcast.mreq_s->mcast_group_addr);
1184 return pico_ipv4_mcast_join((struct pico_ip4 *) &mcast.mreq_s->mcast_link_addr, (struct pico_ip4*)&mcast.mreq_s->mcast_group_addr, 0, (uint8_t)filter_mode, &MCASTFilter);
1188 return pico_ipv6_mcast_join((struct pico_ip6 *)&mcast.mreq_s->mcast_link_addr, (struct pico_ip6*)&mcast.mreq_s->mcast_group_addr, 0, (uint8_t)filter_mode, &MCASTFilter_ipv6);
1197 struct pico_mcast mcast;
1199 if(mcast_get_param(&mcast, s, value, 1, 1) < 0)
1204 if (mcast.listen) {
1205 tree = mcast_get_src_tree(s, &mcast);
1206 if (mcast.listen->filter_mode != PICO_IP_MULTICAST_INCLUDE) {
1212 stest = mcast.mreq_s->mcast_source_addr;
1226 *source = mcast.mreq_s->mcast_source_addr;
1233 mcast.listen = PICO_ZALLOC(sizeof(struct pico_mcast_listen));
1234 if (!mcast.listen) {
1239 tree = mcast_get_src_tree(s, &mcast);
1240 mcast.listen->filter_mode = PICO_IP_MULTICAST_INCLUDE;
1241 mcast.listen->mcast_link = mcast.mreq_s->mcast_link_addr;
1242 mcast.listen->mcast_group = mcast.mreq_s->mcast_group_addr;
1246 PICO_FREE(mcast.listen);
1253 mcast.listen->proto = PICO_PROTO_IPV6;
1256 *source = mcast.mreq_s->mcast_source_addr;
1258 PICO_FREE(mcast.listen);
1263 if (pico_tree_insert(listen_tree, mcast.listen)) {
1266 PICO_FREE(mcast.listen);
1276 filter_mode = pico_socket_aggregate_mcastfilters(mcast.address, &mcast.mreq_s->mcast_group_addr);
1281 return pico_ipv4_mcast_join((struct pico_ip4 *)&mcast.mreq_s->mcast_link_addr, (struct pico_ip4*)&mcast.mreq_s->mcast_group_addr, (uint8_t)reference_count, (uint8_t)filter_mode, &MCASTFilter);
1285 return pico_ipv6_mcast_join((struct pico_ip6 *) &mcast.mreq_s->mcast_link_addr, (struct pico_ip6*)&mcast.mreq_s->mcast_group_addr, (uint8_t)reference_count, (uint8_t)filter_mode, &MCASTFilter_ipv6);
1294 struct pico_mcast mcast;
1296 if(mcast_get_param(&mcast, s, value, 0, 1) < 0)
1301 if (!mcast.listen) {
1307 if (mcast.listen->filter_mode != PICO_IP_MULTICAST_INCLUDE) {
1313 tree = mcast_get_src_tree(s, &mcast);
1314 stest = mcast.mreq_s->mcast_source_addr;
1325 pico_tree_delete(listen_tree, mcast.listen);
1326 PICO_FREE(mcast.listen);
1334 filter_mode = pico_socket_aggregate_mcastfilters(mcast.address, &mcast.mreq_s->mcast_group_addr);
1339 return pico_ipv4_mcast_leave((struct pico_ip4 *) &mcast.mreq_s->mcast_link_addr, (struct pico_ip4*)&mcast.mreq_s->mcast_group_addr, (uint8_t)reference_count, (uint8_t)filter_mode, &MCASTFilter);
1343 return pico_ipv6_mcast_leave((struct pico_ip6 *)&mcast.mreq_s->mcast_link_addr, (struct pico_ip6*)&mcast.mreq_s->mcast_group_addr, (uint8_t)reference_count, (uint8_t)filter_mode, &MCASTFilter_ipv6);