While working on getting IP V6 to work, I had problems getting my routing on z/OS working properly. I spent a few days working with TCPIP dynamic routing. What I have written below is what I have learned, it may well be wrong!
The problem…
With TCPIP you can define static routes. For example
BEGINRoutes ; Destination SubnetMask FirstHop LinkName Size ROUTE 9.114.209.0 255.255.255.0 = ETH2 MTU 1492 ROUTE DEFAULT 10.1.1.1 ETH1 MTU 1492 ROUTE DEFAULT6 FE80::8C46:FAFF:FE86:1721 IFPORTCP6 MTU 1492 ENDRoutes
This says
- To send data IP V4 address9.114.209.* go via the link ETH2.
- Otherwise send all IPV4 traffic to link ETH1 which has address 10.1.1.
- Send all IP6 traffic to link IFPORTCP6 – which has an IP address of FE80::8C46:FAFF:FE86:1721.
Maintaining lists like these quickly become unmanageable as the size of the network increases.
Dynamically finding the configuration
To solve this problem TCPIP was enhanced to allow the system to discover information. The OMPROUTE daemon manages this.
When OMPROUTE is started, it queries the TCPIP configuration. It merges this information with its configuration data, and sends a request out to participating interfaces “Hello – who are you connected to”. From this information it can build a pictures of the network.
The “Hello – who are you connected to” could produce a lot of output; you can get information about all the links and routers in your environment.
You can divide your network ( from an OMPROUTE perspective ) into areas, and so only routers within an area exchange information. The areas have a number like 1.1.1.1.
The main backbone has number 0.0.0.0 You can send requests between areas. Routers which connect an area to the backbone are called Area Border Routers.
An Area Border Router can be configured as a default route – if a router does not know where to send the packet, send it to the Area Border Router.
Where is this information stored?
It looks like this configuration information is stored in the TCPIP address space, because if you shut down OMPROUTE, the configuration persists. I do not think the information will be updated, until OMPROUTE is restarted.
Routing packets
When a packet needs to be sent to a destination it uses the information provided by OMPROUTE. It uses two algorithms,
- OSPF -Open shortest path first. As the state of an element in the network changes – the change is broadcast to all the routers. This means a router can quickly respond to a configuration change.
- RIP – Routing interface protocol. This uses the number of hops. (I would have thought this was the same as the shortest path.) A RIP router has a 30 second heartbeat with its connected networks. If it has not received a response after 180 seconds, it assumes the network link is down.
It looks like OSPF is the better protocol, it is faster to respond to changes, and listens to changes, rather than using a heartbeat, and looks like it scales better.
Creating OMPROUTE
The documentation is not the clearest. I think it assumes you are an expert before you start.
The IBM documentation is here.
My additional steps included
- The …TCPIP(PROF2) had “520 UDP OROUTED ; RouteD Server”. This name needs to match your started task proc. Either change the TCPIP profile, or use OROUTED as your proc name.
- OMPROUTE procedure needs a userid with an OMVS segment.
- Create RACF started task profile. Profile OMPROUTE.* with CLASS(STARTED). STDATA INFORMATION user=…
- I created USER.Z25A.tcpparms(omp) and copied TCPIP.SEZAINST(EZAORCFG) into it.
- Initially I forgot to use define the RACF profile CLASS(OPERCMDS) MVS.ROUTEMGR.OMPROUTE
My OMPROUTE procedure was
//OMPROUTE PROC //OMPROUTE EXEC PGM=OMPROUTE,REGION=0M,TIME=NOLIMIT, // PARM=('ENVAR("_CEE_ENVFILE_S=DD:STDENV")/') //* //OMPCFG DD DISP=SHR,DSN=USER.Z25A.TCPPARMS(OMP) //STDENV DD * RESOLVER_CONFIG=//'ADCD.Z25A.TCPPARMS(TCPDATA)' OMPROUTE_DEBUG_FILE=/tmp/logs/omproute.debug OMPROUTE_IPV6_DEBUG_FILE=/tmp/logs/omprout6.debug OMPROUTE_DEBUG_FILE_CONTROL=1000,5 //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //CEEDUMP DD SYSOUT=*,DCB=(RECFM=FB,LRECL=132,BLKSIZE=132) // PEND
The OMPROUTE configuration is in //OMPCFG … USER.Z25A.TCPPARMS(OMP)
Setting up syslogd
If you are not running SYSLOGD, all of the console messages are prefixed with
BPXF024I (TCPIP) Oct 6 10:11:10 omproute 67174435 : …
When running with SYSLOGD, the default syslogd configuration is to write errors to a file (for example into /var/log/2022/10/06/errors) , and throws away the remainder. I added the following to my syslogd configuration and restarted syslogd.
*.OMPROUTE..* /var/log/%Y/%m/%d/omproute
The messages were then put into the file, and were like
Oct 6 11:52:19 S0W1 omproute[67174443]: EZZ7800I OMPROUTE starting
Oct 6 11:52:24 S0W1 omproute[67174443]: EZZ7817I Using defined OSPF protocol 89
Oct 6 11:52:24 S0W1 omproute[67174443]: EZZ7817I Using defined OSPF protocol 89
Oct 6 11:52:24 S0W1 omproute[67174443]: EZZ7838I Using configuration file: dd:OMPCFG=USER.Z25A.TCPPARMS(OMP)
After OMPROUTE started, In this file I had 19 messages. There were 6 message on the job log.
Configuring OMPROUTE
I had a TCPIP configuration with
INTERFACE IFPORTCP6 DEFINE IPAQENET6 CHPIDTYPE OSD PORTNAME PORTCP INTFID 7:7:7:7 IPADDR FE00::66:7:7:7 DEVICE PORTB MPCIPA LINK ETH2 IPAQENET PORTB HOME 172.26.1.9 ETH2 DEVICE PORTA MPCIPA LINK ETH1 IPAQENET PORTA HOME 10.1.1.2 ETH1
In my configuration file I had
OSPF_INTERFACE Attaches_to_Area =0.0.0.0 IP_Address=10.1.1.2 Subnet_mask=255.255.255.0 NAME=ETH1 ; RIP_INTERFACE IP_Address=10.1.1.2 Subnet_mask=255.255.255.0 NAME=PORTA ; IPv6_OSPF RouterID = 7.7.7.7 ; IPV6_OSPF_INTERFACE Attaches_to_Area =0.0.0.0 NAME=IFPORTCP6 ; IPv6_RIP_Interface Name = IFPORTCP6 ;
At startup I got messages in the job log
EZZ7871I NO MATCHING INTERFACE STATEMENTS FOR 172.26.1.20 (EZASAMEMVS) EZZ8171I OMPROUTE IPV4 OSPF IS USING ASSIGNED ROUTER ID 10.1.1.2 FROM ETH1 INTERFACE EZZ8171I OMPROUTE IPV6 OSPF IS USING CONFIGURED ROUTER ID 7.7.7.7 FROM IPV6_OSPF STATEMENT
To resolve the problem with EZASAMEMVS I added
Interface IP_Address=172.26.1.20 Name=EZASAMEMVS subnet_mask=255.255.255.0 ;
Which basically says this interface is not involved in any dynamic routing.
Once this was resolved the messages in the syslogd file were
EZZ7800I OMPROUTE starting
EZZ7817I Using defined OSPF protocol 89
EZZ7817I Using defined OSPF protocol 89
EZZ7838I Using configuration file: dd:OMPCFG=USER.Z25A.TCPPARMS(OMP)
EZZ7883I Processing interface from stack, address 10.1.1.2, name ETH1, index 5, flags 441
EZZ7883I Processing interface from stack, address 172.26.1.20, name EZASAMEMVS, index 2, flags ffff8c50
EZZ7871I No matching interface statements for 172.26.1.20 (EZASAMEMVS)
EZZ7977I Processing IPv6 interface from stack, address fe00::66:7:7:7, name IFPORTCP6, index 51, flags 1, flags2 0
EZZ7977I Processing IPv6 interface from stack, address fe80::7:7:7:7, name IFPORTCP6, index 51, flags 1, flags2 2
EZZ7882I Processing static route from stack, destination 9.114.209.0, Mask 255.255.255.0, gateway 0.0.0.0 , table EZBMAIN
EZZ7882I Processing static route from stack, destination 0.0.0.0, Mask 0.0.0.0, gateway 10.1.1.1 , table EZBMAIN
EZZ7882I Processing static route from stack, destination ::, prefixlen 0, gateway fe80::8c46:faff:fe86:1721 , table EZBMAIN
EZZ8023I The RIP routing protocol is Enabled
EZZ8036I The IPv6 RIP routing protocol is Enabled
EZZ8171I OMPROUTE IPv4 OSPF is using assigned router ID 10.1.1.2 from ETH1 interface
EZZ7937I The IPv4 OSPF routing protocol is Enabled
EZZ8171I OMPROUTE IPv6 OSPF is using configured router ID 7.7.7.7 from IPV6_OSPF statement
EZZ7937I The IPv6 OSPF routing protocol is Enabled
EZZ7898I OMPROUTE Initialization Complete
Displaying information from OMPROUTE
On the console
You can use commands like
d tcpip,,omp,ospf,list,all
d tcpip,,omp,ipv6ospf,all
d tcpip,,omprtoute,rttable
f omproute,ospf,list,all
f omproute,rttable
f omproute,rt6table
f omproute,IPV6OSPF,if
f omproute,IPV6OSPF,list,all
f omproute,IPV6OSPF,statistics
f omproute,IPV6rip,list,all
f omproute,ospf,nbrs
All of which will list all information about the OSPF configuration.
There are three types of resource you an display
- OSPF – d tcpip,,omp,ospf,list,all or d tcpip,,omp,IPV6ospf,list,all
- RIP – d tcpip,,omp,rip,list,all or d tcpip,,omp,IPV6rip,list,all
- Other interface – d tcpip,,omp,generic,all or d tcpip,,omp,generic6,all
From netstat
Once OMPROUTE was active NETSTAT ROUTE gave me
IPv4 Destinations Destination Gateway Flags Refcnt Interface ----------- ------- ----- ------ --------- Default 10.1.1.1 UGS 0000000000 ETH1 9.114.209.0/24 0.0.0.0 US 0000000000 ETH1 10.1.1.0/24 0.0.0.0 UO 0000000000 ETH1 10.1.1.2/32 0.0.0.0 UH 0000000000 ETH1 127.0.0.1/32 0.0.0.0 UH 0000000002 LOOPBACK 172.26.1.20/32 0.0.0.0 H 0000000000 EZAZCX 172.26.1.20/32 0.0.0.0 H 0000000000 EZASAMEMVS IPv6 Destinations DestIP: Default Gw: fe80::8c46:faff:fe86:1721 Intf: IFPORTCP6 Refcnt: 0000000000 Flgs: UGS MTU: 1492 DestIP: ::1/128 Gw: :: Intf: LOOPBACK6 Refcnt: 0000000000 Flgs: UH MTU: 65535 DestIP: fe00::66:7:7:7/128 Gw: :: Intf: IFPORTCP6 Refcnt: 0000000000 Flgs: UH MTU: 9000 DestIP: fe80::7:7:7:7/128 Gw: :: Intf: IFPORTCP6 Refcnt: 0000000000 Flgs: UH MTU: 9000
Where key fields are
- Flgs UO. U=The interface is UP, and The route was created by OSPF (includes OSPF external routes).