/* * Add the given assertion (as string). */ int make_assertion(char *aval) { struct lexer_state lls; size_t n = strlen(aval) + 1; char *c = sdup(aval); int ret; *(c + n - 1) = '\n'; init_buf_lexer_state(&lls, 0); lls.flags = DEFAULT_LEXER_FLAGS; lls.input = 0; lls.input_string = (unsigned char *)c; lls.pbuf = 0; lls.ebuf = n; lls.line = -1; ret = handle_assert(&lls); freemem(c); free_lexer_state(&lls); return ret; }
void pim_interface::data_available(const sockaddr_in6 *src, const sockaddr_in6 *dst) { pim_message *pimmsg = g_mrd->ipktb->header<pim_message>(); int len = g_mrd->ipktb->rlength; m_stats.counter(AllCount, RX)++; if (pimmsg->type() != pim_msg_register && should_log(MESSAGE_SIG)) { log().xprintf("%s message from %{addr} to %{addr} len %u\n", pimmsg->type_name(), src->sin6_addr, dst->sin6_addr, (uint32_t)len); } if (pimmsg->type() == pim_msg_register) len = sizeof(pim_register_message); if (!(pimmsg->has_valid_checksum(src->sin6_addr, dst->sin6_addr, len) || (pimmsg->type() == pim_msg_register && pimmsg->has_valid_checksum(src->sin6_addr, dst->sin6_addr, g_mrd->ipktb->rlength)))) { m_stats.counter(AllCount, Bad)++; if (should_log(MESSAGE_ERR)) { log().xprintf("Dropping message from %{addr} to %{addr}" " len %u: Bad Checksum\n", src->sin6_addr, dst->sin6_addr, (uint32_t)g_mrd->ipktb->rlength); } return; } if (dst->sin6_addr == pim_all_routers) { if ((int)src->sin6_scope_id != owner()->index()) { if (should_log(MESSAGE_ERR)) { log().xprintf("Dropping message from %{addr} to %{addr}" " len %u: Wrong interface\n", src->sin6_addr, dst->sin6_addr, (uint32_t)g_mrd->ipktb->rlength); } return; } switch (pimmsg->type()) { case pim_msg_hello: handle_hello(src, (pim_hello_message *)g_mrd->ipktb->pheader(), g_mrd->ipktb->rlength); break; case pim_msg_joinprune: handle_joinprune(src, (pim_joinprune_message *)g_mrd->ipktb->pheader(), g_mrd->ipktb->rlength); break; case pim_msg_assert: handle_assert(src, (pim_assert_message *)g_mrd->ipktb->pheader(), g_mrd->ipktb->rlength); break; case pim_msg_bootstrap: handle_bootstrap(src, dst, (pim_bootstrap_message *)g_mrd->ipktb->pheader(), g_mrd->ipktb->rlength); break; default: m_stats.counter(AllCount, Bad)++; } } else { switch (pimmsg->type()) { case pim_msg_register: handle_register(src, dst); break; case pim_msg_register_stop: handle_register_stop(src); break; case pim_msg_bootstrap: handle_bootstrap(src, dst, (pim_bootstrap_message *)g_mrd->ipktb->pheader(), g_mrd->ipktb->rlength); break; case pim_msg_candidate_rp_adv: handle_candidate_rp_adv(src, (pim_candidate_rp_adv_message *)g_mrd->ipktb->pheader(), g_mrd->ipktb->rlength); break; default: m_stats.counter(AllCount, Bad)++; } } }