Chapter 7: Checking Out RIP and EIGRP Characteristics and Design

In This Chapter

check.png Configuring common options for the RIP and EIGRP protocols

check.png Working with troubleshooting tools to manage the RIP and EIGRP protocols

As I discuss at length in Chapters 1 and 6 of this minibook, you can choose from various protocols to dynamically manage the routing tables on your network. In this chapter, you implement two of these protocols, RIP and EIGRP. You find out not only how to enable them, but also how to configure the main options you need to properly work with these protocols. You also examine the basic tools used in diagnosing issues that arise in their operation. After the protocols are up and running, you have the basic tools you need in order to manage the protocols. If you read this entire chapter, you will be able to work comfortably with the configuration and management processes for both RIP and EIGRP.

Working with Routing Information Protocol (RIP)

I first present RIP in Book IV, Chapter 1 with an introduction to the major routing protocols. RIP is designed to function on small to large networks but can suffer when a network is not designed to accommodate its eccentricities. This chapter focuses primarily on RIPv2, rather than on RIPv1, because with RIPv1, all systems must use class-based network masks or be subnetted exactly the same way. RIPv2, on the other hand, supports Variable Length Subnet Masks (VLSM). If you choose to deploy network IDs across your network you will likely want to deploy VSLM in order to conserve addresses on your network. So, if you plan to deploy RIP as a protocol, you will likely use version 2.

The biggest issue with RIPv1 is that all systems must use class-based network masks or be subnetted exactly the same way, whereas RIPv2 supports Variable Length Subnet Masks (VLSM). VLSM is covered in Book II, Chapter 1, if you want to find out more about it. The following sections cover the basic commands for setting up RIP and how to monitor or troubleshoot RIP on your network.

Understanding the RIP commands

To work with the RIP commands, you start by enabling the protocol. However, before enabling the routing protocol, you need to enable IP routing, if you have not already done so, which you can see in Chapter 3 of this minibook.

Enabling RIP

As with most routing protocols, when you enable the RIP protocol, you will be placed in Router Configuration mode (config-router), so take note of the change in the configuration prompt during the following example. The main configuration requirement is the list of networks for which RIP will be routing.

The following enables routing for two connected networks, 192.168.1.0/24 and 192.168.10.0/24, for a network that looks like Figure 7-1.

Figure 7-1: A small network for RIP routing.

9780470945582-fg040701.eps

Router2>enable

Password:

Router2#configure terminal

Enter configuration commands, one per line.  End with CNTL/Z.

Router2(config)#ip routing

Router2(config)#router rip

Router2(config-router)#network 192.168.10.0

Router2(config-router)#network 192.168.1.0

Router2(config-router)#exit

Router2(config)#exit

Following this command, RIP automatically starts sending out copies of its routing information for the two identified networks through all of its network interfaces. RIPv1 sends the copies via a broadcast, whereas RIPv2 performs a multicast to 224.0.0.9. For Router2 to receive updates, you also must enable RIP on Router1 with the following commands:

Router1>enable

Password:

Router1#configure terminal

Enter configuration commands, one per line.  End with CNTL/Z.

Router1(config)#ip routing

Router1(config)#router rip

Router1(config-router)#network 192.168.5.0

Router1(config-router)#network 192.168.1.0

Router1(config-router)#exit

Router1(config)#exit

At the same time, RIP receives the data from neighboring RIP routers at 30-second intervals. After this data is received, Router2 updates its routing table so that the new routing table looks like this:

Router2>enable

Password:

Router2#show ip route

Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP

       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area

       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2

       E1 - OSPF external type 1, E2 - OSPF external type 2

       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2

       ia - IS-IS inter area, * - candidate default, U - per-user static route

       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

R    192.168.10.0/24 [120/1] via 192.168.1.1, 00:00:07, FastEthernet0/0

C    192.168.5.0/24 is directly connected, FastEthernet0/1

C    192.168.1.0/24 is directly connected, FastEthernet0/0

S    192.168.3.0/24 [1/0] via 192.168.1.1

The last routing table has several routes. Notably, the first listed route has an R identifier, which denotes that this route was ascertained via RIP.

