Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
prefix_t *
New_Prefix (int family, void *dest, int bitlen)
{
    return (New_Prefix2 (family, dest, bitlen, NULL));
}
Пример #4
0
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);
}