fix(cwmp): device msg answer to already timed out request
This commit is contained in:
parent
8d1ce2529b
commit
5158fd345c
|
|
@ -1,7 +1,6 @@
|
||||||
package handler
|
package handler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
|
@ -84,7 +83,7 @@ func (h *Handler) CwmpHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
cpe := &obj
|
cpe := &obj
|
||||||
cpe.LastConnection = time.Now()
|
cpe.LastConnection = time.Now()
|
||||||
|
|
||||||
log.Printf("Received an Inform from device %s withEventCodes %s", addr, Inform.GetEvents())
|
log.Printf("Received an Inform from device %s withEventCodes %s", addr, Inform.GetEvents())
|
||||||
|
|
||||||
expiration := time.Now().AddDate(0, 0, 1)
|
expiration := time.Now().AddDate(0, 0, 1)
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user