remember.eps The C identifies directly connected network segments, and the S identifies static routes.

Showing routes coming from a specific routing protocol

To see only the routes that come from specific routing protocols, you modify the show ip route command in the following manner. Now, only the directly connected interfaces and the RIP-provided routes are shown.

Router>enable

Password:

Router2#show ip route connected

C    192.168.5.0/24 is directly connected, FastEthernet0/1

C    192.168.1.0/24 is directly connected, FastEthernet0/0

Router2#show ip route rip

R    192.168.10.0/24 [120/1] via 192.168.1.1, 00:00:15, FastEthernet0/0

Configuring your RIP version

The version of RIP that is currently enabled allows receipt of RIPv1 and RIPv2 data, but it sends out only RIPv1 data. To configure this version of RIP to support only the more modern and flexible version 2, use the following command. Note that this setting has a lot of flexibility, because you can configure RIP to send and receive any combination of RIPv1 and RIPv2 data.

Router2>enable

Password:

Router2#configure terminal

Enter configuration commands, one per line.  End with CNTL/Z.

Router2(config)#ip routing

Router2(config)#router rip

Router2(config-router)#version 2

Router2(config-router)#no auto-summary

Router2(config-router)#neighbor 192.168.1.1

Router2(config-router)#exit

Router2(config)#exit

The preceding command also includes two other commands within the router configuration prompt:

auto-summary: RIPv2 supports the auto-summary feature, which automatically summarizes along classful boundaries. You can configure this behavior to use other network ranges in the interface configuration of your router, or you can completely disable auto-summary using the no auto-summary command in Router Configuration mode. In Interface Configuration mode, you can use the command ip summary-address rip 10.1.0.0 255.255.0.0 to force the summarization to occur at a specific boundary rather than the Class A boundary. In this case, you would be forcing route summary to occur at the 10.1.0.0/16 boundary rather than the class boundary of 10.0.0.0/8.

neighbor: RIP detects neighbor routers, but this process can take time because RIP has to wait for advertisements from neighboring routers. You can use the neighbor to specify on this router what the neighbor routers are. When you do this, rather than send a broadcast and multicast update, RIP sends unicast or directed RIP update messages. Configuring neighbors on each router takes a little more time, but reduces the network traffic associated with RIP by reducing the broadcast traffic.

Troubleshooting RIP

A major task in troubleshooting is gathering information to be used to identify the area where the source of your problem is. This section deals with commands that you can use to gather information about the RIP routing protocol in order to assist in your troubleshooting and problem resolution.

Getting network information

To start this process, look at the ip route command, which in addition to listing routes, can display summary information letting you know how many RIP-based networks exist in the routing table.

Router2>enable

Password:

Router2#show ip route summary

IP routing table name is Default-IP-Routing-Table(0)

IP routing table maximum-paths is 16

Route Source    Networks    Subnets     Overhead    Memory (bytes)

connected       2           0           144         272

static          1           0           72          136

rip             1           0           72          136

Total           4           0           288         544

To ensure that the routing protocol is up and functioning, use the show ip protocols command, which provides similar output to the following. However, first note some important things to look for in the output:

Timers and when the next update will be sent to neighboring routers

Version of RIP in use

Interfaces in use for RIP

Networks being routed by RIP

Address from which you are receiving RIP information

Router2>enable

Password:

Router2#show ip protocols

Routing Protocol is “rip”

  Sending updates every 30 seconds, next due in 12 seconds

  Invalid after 180 seconds, hold down 180, flushed after 240

  Outgoing update filter list for all interfaces is not set

  Incoming update filter list for all interfaces is not set

  Redistributing: rip

  Default version control: send version 2, receive version 2

    Interface             Send  Recv  Triggered RIP  Key-chain

    FastEthernet0/0       2     2

    FastEthernet0/1       2     2

  Automatic network summarization is not in effect

  Maximum path: 4

  Routing for Networks:

    192.168.1.0

    192.168.5.0

  Routing Information Sources:

    Gateway         Distance      Last Update

    192.168.1.1          120      00:32:42

  Distance: (default is 120)

