sccp: Work on accepting connections and releasing them.
This commit is contained in:
parent
22252d43b7
commit
198eaba529
|
@ -134,6 +134,19 @@ Object subclass: SCCPConnection [
|
||||||
self readQueue nextPut: aDT data.
|
self readQueue nextPut: aDT data.
|
||||||
]
|
]
|
||||||
|
|
||||||
|
release [
|
||||||
|
| rlsd |
|
||||||
|
|
||||||
|
state := SCCPConnection stateReleased.
|
||||||
|
rlsd := Osmo.SCCPConnectionReleased initWithDst: self dstRef src: self srcRef cause: 0.
|
||||||
|
self nextPut: rlsd toMessage.
|
||||||
|
]
|
||||||
|
|
||||||
|
releaseComplete: aMSG [
|
||||||
|
"TODO: verify that we are in the right state"
|
||||||
|
self terminate.
|
||||||
|
]
|
||||||
|
|
||||||
released: aRLSD [
|
released: aRLSD [
|
||||||
| rlc |
|
| rlc |
|
||||||
"Give up local resources here. We are done."
|
"Give up local resources here. We are done."
|
||||||
|
@ -144,6 +157,8 @@ Object subclass: SCCPConnection [
|
||||||
self nextPut: rlc toMessage.
|
self nextPut: rlc toMessage.
|
||||||
self terminate.
|
self terminate.
|
||||||
]
|
]
|
||||||
|
|
||||||
|
state [ <category: 'accessing'> ^ state ]
|
||||||
]
|
]
|
||||||
|
|
||||||
Object subclass: MSGParser [
|
Object subclass: MSGParser [
|
||||||
|
@ -218,6 +233,14 @@ Object subclass: SCCPHandler [
|
||||||
self connections remove: aConnection.
|
self connections remove: aConnection.
|
||||||
^ true
|
^ true
|
||||||
].
|
].
|
||||||
|
(aMessage isKindOf: Osmo.SCCPConnectionReleaseComplete)
|
||||||
|
ifTrue: [
|
||||||
|
aConnection releaseComplete: aMessage.
|
||||||
|
self connections remove: aConnection.
|
||||||
|
^ true.
|
||||||
|
].
|
||||||
|
|
||||||
|
self logError: 'Unhandled SCCP packet %1' % {aMessage class} area: #sccp.
|
||||||
|
|
||||||
"Message is not handled here"
|
"Message is not handled here"
|
||||||
^ false
|
^ false
|
||||||
|
@ -234,17 +257,52 @@ Object subclass: SCCPHandler [
|
||||||
'No one has handled the connection with ', aMessage dst asString printNl.
|
'No one has handled the connection with ', aMessage dst asString printNl.
|
||||||
]
|
]
|
||||||
|
|
||||||
|
dissectMSG: aMsg [
|
||||||
|
^ MSGParser parse: (aMsg asByteArray).
|
||||||
|
]
|
||||||
|
|
||||||
|
newConnection: aCon [
|
||||||
|
"Interesting for subclasses"
|
||||||
|
]
|
||||||
|
|
||||||
|
confirmConnection: aMsg [
|
||||||
|
| con res |
|
||||||
|
con := SCCPConnection new.
|
||||||
|
con srcRef: self assignSrcRef.
|
||||||
|
con conManager: self.
|
||||||
|
self connections add: con.
|
||||||
|
|
||||||
|
"Confirm the messga now and send any data"
|
||||||
|
con confirm: aMsg.
|
||||||
|
aMsg data ifNotNil: [
|
||||||
|
con data: aMsg.
|
||||||
|
].
|
||||||
|
|
||||||
|
"Confirm it without sending any new data bad"
|
||||||
|
res := Osmo.SCCPConnectionConfirm initWithSrc: (con srcRef) dst: (con dstRef).
|
||||||
|
self sendMsg: res toMessage.
|
||||||
|
|
||||||
|
self newConnection: con.
|
||||||
|
^ con.
|
||||||
|
]
|
||||||
|
|
||||||
handleMsg: aMsg [
|
handleMsg: aMsg [
|
||||||
| sccp |
|
| sccp |
|
||||||
|
|
||||||
[
|
[
|
||||||
sccp := MSGParser parse: (aMsg asByteArray).
|
sccp := self dissectMSG: aMsg asByteArray.
|
||||||
] on: Exception do: [
|
] on: Exception do: [
|
||||||
self logError: 'Failed to parse message' area: #sccp.
|
self logError: 'Failed to parse message' area: #sccp.
|
||||||
aMsg toMessageOrByteArray printNl.
|
aMsg toMessageOrByteArray printNl.
|
||||||
^ false
|
^ false
|
||||||
].
|
].
|
||||||
|
|
||||||
|
(sccp isKindOf: Osmo.SCCPConnectionRequest) ifTrue: [
|
||||||
|
self logNotice: 'New incoming connection' area: #sccp.
|
||||||
|
self confirmConnection: sccp.
|
||||||
|
^ true
|
||||||
|
].
|
||||||
|
|
||||||
self dispatchMessage: sccp.
|
self dispatchMessage: sccp.
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
53
Tests.st
53
Tests.st
|
@ -433,10 +433,23 @@ Object subclass: DummyConnection [
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
Object subclass: DirectConnection [
|
||||||
|
| handler |
|
||||||
|
|
||||||
|
DirectConnection class >> initWith: aHandler [
|
||||||
|
^ self new
|
||||||
|
instVarNamed: #handler put: aHandler; yourself.
|
||||||
|
]
|
||||||
|
|
||||||
|
send: aMsg with: aProto [
|
||||||
|
handler handleMsg: aMsg.
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
SCCPHandler subclass: SCCPHandlerNonRec [
|
SCCPHandler subclass: SCCPHandlerNonRec [
|
||||||
handleMsg: aMsg [
|
dissectMSG: aMsg [
|
||||||
self dispatchMessage: (Osmo.SCCPMessage decode: aMsg asByteArray).
|
^ Osmo.SCCPMessage decode: aMsg asByteArray.
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -466,4 +479,40 @@ TestCase subclass: SCCPHandlerTest [
|
||||||
handler handleMsg: (Osmo.SCCPConnectionData initWith: con srcRef data: '123' asByteArray) toMessage asByteArray.
|
handler handleMsg: (Osmo.SCCPConnectionData initWith: con srcRef data: '123' asByteArray) toMessage asByteArray.
|
||||||
self assert: con readQueue isEmpty.
|
self assert: con readQueue isEmpty.
|
||||||
]
|
]
|
||||||
|
|
||||||
|
testConnectionHandling [
|
||||||
|
| client server con serverCon|
|
||||||
|
"Test opening and closing connections"
|
||||||
|
|
||||||
|
client := SCCPHandlerNonRec new.
|
||||||
|
server := SCCPHandlerNonRec new.
|
||||||
|
|
||||||
|
"Connect both handlers directly"
|
||||||
|
client connection: (DirectConnection initWith: server).
|
||||||
|
server connection: (DirectConnection initWith: client).
|
||||||
|
|
||||||
|
"Establish the connection"
|
||||||
|
con := client createConnection: '123' asByteArray.
|
||||||
|
self assert: con state = SCCPConnection stateConnected.
|
||||||
|
|
||||||
|
self assert: server connections size = 1.
|
||||||
|
serverCon := server connections first.
|
||||||
|
self assert: serverCon state = SCCPConnection stateConnected.
|
||||||
|
|
||||||
|
"Check if we were able to read data"
|
||||||
|
self assert: serverCon readQueue isEmpty not.
|
||||||
|
self assert: serverCon next = '123' asByteArray.
|
||||||
|
|
||||||
|
"Now close the connection"
|
||||||
|
serverCon release.
|
||||||
|
self assert: serverCon state = SCCPConnection stateReleased.
|
||||||
|
self assert: con state = SCCPConnection stateReleased.
|
||||||
|
|
||||||
|
self assert: client connections size = 0.
|
||||||
|
self assert: server connections size = 0.
|
||||||
|
|
||||||
|
"Verify we will now get exceptions"
|
||||||
|
self should: [con next] raise: SystemExceptions.EndOfStream.
|
||||||
|
self should: [serverCon next] raise: SystemExceptions.EndOfStream.
|
||||||
|
]
|
||||||
]
|
]
|
||||||
|
|
Reference in New Issue