Forum Discussion
Nat_Thirasuttakorn
Mar 08, 2012Employee
Hi Pavel,
here is something that should work... (however, I didnt test 🙂 )
the idea is to decode submit_sm to find dest-addr
rewrite sequence number of request that was sent from SMSC (and rewrite it back to its original value in the _resp)
you may need to apply mblb profile to virtual: modify ltm virtual smpp profiles add {mblb}
when CLIENT_ACCEPTED {
set s_seq_idx 1
set first_bind_resp 1
set smsc1 10.10.10.1
set smsc2 10.10.10.2
TCP::collect
}
when CLIENT_DATA {
while { [TCP::payload length] > 16 } {
binary scan [TCP::payload] IH8IIa* len oper status seq p
if { [TCP::payload length] < $len } {
TCP::collect $len
return
}
switch -glob $oper {
00000002 {
set bind_message [TCP::payload $len]
}
00000004 {
submit_sm
set p [string range $p [expr [string first \x00 $p]+1] end]
binary scan $p cca* ston snpi p
set p [string range $p [expr [string first \x00 $p]+1] end]
binary scan $p ccA* dton dnpi p
set dest [getfield $p \x00 1]
if { $dest starts_with 420 } {
use pool or node command
pool [LB::server pool] member $smsc1 9000
} else {
pool [LB::server pool] member $smsc2 9000
}
}
8* {
rewrite seq
if { [info exists s_seq_map($seq)] } {
set old_seq [lindex $s_seq_map($seq) 0]
TCP::payload replace 12 4 [binary format I $s_seq_idx]
set addr [lindex $s_seq_map($seq) 1]
set port [lindex $s_seq_map($seq) 2]
use pool or node command
pool [LB::server pool] member $addr $port
unset s_seq_map($seq)
}
}
}
TCP::release $len
TCP::notify request
}
TCP::collect
}
when SERVER_CONNECTED {
if { $first_bind_resp } {
TCP::collect
} else {
TCP::collect -all
TCP::respond $bind_message
}
}
when SERVER_DATA {
while { [TCP::payload length] > 16 } {
binary scan [TCP::payload] IH8II len oper status seq
if { [TCP::payload length] < $len } {
TCP::collect $len
return
}
switch -glob $oper {
0* {
rewrite seq
TCP::payload replace 12 4 [binary format I $s_seq_idx]
set s_seq_map($s_seq_idx) "$seq [IP::remote_addr] [TCP::remote_port]"
incr s_seq_idx
}
80000002 {
bind response
if { $first_bind_resp } {
set first_bind_resp 0
} else {
TCP::payload replace 0 [TCP::payload length] ""
set len 0
}
}
}
TCP::release $len
TCP::notify response
}
TCP::collect
}
Nat