Note the last item, which lists the administrative distance. This point becomes important when using multiple routing protocols, because each protocol has a different default distance that determines which routing protocol is favored when a remote network is advertised on multiple routing protocols.

Seeing information RIP receives

You can view the contents of the RIP database to find out what information RIP has received. Doing so shows you the networks that are part of RIP, the summarization settings, and from which routers your router has learned routes.

Router2>enable

Password:

Router2#show ip rip database

192.168.1.0/24    auto-summary

192.168.1.0/24    directly connected, FastEthernet0/0

192.168.5.0/24    auto-summary

192.168.5.0/24    directly connected, FastEthernet0/1

192.168.10.0/24    auto-summary

192.168.10.0/24

    [1] via 192.168.1.1, 00:00:20, FastEthernet0/0

Debugging RIP

Finally, you have the system debug command. In regard to RIP, the debug command is limited to database changes. In the following output, you see the types of data you can get from debug command, which are also listed here:

The RIP information your router is sending out and the networks included in the update

The RIP version being used

The RIP data being received, including the interface it arrived on, the router it came from, and the networks that are included

remember.eps If you are using debug through a remote console, you use terminal monitor to see the debug information the remote console’s screen.

Router2>enable

Password:

Router2#debug ip rip ?

  database  RIP database events

  events    RIP protocol events

  trigger   RIP trigger extension

  <cr>

Router2#debug ip rip

RIP protocol debugging is on

Router2#

*Mar 17 22:57:39.842: RIP: sending v1 update to 255.255.255.255 via FastEthernet0/1 (192.168.5.1)

*Mar 17 22:57:39.842: RIP: build update entries

*Mar 17 22:57:39.842:   network 192.168.1.0 metric 1

*Mar 17 22:57:39.842:   network 192.168.10.0 metric 2

*Mar 17 22:57:46.870: RIP: sending v1 update to 255.255.255.255 via FastEthernet0/0 (192.168.1.240)

*Mar 17 22:57:46.870: RIP: build update entries

*Mar 17 22:57:46.870:   network 192.168.5.0 metric 1

*Mar 17 22:57:53.654: RIP: received v1 update from 192.168.1.1 on FastEthernet0/0

*Mar 17 22:57:53.654:      192.168.10.0 in 1 hops

Router2#no debug ip rip

Working with Enhanced Interior Gateway Routing Protocol (EIGRP)

Because EIGRP has replaced IGRP in all ways, I do not cover IGRP except to say that, for legacy reasons, you may still see it on some routers.

Three main tables, which are stored in memory, support the EIGRP routing protocol:

Neighbor Table: Information about all adjacent routers running EIGRP are stored here. This information includes sequence numbers and protocol timers.

Topology Table: All destination networks that neighbor routers have reported knowing about are stored in this table. This table would include the metrics for every route reported, as some network ID may have multiple routes and the best route would be evaluated by the cost of the metrics.

Routing Table: In addition to least cost routes, EIGRP evaluates secondary routes to each network and creates a list of feasible successors that are added to the routing table. A feasible successor is a route that would be used if the primary route to a network fails.

The information that EIGRP receives in its updates go into these three tables.

Using the EIGRP commands

The configuration of EIGRP is just about as easy as the configuration of RIP. One difference is the concept of an Autonomous System (AS), which defines a group of routers to which the EIGRP router belongs to. The AS number is exchanged as part of the routing protocol messages, and any message with a different AS number is ignored by your router. So, it is important that all routers in the same routing group share the same AS number.

Auto-summary

Just as you do when configuring RIP, you specify the connected networks that your routing protocols will be sending to other routers by using the network command. Also, as with RIP, there is an auto-summary option, which you can modify or disable.

Router2>enable

Password:

Router2#configure terminal

Enter configuration commands, one per line.  End with CNTL/Z.

Router2(config)#ip routing

Router2(config)#router eigrp 100

Router2(config-router)#network 192.168.1.0

Router2(config-router)#network 192.168.5.0

Router2(config-router)#no auto-summary

Router2(config-router)#exit

