prefix_t * Ref_Prefix (prefix_t * prefix) { if (prefix == NULL) return (NULL); if (prefix->ref_count == 0) { /* make a copy in case of a static prefix */ return (New_Prefix2 (prefix->family, &prefix->add, prefix->bitlen, NULL)); } prefix->ref_count++; /* fprintf(stderr, "[A %s, %d]\n", prefix_toa (prefix), prefix->ref_count); */ return (prefix); }
static prefix_t *Ref_Prefix(prefix_t *prefix) { if (prefix == NULL) return (NULL); if (prefix->ref_count == 0) { /* make a copy in case of a static prefix */ return (New_Prefix2(prefix->family, &prefix->add, prefix->bitlen, NULL)); } prefix->ref_count++; return (prefix); }
prefix_t * New_Prefix (int family, void *dest, int bitlen) { return (New_Prefix2 (family, dest, bitlen, NULL)); }
static void qif_rtmsg_rcv (int sockfd) { int n, family; u_char msgbuf[4096]; /* I don't know how much is enough */ struct rt_msghdr *rtm = (struct rt_msghdr *) msgbuf; struct qos_msghdr *qosm = (struct qos_msghdr *) (rtm + 1); qos_rtflow_t *qosr = (qos_rtflow_t *) (qosm + 1); prefix_t sdestin, ssender; srsvp_flow_t sflow; u_char *saddr, *daddr; srsvp_t *srsvp; assert (sockfd == qos_rtsock); if ((n = read (sockfd, msgbuf, sizeof (msgbuf))) > 0) { if (rtm->rtm_seq != 0 || (rtm->rtm_type != RTM_POLICY_SEND && rtm->rtm_type != RTM_QOS_RECV && rtm->rtm_type != RTM_QOS_SEND)) { select_enable_fd (sockfd); return; } memset (&sflow, 0, sizeof (sflow)); sflow.destin = &sdestin; sflow.sender = &ssender; sflow.req_qos = (req_qos_t *)&qosm->qos; family = qosr->fa.family; #ifdef HAVE_IPV6 if (family == AF_INET6) { saddr = (u_char *)&qosr->fin6.src; daddr = (u_char *)&qosr->fin6.dest; sflow.sport = ntohs (qosr->fin6.sport); sflow.dport = ntohs (qosr->fin6.dport); sflow.proto = qosr->fin6.proto; srsvp = RICD6->srsvp; } else #endif /* HAVE_IPV6 */ { saddr = (u_char *)&qosr->fin.src; daddr = (u_char *)&qosr->fin.dest; sflow.sport = ntohs (qosr->fin.sport); sflow.dport = ntohs (qosr->fin.dport); sflow.proto = qosr->fin.proto; srsvp = RICD->srsvp; } New_Prefix2 (family, saddr, -1, &ssender); New_Prefix2 (family, daddr, -1, &sdestin); switch (rtm->rtm_type) { case RTM_POLICY_SEND: case RTM_QOS_SEND: trace (TR_TRACE, MRT->trace, "QIF QOS_SEND received " "for %a port %d\n", sflow.destin, sflow.dport); /* schedule_event2 ("srsvp_flow_request_by_app", srsvp->schedule, (event_fn_t) srsvp_flow_request_by_app, 3, srsvp, &sflow, 'S'); */ srsvp_flow_request_by_app (srsvp, &sflow, 'S'); break; case RTM_QOS_RECV: trace (TR_TRACE, MRT->trace, "QIF QOS_RECV received " "for %a port %d\n", sflow.destin, sflow.dport); srsvp_flow_request_by_app (srsvp, &sflow, 'R'); break; } } else { trace (TR_ERROR, MRT->trace, "QIF read on qos routing socket %d (%m)\n", sockfd); } select_enable_fd (sockfd); }