You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
5.0 KiB
Go
145 lines
5.0 KiB
Go
3 years ago
|
package icssessionmanager
|
||
|
|
||
|
import (
|
||
|
"strings"
|
||
|
|
||
|
"gitlab.com/ics_cinnamon/voicegateway/icspacketparser"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
ICS_SIP_AUTOMATA_REGISTER = 32767
|
||
|
//ICS_SIP_AUTOMATA_REGISTER = 2
|
||
|
ICS_SIP_AUTOMATA_INVITE = 32767
|
||
|
ICS_SIP_AUTOMATA_ACK = 32767
|
||
|
ICS_SIP_AUTOMATA_CANCEL = 14336
|
||
|
ICS_SIP_AUTOMATA_BYE = 32767
|
||
|
ICS_SIP_AUTOMATA_NOTIFY = 32767
|
||
|
ICS_SIP_AUTOMATA_OPTIONS = 32767
|
||
|
/*
|
||
|
ICS_SIP_AUTOMATA_INVITE = 11266
|
||
|
ICS_SIP_AUTOMATA_ACK = 32767
|
||
|
ICS_SIP_AUTOMATA_CANCEL = 14336
|
||
|
ICS_SIP_AUTOMATA_BYE = 32767
|
||
|
*/
|
||
|
//ICS_SIP_AUTOMATA_BYE = 0
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
ICS_SIP_JOB_TYPE_REGISTER = 1 << iota
|
||
|
ICS_SIP_JOB_TYPE_INVITE
|
||
|
ICS_SIP_JOB_TYPE_PUBLISH
|
||
|
ICS_SIP_JOB_TYPE_OPTIONS
|
||
|
ICS_SIP_JOB_TYPE_INFO
|
||
|
ICS_SIP_JOB_TYPE_UPDATE
|
||
|
ICS_SIP_JOB_TYPE_REFER
|
||
|
ICS_SIP_JOB_TYPE_SUBSCRIBE
|
||
|
ICS_SIP_JOB_TYPE_MESSAGE
|
||
|
ICS_SIP_JOB_TYPE_NOTIFY
|
||
|
ICS_SIP_JOB_TYPE_PRACK
|
||
|
ICS_SIP_JOB_TYPE_ACK
|
||
|
ICS_SIP_JOB_TYPE_BYE
|
||
|
ICS_SIP_JOB_TYPE_CANCEL
|
||
|
)
|
||
|
|
||
|
func SessionAvailableSipMethod(sip *icspacketparser.SIP) bool {
|
||
|
if sip.Method == icspacketparser.ICS_SIP_METHOD_INVITE || sip.Method == icspacketparser.ICS_SIP_METHOD_CANCEL || sip.Method == icspacketparser.ICS_SIP_METHOD_BYE || sip.Method == icspacketparser.ICS_SIP_METHOD_ACK || sip.Method == icspacketparser.ICS_SIP_METHOD_NOTIFY {
|
||
|
return true
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_SIP20 {
|
||
|
if strings.Contains(sip.Cseq, " INVITE") || strings.Contains(sip.Cseq, " CANCEL") || strings.Contains(sip.Cseq, " BYE") || strings.Contains(sip.Cseq, " ACK") || strings.Contains(sip.Cseq, " REGISTER") || strings.Contains(sip.Cseq, " OPTIONS") {
|
||
|
return true
|
||
|
/*
|
||
|
if sip.ResType == "183" || sip.ResType == "200" {
|
||
|
return true
|
||
|
}
|
||
|
*/
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func (s *IcsSession) CheckAutomataWithType(methodType int) bool {
|
||
|
return (s.MethodAutomata & methodType) == methodType
|
||
|
}
|
||
|
|
||
|
func (s *IcsSession) CheckAutomata(sip *icspacketparser.SIP) bool {
|
||
|
jobType := GetJobType(sip)
|
||
|
|
||
|
return (s.MethodAutomata & jobType) == jobType
|
||
|
/*
|
||
|
// fmt.Println("^^^^^", "s.MethodAutomata,jobType,sip.Method", s.MethodAutomata, jobType, sip.Method)
|
||
|
if (s.MethodAutomata&jobType) == jobType || jobType == ICS_SIP_JOB_TYPE_BYE {
|
||
|
// fmt.Println("^^^^^", "automata find ok")
|
||
|
return true
|
||
|
}
|
||
|
// fmt.Println("^^^^^", "not allow automata sip.Cseq", sip.Cseq)
|
||
|
|
||
|
return false
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
func GetJobType(sip *icspacketparser.SIP) int {
|
||
|
if sip.Method == icspacketparser.ICS_SIP_METHOD_SIP20 {
|
||
|
if strings.Contains(sip.Cseq, " INVITE") {
|
||
|
return ICS_SIP_JOB_TYPE_INVITE
|
||
|
} else if strings.Contains(sip.Cseq, " ACK") {
|
||
|
return ICS_SIP_JOB_TYPE_ACK
|
||
|
} else if strings.Contains(sip.Cseq, " BYE") {
|
||
|
return ICS_SIP_JOB_TYPE_BYE
|
||
|
} else if strings.Contains(sip.Cseq, " REGISTER") {
|
||
|
return ICS_SIP_JOB_TYPE_REGISTER
|
||
|
} else if strings.Contains(sip.Cseq, " CANCEL") {
|
||
|
return ICS_SIP_JOB_TYPE_CANCEL
|
||
|
} else if strings.Contains(sip.Cseq, " OPTIONS") {
|
||
|
return ICS_SIP_JOB_TYPE_OPTIONS
|
||
|
}
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_REGISTER {
|
||
|
return ICS_SIP_JOB_TYPE_REGISTER
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_INVITE {
|
||
|
return ICS_SIP_JOB_TYPE_INVITE
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_CANCEL {
|
||
|
return ICS_SIP_JOB_TYPE_CANCEL
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_BYE {
|
||
|
return ICS_SIP_JOB_TYPE_BYE
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_ACK {
|
||
|
return ICS_SIP_JOB_TYPE_ACK
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_NOTIFY {
|
||
|
return ICS_SIP_JOB_TYPE_NOTIFY
|
||
|
}
|
||
|
return -1
|
||
|
}
|
||
|
|
||
|
func (s *IcsSession) SetSessionMethodWithType(methodType int) {
|
||
|
s.MethodAutomata = methodType
|
||
|
}
|
||
|
|
||
|
func (s *IcsSession) SetSessionMethod(sip icspacketparser.SIP) {
|
||
|
if sip.Method == icspacketparser.ICS_SIP_METHOD_SIP20 {
|
||
|
if strings.Contains(sip.Cseq, " REGISTER") {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_REGISTER
|
||
|
//fmt.Println(">>>>>>>>>>", s.MethodAutomata, ICS_SIP_AUTOMATA_REGISTER)
|
||
|
} else if strings.Contains(sip.Cseq, " INVITE") {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_INVITE
|
||
|
} else if strings.Contains(sip.Cseq, " CANCEL") {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_CANCEL
|
||
|
} else if strings.Contains(sip.Cseq, " BYE") {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_BYE
|
||
|
} else if strings.Contains(sip.Cseq, " ACK") {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_ACK
|
||
|
} else if strings.Contains(sip.Cseq, " OPTIONS") {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_OPTIONS
|
||
|
}
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_REGISTER {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_REGISTER
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_INVITE {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_INVITE
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_CANCEL {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_CANCEL
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_BYE {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_BYE
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_ACK {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_ACK
|
||
|
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_NOTIFY {
|
||
|
s.MethodAutomata = ICS_SIP_AUTOMATA_NOTIFY
|
||
|
}
|
||
|
}
|