Router2(config)#exit

Auto-summary for EIGRP works similarly to the way it works for RIP. With auto-summary enabled, all routes are summarized as close to the classful boundaries. To change this feature, enter specific interfaces on your router and force summarization to occur at different boundaries — for example, ip summary-address eigrp 100 10.0.0.0 255.255.0.0 for a router configured with networks of 10.0.1.0 and 10.0.100.0.

Reviewing the following routing table, you see the addition of D type routes. The D routers are routes that were learned through EIGRP, whereas EX identifies routes from EIGRP configured for external use.

Router2>enable

Password:

Router2#show ip route

Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP

       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area

       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2

       E1 - OSPF external type 1, E2 - OSPF external type 2

       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2

       ia - IS-IS inter area, * - candidate default, U - per-user static route

       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

D    192.168.10.0/24 [90/284160] via 192.168.1.1, 00:04:19, FastEthernet0/0

C    192.168.5.0/24 is directly connected, FastEthernet0/1

C    192.168.1.0/24 is directly connected, FastEthernet0/0

S    192.168.3.0/24 [1/0] via 192.168.1.1

Split horizon

EIGRP uses a behavior called split horizon (discussed in Chapter 6 of this minibook) to control routing updates. By default, this behavior is enabled on all interfaces on the router. You can disable split horizon on any or all interfaces.

remember.eps Split horizon prevents route advertisements from going back out through the interface on which the route was originally learned.

Router2>enable

Password:

Router2#configure terminal

Enter configuration commands, one per line.  End with CNTL/Z.

Router2(config)#interface fastethernet0/0

Router2(config-if)#no ip split-horizon eigrp 100

Router2(config-if)#exit

Router2(config)#exit

Load balancing

EIGRP supports load balancing, which is sending data over multiple paths when they are available. There are two basic methods of load balancing with EIGRP, either based on equal costs or unequal costs. By default EIGRP will use equal cost load balancing. So if there are two or more paths to the same destination, they will be load balanced only if their total link costs are equal. Figure 7-2 shows a network with three paths and with total costs of 20, 25, and 45. In this case, the link with the cost of 20 is always used. If you want EIGRP to load balance over two links, the two links would require an equal cost. When the network does not naturally evaluate to equal costs, you can force it with the variance command, thereby making it unequal cost routing. In the sample network shown in Figure 7-2, the path through Router3 has a cost of 25, by using the variance command, you can make it equal to the path through Router4, as shown here:

Figure 7-2: An unequal cost network.

9780470945582-fg040702.eps

Router2>enable

Password:

Router2#configure terminal

Enter configuration commands, one per line.  End with CNTL/Z.

Router2(config)#ip routing

Router2(config)#router eigrp 100

Router2(config-router)#variance 2

Router2(config-router)#exit

Router2(config)#exit

The variance of 2 in the preceding output instructs EIGRP to take the least-cost route and multiply it by the variance. In this case, if you take the least-cost route of 20 and multiply it by 2, you end up with 40; so all routes with a cost less than 40 are considered to be equal. To route over all three links, use a variance of 3, making all routes less than 60 equivalent.

Some other methods for dealing with equal or unequal path routing involve changing the default system metric values. EIRGP uses the following calculation to generate a final metric, with lowest metrics being preferred:

metric = [K1*bandwidth + (K2*bandwidth)/(256 - load) + K3*delay] *

[K5/(reliability + K4)]

The default values for these settings are K1=1, K2=0, K3=1, K4=0, and K5=0, which means that the normal net metric is based on the bandwidth and delay of the links. If you use the same physical network infrastructure throughout your network, the metric is therefore based solely on the number of hops.

Router2>enable

Password:

Router2#configure terminal

Enter configuration commands, one per line.  End with CNTL/Z.

Router2(config)#ip routing

Router2(config)#router eigrp 100

Router2(config-router)#metric weights tos k1 k2 k3 k4 k5

Router2(config-router)#exit

Router2(config)#exit

warning_bomb.eps Although these values can be changed, they can have a large negative impact on your network performance if they are set incorrectly. Rather than changing these values, you can modify the bandwidth and delay values on a link-by-link basis. To change both these values, use the following command:

