github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/third/kmgRadius/Acct.go (about)

     1  package kmgRadius
     2  
     3  import (
     4  	"fmt"
     5  
     6  	. "github.com/bronze1man/kmg/kmgErr"
     7  	"github.com/bronze1man/kmg/kmgLog"
     8  )
     9  
    10  func (p *server) radiusAccountingRequest(request *Packet) *Packet {
    11  	//对于strongswan服务器,如果golang处理时间太长,strongswan服务器会坏掉,目前的解决方案是全异步处理,以便快速返回结果.
    12  	go p.asyncAccountingRequest(request)
    13  
    14  	npac := request.Reply()
    15  	npac.Code = CodeAccountingResponse
    16  	return npac
    17  }
    18  
    19  func (p *server) asyncAccountingRequest(request *Packet) {
    20  	acctReq := AcctRequest{
    21  		SessionId:   request.GetAcctSessionId(),
    22  		Username:    request.GetUsername(),
    23  		SessionTime: request.GetAcctSessionTime(),
    24  		InputBytes:  request.GetAcctTotalInputOctets(),
    25  		OutputBytes: request.GetAcctTotalOutputOctets(),
    26  		NasPort:     request.GetNASPort(),
    27  	}
    28  	switch request.GetAcctStatusType() {
    29  	case AcctStatusTypeEnumStart:
    30  		kmgLog.Log("Radius", "Acct Start", request.ToStringMap())
    31  		p.handler.AcctStart(acctReq)
    32  	case AcctStatusTypeEnumInterimUpdate:
    33  		p.handler.AcctUpdate(acctReq)
    34  	case AcctStatusTypeEnumStop:
    35  		kmgLog.Log("Radius", "Acct Stop", request.ToStringMap())
    36  
    37  		p.handler.AcctStop(acctReq)
    38  	default:
    39  		LogError(fmt.Errorf("radius.AccountingRequest AcctStatusType unknow %d", request.GetAcctStatusType()))
    40  	}
    41  }