When modernizing legacy banking systems, even a simple-looking migration can reveal deep architectural complexities. One such challenge emerged during our recent project to migrate Telnet connectivity from z/VSE to z/OS. That task seemed routine at first glance but soon tested the very limits of IBM’s TN3270 implementation.
The Challenge: One Port per Branch
In the legacy z/VSE environment, each bank branch, ATM, and remote system connected using its own dedicated TCP Telnet port.
Why is it like that? On the old z/VSE environment each branch was using unique port which also served as the branch code used in applications for the purpose of authenticating, reporting and other use cases. For operational traceability and compatibility, we had to maintain this 1:1 port mapping during the migration.
That meant replicating over 750 Telnet ports on z/OS where each representing a unique branch code, ATM, other bank system or remote endpoint. While the approach simplified external dependencies and minimized code changes, it introduced unexpected pressure on the z/OS Communications Server and TN3270 infrastructure for such many simultaneous listener definitions.
The Port-by-Port Strategy on z/OS
Since it was not an option for customers to change their application and network architecture, we had to ⁄preserve the branch connectivity model exactly as before, but under z/OS.
In the new setup:
- Each TN3270 server was configured with multiple listening ports.
- Every port is mapped to a Logical Unit (LU) or LU pool, defining session routing and terminal assignment.
- Branch systems continued to use the same IP and port combinations, maintaining full backward compatibility.
Technical Limitations (from IBM Documentation)
As we scaled the configuration, we encountered hard architectural limits inherent to z/OS TN3270:
- TN3270 server limit: Up to 255 listener ports per TN3270 Telnet server.
- TCP/IP stack limit: Up to 8 TN3270 servers per TCP/IP stack in z/OS Communications Server.
Mathematically, this gave us a theoretical ceiling of 2,040 ports (8 × 255), but in practice, other constraints like memory usage, CSA allocation, and system performance set tighter operational boundaries.
Go-Live Surprises
Once the system went live, the first connection waves from branch terminals exposed a critical issue: TN3270 address spaces began crashing shortly after branches started connecting.
After deep analysis, the culprit was found in CSA memory “below the line”, specifically in allocating sub pool 130, where the TN3270 servers allocate control blocks for session management and listener tracking.
The excessive number of listeners caused CSA depletion, leading to instability and task terminations.

Resolution and Stabilization
To balance performance, reliability, and architectural constraints, we restructured the deployment:
- Each TN3270 server now handles ~125 listener ports — safely below the per-server limit.
- Seven TN3270 Telnet servers are now active within the same z/OS TCP/IP stack, distributing the 750+ ports across them.
- CSA usage stabilized, and no further address of space failures were observed for post-adjustment.
Architecture Overview

Conclusion
What started as a straightforward port migration evolved into a deep exploration of z/OS TN3270 architecture. By restructuring the configuration across multiple servers and balancing listener loads, the environment stabilized and performed reliably.
The key lesson: in mainframe systems, scale transforms simplicity into complexity. Thoughtful design, thorough testing, and respect for architectural boundaries remain the foundation of successful modernization.