Accounting multicast + unacknowledge mode and conflicting packet

Alan DeKok aland at deployingradius.com
Wed Apr 24 13:42:47 CEST 2019


On Apr 23, 2019, at 4:35 PM, Fran├žois RAGUIN <fraguin at wanadoo.fr> wrote:
> We added Acct-Status-Type + Framed-IP-Address + Calling-Station-Id in the log "Received conflicting".
> This is to inform applications that consume downstream Radius accounting.
> And this while waiting to solve our punctual problems of slow database.

  OK.

> Below is the code for lines 1777 - 1781 of the process.c file before and after modification.
> I do not know the function fr_pair_find_by_num very well.
> I do not know if there is documentation, but if you have a few minutes, could you look at my code and tell me if there are flagrant errors.

> 
>                         char buffer[INET_ADDRSTRLEN];
>                         char const   *call_num, *acct_type = NULL;
>                         VALUE_PAIR   *vpcli, *vpip, *stype;
>                         
>                         
>                         stype = fr_pair_find_by_num(request->packet->vps, PW_ACCT_STATUS_TYPE, 0, TAG_ANY);
>                         vpip = fr_pair_find_by_num(request->packet->vps, PW_FRAMED_IP_ADDRESS, 0, TAG_ANY);
>                         vpcli = fr_pair_find_by_num(request->packet->vps, 0, PW_CALLING_STATION_ID, TAG_ANY);
>  
>  
>                         if (vpip && vpcli && stype ) {
>                         vp_prints_value(buffer, sizeof(buffer), vpip, '"');
>                         call_num = vpcli->vp_strvalue;
>                         acct_type = stype->vp_strvalue;

  You need to initialize the buffer if the "vpip"  isn't found.  And you need to check if the call_num and acct_type attributes have been found.  There is no guarantee that they will be in a packet.

  It's best to have a buffer for each one, and do something like:

	char vpip_buffer[128];
	char call_buffer[512];
	char acct_buffer[128];

	vpip_buffer[0] = 0;
	call_buffer[0] = 0;
	acct_buffer[0] = 0;

  	vpip = fr_pair_find_by_num(request->packet->vps, PW_FRAMED_IP_ADDRESS, 0, TAG_ANY)
	if (vpip) {
		char buffer[16];
		vp_prints_value(buffer, sizeof(buffer), vpip, '"');
		snprintf(vpip_buffer, sizeof(vpip_buffer), "IP-Client: %s ", buffer);
	}

  and do similar things for the other attributes.  Note that you *can't* look at acct_type->vp_strvalue, because it's an integer attribute.  You have to look at acct_type->vp_integer.

  You can then do:

                         ERROR("Received conflicting packet from "
                              "client %s port %d - ID: %u  %s%s%s due to "
                              "unfinished request in module %s.  Giving up on old request.",
                              client->shortname,
                              packet->src_port, packet->id, call_buffer, chip_buffer, acct_buffer,
                              old_module);

  That way your server won't crash if it receives packets without a Calling-Station-Id.

  Alan DeKok.




More information about the Freeradius-Users mailing list