fix(cwmp): device msg answer to already timed out request

This commit is contained in:
leandrofars 2024-05-30 10:08:07 -03:00
parent 8d1ce2529b
commit 5158fd345c
2 changed files with 28 additions and 20 deletions

View File

@ -1,7 +1,6 @@
package handler package handler
import ( import (
"encoding/json"
"encoding/xml" "encoding/xml"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
@ -92,6 +91,7 @@ func (h *Handler) CwmpHandler(w http.ResponseWriter, r *http.Request) {
http.SetCookie(w, &cookie) http.SetCookie(w, &cookie)
//data, _ := xml.Marshal(cwmp.InformResponse(envelope.Header.Id)) //data, _ := xml.Marshal(cwmp.InformResponse(envelope.Header.Id))
fmt.Fprintf(w, cwmp.InformResponse(envelope.Header.Id)) fmt.Fprintf(w, cwmp.InformResponse(envelope.Header.Id))
} else if messageType == "TransferComplete" { } else if messageType == "TransferComplete" {
} else if messageType == "GetRPC" { } else if messageType == "GetRPC" {
@ -103,34 +103,27 @@ func (h *Handler) CwmpHandler(w http.ResponseWriter, r *http.Request) {
} }
if cpe.Waiting != nil { if cpe.Waiting != nil {
log.Println("CPE was waiting for a response, now received something") log.Println("CPE was waiting for a response, now received something")
var e cwmp.SoapEnvelope var e cwmp.SoapEnvelope
xml.Unmarshal([]byte(body), &e) xml.Unmarshal([]byte(body), &e)
log.Println("Kind of envelope: ", e.KindOf()) log.Println("Kind of envelope: ", e.KindOf())
if e.KindOf() == "GetParameterNamesResponse" { if e.KindOf() == "GetParameterNamesResponse" {
// var envelope cwmp.GetParameterNamesResponse
// xml.Unmarshal([]byte(body), &envelope)
// msg := new(NatsSendMessage)
// msg.MsgType = "GetParameterNamesResponse"
// msg.Data, _ = json.Marshal(envelope)
log.Println("Receive GetParameterNamesResponse from CPE:", cpe.SerialNumber) log.Println("Receive GetParameterNamesResponse from CPE:", cpe.SerialNumber)
cpe.Waiting.Callback <- tmp msgAnswer(cpe.Waiting.Callback, cpe.Waiting.Time, h.acsConfig.DeviceAnswerTimeout, tmp)
} else if e.KindOf() == "GetParameterValuesResponse" { } else if e.KindOf() == "GetParameterValuesResponse" {
var envelope cwmp.GetParameterValuesResponse log.Println("Receive GetParameterValuesResponse from CPE:", cpe.SerialNumber)
xml.Unmarshal([]byte(body), &envelope) msgAnswer(cpe.Waiting.Callback, cpe.Waiting.Time, h.acsConfig.DeviceAnswerTimeout, tmp)
} else if e.KindOf() == "Fault" {
msg := new(NatsSendMessage) log.Println("Receive FaultResponse from CPE:", cpe.SerialNumber)
msg.MsgType = "GetParameterValuesResponse" msgAnswer(cpe.Waiting.Callback, cpe.Waiting.Time, h.acsConfig.DeviceAnswerTimeout, tmp)
msg.Data, _ = json.Marshal(envelope) log.Println(body)
cpe.Waiting.Callback <- tmp
} else { } else {
log.Println("Unknown message type") log.Println("Unknown message type")
cpe.Waiting.Callback <- tmp log.Println("Envelope:", e)
msgAnswer(cpe.Waiting.Callback, cpe.Waiting.Time, h.acsConfig.DeviceAnswerTimeout, tmp)
} }
cpe.Waiting = nil cpe.Waiting = nil
} else { } else {
@ -151,6 +144,7 @@ func (h *Handler) CwmpHandler(w http.ResponseWriter, r *http.Request) {
} }
} }
h.Cpes[cpe.SerialNumber] = cpe h.Cpes[cpe.SerialNumber] = cpe
log.Println("---End of CWMP Handler---")
} }
func (h *Handler) ConnectionRequest(cpe CPE) error { func (h *Handler) ConnectionRequest(cpe CPE) error {
@ -167,3 +161,16 @@ func (h *Handler) ConnectionRequest(cpe CPE) error {
log.Println("<-- Successfully authenticated to CPE", cpe.SerialNumber) log.Println("<-- Successfully authenticated to CPE", cpe.SerialNumber)
return err return err
} }
func msgAnswer(
callback chan []byte,
timeMsgWasSent time.Time,
timeOut time.Duration,
msgAnswer []byte,
) {
if time.Since(timeMsgWasSent) > timeOut {
log.Println("CPE took too long to answer the request, the message will be discarded")
} else {
callback <- msgAnswer
}
}

View File

@ -16,6 +16,7 @@ type Request struct {
User string User string
Password string Password string
CwmpMsg []byte CwmpMsg []byte
Time time.Time
Callback chan []byte Callback chan []byte
} }