Router2#configure terminal

Enter configuration commands, one per line.  End with CNTL/Z.

Router2(config)#interface FastEthernet 0/0

Router2(config-if)#bandwidth 1000

Router2(config-if)#delay 120

!--- Delay is entered in tens of microseconds.

Router2(config-if)#exit

Router2(config)#exit

Clearing your IP route

remember.eps If you make frequent changes to routing protocol properties, be aware that you either have to wait for changes to propagate or wait for the relevant hold down timers to expire. You can override these delays by entering Privileged EXEC mode and using the clear ip route command.

Troubleshooting EIGRP

The basic command for checking the status of EIGRP and other routing protocols is show ip protocols. The following output shows the output related to EIGRP. However, first here are some key things to look for:

No filters on interfaces, either incoming or outgoing

Metric settings (automatically at the default settings)

Maximum configured hop count

AS number

Summarization settings

Networks this router is distributing

Neighbors seen

Administrative distance

Router2>enable

Password:

Router2#show ip protocols

Routing Protocol is “eigrp 100”

  Outgoing update filter list for all interfaces is not set

  Incoming update filter list for all interfaces is not set

  Default networks flagged in outgoing updates

  Default networks accepted from incoming updates

  EIGRP metric weight K1=1, K2=0, K3=1, K4=0, K5=0

  EIGRP maximum hopcount 100

  EIGRP maximum metric variance 1

  Redistributing: eigrp 100

  EIGRP NSF-aware route hold timer is 240s

  Automatic network summarization is not in effect

  Maximum path: 4

  Routing for Networks:

    192.168.1.0

    192.168.5.0

  Routing Information Sources:

    Gateway         Distance      Last Update

    192.168.1.1           90      00:03:43

  Distance: internal 90 external 170

In addition to the basics found in show ip protocols, a suite of commands is available through the show ip eigrp command. The following information shows the categories of information you can find by using the show ip eigrp command:

Router2>enable

Password:

Router2#show ip eigrp ?

  <1-65535>   Autonomous System

  interfaces  IP-EIGRP interfaces

  neighbors   IP-EIGRP neighbors

  topology    IP-EIGRP Topology Table

  traffic     IP-EIGRP Traffic Statistics

  vrf         Select a VPN Routing/Forwarding instance

The interfaces option

The interfaces option identifies which interfaces receive EIGRP messages, and how many possible unreliable and reliable routes exist.

Router2>enable

Password:

Router2#show ip eigrp interfaces

IP-EIGRP interfaces for process 100

                        Xmit Queue   Mean   Pacing Time   Multicast    Pending

Interface        Peers  Un/Reliable  SRTT   Un/Reliable   Flow Timer   Routes

Fa0/0              1        0/0         4       0/10          50           0

Fa0/1              0        0/0         0       0/10           0           0

The neighbors option

The EIGRP neighbors option gives you information about systems from which your router is receiving EIGRP packets and when that information is allowed to be modified.

Router2>enable

Password:

Router2#show ip eigrp neighbors detail

IP-EIGRP neighbors for process 100

H   Address                 Interface       Hold Uptime   SRTT   RTO  Q  Seq

                                            (sec)         (ms)       Cnt Num

0   192.168.1.1             Fa0/0             11 00:02:02    4   200  0  10

   Version 12.0/1.0, Retrans: 1, Retries: 0

The topology option

The topology option displays information that goes into the topology table. In this case, you can see that the output includes a list of potential routes which can be used for the networks and on which interface the routes were learned. Notice that the listing includes successors, while if they were available, you would also see the feasible successors.

Router2>enable

Password:

Router2#show ip eigrp topology all

IP-EIGRP Topology Table for AS(100)/ID(192.168.5.1)

Codes: P - Passive, A - Active, U - Update, Q - Query, R - Reply,

       r - reply Status, s - sia Status

P 192.168.10.0/24, 1 successors, FD is 284160, serno 7

        via 192.168.1.1 (284160/281600), FastEthernet0/0

