Applies To:
Show VersionsBIG-IP LTM
- 15.0.1, 15.0.0, 14.1.3, 14.1.2, 14.1.0, 14.0.1, 14.0.0, 13.1.3, 13.1.1, 13.1.0
Generic Message Example
This section provides an example of using Generic Message to implement a simple chat client.
Each new connection will be asked for the peer's name. The provided name will be used to add a dynamic route to the route table.
Subsequent text entered will be treated as a request or response message. Requests are of the form: "<destination>:<text>\n". Responses do not contain a destination. A response message will be routed to the originator of the oldest request received.
BIG-IP Configuration
ltm pool gm_pool { members { 10.1.1.100:1234 { address 10.1.1.100 } } } ltm message-routing generic peer default_peer { pool gm_pool transport-config my_tc } ltm message-routing generic protocol my_gm_proto { app-service none disable-parser yes } ltm message-routing generic route default_route { peers { default_peer } } ltm message-routing generic router my_gm_router { app-service none routes { default_route } } ltm message-routing generic transport-config my_tc { ip-protocol tcp profiles { my_gm_proto { } tcp { } } rules { gm_rule } } ltm virtual gm_vs { destination 10.1.1.50:1234 ip-protocol tcp mask 255.255.255.255 profiles { my_gm_proto { } my_gm_router { } tcp { } } rules { gm_rule } source 0.0.0.0/0 vs-index 2 } ltm rule gm_rule { when CLIENT_ACCEPTED { TCP::respond "What is your name\n" TCP::collect set capture_name 1 } when SERVER_CONNECTED { TCP::respond "What do you wish to be called\n" TCP::collect set capture_name 1 } when CLIENT_DATA { set lines [split [TCP::payload] "\n"] TCP::payload 0 0 foreach line $lines { set line [string trim $line] if { [string length $line] > 0 } { if { $capture_name == 1 } { GENERICMESSAGE::peer name $line set capture_name 0 TCP::respond "Welcome [GENERICMESSAGE::peer name]\n" } else { set tokens [split $line ":"] if {[llength $tokens] > 1} { GENERICMESSAGE::message create [join [lrange $tokens 1 end] ":"] [lindex $tokens 0] } else { GENERICMESSAGE::message create $line } } } } TCP::release TCP::collect } when SERVER_DATA { set lines [split [TCP::payload] "\n"] TCP::payload 0 0 foreach line $lines { set line [string trim $line] if { [string length $line] > 0 } { if { $capture_name == 1 } { GENERICMESSAGE::peer name $line set capture_name 0 TCP::respond "Welcome [GENERICMESSAGE::peer name]\n" } else { set tokens [split $line ":"] if {[llength $tokens] > 1} { GENERICMESSAGE::message create [join [lrange $tokens 1 end] ":"] [lindex $tokens 0] } else { GENERICMESSAGE::message create $line } } } } TCP::release TCP::collect } when GENERICMESSAGE_INGRESS { # TCP::respond "GM_INGRESS is_request [GENERICMESSAGE::message is_request] req_seq_num [GENERICMESSAGE::message request_sequence_number]\n" } when MR_INGRESS { # TCP::respond "MR_INGRESS src: [GENERICMESSAGE::message src] dest [GENERICMESSAGE::message dest] lasthop [MR::message lasthop] nexthop: [MR::message nexthop]\n" } when GENERICMESSAGE_EGRESS { # TCP::respond "GM_EGRESS status: [GENERICMESSAGE::message status] is_request [GENERICMESSAGE::message is_request] req_seq_num [GENERICMESSAGE::message request_sequence_number]\n" TCP::respond "[GENERICMESSAGE::message data]\n" } }
Client Server Configuration
Server
Execute the following command (with local IP address):
nc -l 10.1.1.100 1234
Client
Execute the following command (with local IP address):
telnet 10.1.1.50 1234
Communication Dialogue
The following example illustrates communication between different clients and a server. The example traverses down with time. Text entered is in courier.
Client A | Client B | Server | Notes |
---|---|---|---|
What is your name Alex Welcome Alice |
What is your name Bob Welcome Bob |
Both clients connect and provide their routing name | |
Bob: Are you there | Request sent to route Bob (Req 1) | ||
Are you there Yes, who is this? |
Request displayed (Req 1) Response (there is no destination provided), so it is routed to the originator of the oldest request (Rsp 1) |
||
Yes, who is this? Bob: This is Alex |
Response delivered (Rsp 1) New request (Req 2) |
||
This is Alice Alex: hello Alex |
Request delivered (Req 2) New request (Req 3) |
||
hello Alex | Request delivered (Req 3) | ||
Charlie: Are you there? | New request (Req 4), destination does not match any existing routes so the default route is selected. | ||
What do you wish to be called Dave Welcome Dave |
New connection established to pool member of default route | ||
Are you there? Yes, who is this? |
Request delivered (Req 4) Response to Req 4 (Rsp 4) |
||
Yes, who is this? Bob |
Response delivered (Rsp 4) Since there is no destination, this is a response. This will be matched to the oldest pending request on this connection which is Req 2 (Rsp 2) |
||
Bob | Response to Req 2 delivered (Rsp 2) |