P 192.168.1.0/24, 1 successors, FD is 28160, serno 6

        via Connected, FastEthernet0/0

P 192.168.5.0/24, 1 successors, FD is 28160, serno 8

        via Connected, FastEthernet0/1

The traffic option

A traffic display provides the statistics on the EIGRP traffic that your router is seeing, the packets it has received, and the number to which it has responded. Notice that these statistics are for a specific AS identifier.

Router2>enable

Password:

Router2#show ip eigrp traffic

IP-EIGRP Traffic Statistics for AS 100

  Hellos sent/received: 272/109

  Updates sent/received: 13/13

  Queries sent/received: 0/0

  Replies sent/received: 0/0

  Acks sent/received: 5/7

  Input queue high water mark 1, 0 drops

  SIA-Queries sent/received: 0/0

  SIA-Replies sent/received: 0/0

  Hello Process ID: 167

  PDM Process ID: 166

The debug command

Finally, you come to the debug command. Be aware that enabling any debug command puts a load on your router. Notice that the following output gives you information on the neighbors, such as new adjacency (learning of a new adjacent or neighbor router), changes in link availability, and routing information.

Router2>enable

Password:

Router2#debug ip eigrp

IP-EIGRP Route Events debugging is on

*Mar 18 00:38:35.281: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 100: Neighbor 192.168.1.1 (FastEthernet0/0) is up: new adjacency

*Mar 18 00:38:49.569: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 100: Neighbor 192.168.1.1 (FastEthernet0/0) is down: peer restarted

*Mar 18 00:38:54.321: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 100: Neighbor 192.168.1.1 (FastEthernet0/0) is up: new adjacency

*Mar 18 00:38:58.913: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 100: Neighbor 192.168.1.1 (FastEthernet0/0) is down: peer restarted

*Mar 18 00:39:03.397: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 100: Neighbor 192.168.1.1 (FastEthernet0/0) is up: new adjacency

*Mar 18 00:45:05.109: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 100: Neighbor 192.168.1.1 (FastEthernet0/0) is up: new adjacency

*Mar 18 00:45:05.117: IP-EIGRP(Default-IP-Routing-Table:100): 192.168.1.0/24 - do advertise out FastEthernet0/0

*Mar 18 00:45:05.697: IP-EIGRP(Default-IP-Routing-Table:100): Processing incoming UPDATE packet

*Mar 18 00:45:05.697: IP-EIGRP(Default-IP-Routing-Table:100): Int 192.168.10.0/24 M 284160 - 256000 28160 SM 281600 - 256000 25600

*Mar 18 00:45:05.713: %LINK-3-UPDOWN: Interface FastEthernet0/1, changed state to up

*Mar 18 00:45:05.717: IP-EIGRP(Default-IP-Routing-Table:100): Int 192.168.10.0/24 metric 284160 - 256000 28160

*Mar 18 00:45:06.713: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/1, changed state to up

*Mar 18 00:45:07.117: IP-EIGRP(Default-IP-Routing-Table:100): 192.168.1.0/24 - do advertise out FastEthernet0/0

*Mar 18 00:45:07.129: IP-EIGRP(Default-IP-Routing-Table:100): Int 192.168.10.0/24 metric 284160 - 256000 28160

*Mar 18 00:45:07.141: IP-EIGRP(Default-IP-Routing-Table:100): 192.168.5.0/24 - do advertise out FastEthernet0/0

*Mar 18 00:45:07.141: IP-EIGRP(Default-IP-Routing-Table:100): Int 192.168.5.0/24 metric 28160 - 25600 2560

*Mar 18 00:45:07.161: IP-EIGRP(Default-IP-Routing-Table:100): Processing incoming UPDATE packet

*Mar 18 00:45:07.161: IP-EIGRP(Default-IP-Routing-Table:100): Int 192.168.5.0/24 M 4294967295 - 256000 4294967295 SM 4294967295 - 256000 4294967295

Router2#no debug ip eigrp

tip.eps If you have too many debug options enabled and the screen is overflowing with data, you can get the situation under control again by disabling all the options. Do this by typing u all to disable all possible debugging.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset