Networking and Linux are terms that are almost synonymous. In a very real sense Linux is a product of the Internet or World Wide Web (WWW). Its developers and users use the web to exchange information ideas, code, and Linux itself is often used to support the networking needs of organizations. This chapter describes how Linux supports the network protocols known collectively as TCP/IP.
ARPANET and the first released networking version of Unix TM was 4.3 BSD. Linux's networking implementation is modeled on 4.3 BSD in that it supports BSD sockets (with some extensions) and the full range of TCP/IP networking. This programming interface was chosen because of its popularity and to help applications be portable between Linux and other Unix TM platforms.
This section gives an overview of the main principles of TCP/IP networking. It is not meant to be an exhaustive description, for that I suggest that you read . In an IP network every machine is assigned an IP address, this is a 32 bit number that uniquely identifies the machine. The WWW is a very large, and growing, IP network and every machine that is connected to it has to have a unique IP address assigned to it. IP addresses are represented by four numbers separated by dots, for example, 16.42.0.9. This IP address is actually in two parts, the network address and the host address. The sizes of these parts may vary (there are several classes of IP addresses) but using 16.42.0.9 as an example, the network address would be 16.42 and the host address 0.9. The host address is further subdivided into a subnetwork and a host address. Again, using 16.42.0.9 as an example, the subnetwork address would be 16.42.0 and the host address 16.42.0.9. This subdivision of the IP address allows organizations to subdivide their networks. For example, 16.42 could be the network address of the ACME Computer Company; 16.42.0 would be subnet 0 and 16.42.1 would be subnet 1. These subnets might be in separate buildings, perhaps connected by leased telephone lines or even microwave links. IP addresses are assigned by the network administrator and having IP subnetworks is a good way of distributing the administration of the network. IP subnet administrators are free to allocate IP addresses within their IP subnetworks. Generally though, IP addresses are somewhat hard to remember. Names are much easier. linux.acme.com is much easier to remember than 16.42.0.9 but there must be some mechanism to convert the network names into an IP address. These names can be statically specified in the /etc/hosts file or Linux can ask a Distributed Name Server (DNS server) to resolve the name for it. In this case the local host must know the IP address of one or more DNS servers and these are specified in /etc/resolv.conf.
Whenever you connect to another machine, say when reading a web page, its IP address is used to exchange data with that machine. This data is contained in IP packets each of which have an IP header containing the IP addresses of the source and destination machine's IP addresses, a checksum and other useful information. The checksum is derived from the data in the IP packet and allows the receiver of IP packets to tell if the IP packet was corrupted during transmission, perhaps by a noisy telephone line. The data transmitted by an application may have been broken down into smaller packets which are easier to handle. The size of the IP data packets varies depending on the connection media; ethernet packets are generally bigger than PPP packets. The destination host must reassemble the data packets before giving the data to the receiving application. You can see this fragmentation and reassembly of data graphically if you access a web page containing a lot of graphical images via a moderately slow serial link.
Hosts connected to the same IP subnet can send IP packets directly to each other, all other IP packets will be sent to a special host, a gateway. Gateways (or routers) are connected to more than one IP subnet and they will resend IP packets received on one subnet, but destined for another onwards. For example, if subnets 16.42.1.0 and 16.42.0.0 are connected together by a gateway then any packets sent from subnet 0 to subnet 1 would have to be directed to the gateway so that it could route them. The local host builds up routing tables which allow it to route IP packets to the correct machine. For every IP destination there is an entry in the routing tables which tells Linux which host to send IP packets to in order that they reach their destination. These routing tables are dynamic and change over time as applications use the network and as the network topology changes.
esses can be seen in /etc/services.
This layering of protocols does not stop with TCP, UDP and IP. The IP protocol layer itself uses many different physical media to transport IP packets to other IP hosts. These media may themselves add their own protocol headers. One such example is the ethernet layer, but PPP and SLIP are others. An ethernet network allows many hosts to be simultaneously connected to a single physical cable. Every transmitted ethernet frame can be seen by all connected hosts and so every ethernet device has a unique address. Any ethernet frame transmitted to that address will be received by the addressed host but ignored by all the other hosts connected to the network. These unique addresses are built into each ethernet device when they are manufactured and it is usually kept in an SROM2 on the ethernet card. Ethernet addresses are 6 bytes long, an example would be 08-00-2b-00-49-A4. Some ethernet addresses are reserved for multicast purposes and ethernet frames sent with these destination addresses will be received by all hosts on the network. As ethernet frames can carry many different protocols (as data) they, like IP packets, contain a protocol identifier in their headers. This allows the ethernet layer to correctly receive IP packets and to pass them onto the IP layer.
In order to send an IP packet via a multi-connection protocol such as ethernet, the IP layer must find the ethernet address of the IP host. This is because IP addresses are simply an addressing concept, the ethernet devices themselves have their own physical addresses. IP addresses on the other hand can be assigned and reassigned by network administrators at will but the network hardware responds only to ethernet frames with its own physical address or to special multicast addresses which all machines must receive. Linux uses the Address Resolution Protocol (or ARP) to allow machines to translate IP addresses into real hardware addresses such as ethernet addresses. A host wishing to know the hardware address associated with an IP address sends an ARP request packet containing the IP address that it wishes translating to all nodes on the network by sending it to a multicast address. The target host that owns the IP address, responds with an ARP reply that contains its physical hardware address. ARP is not just restricted to ethernet devices, it can resolve IP addresses for other physical media, for example FDDI. Those network devices that cannot ARP are marked so that Linux does not attempt to ARP. There is also the reverse function, Reverse ARP or RARP, which translates phsyical network addresses into IP addresses. This is used by gateways, which respond to ARP requests on behalf of IP addresses that are in the remote network.
Figure 10.2: Linux Networking Layers Just like the network protocols themselves, Figure 10.2 shows that Linux implements the internet protocol address family as a series of connected layers of software. BSD sockets are supported by a generic socket management software concerned only with BSD sockets. Supporting this is the INET socket layer, this manages the communication end points for the IP based protocols TCP and UDP. UDP (User Datagram Protocol) is a connectionless protocol whereas TCP (Transmission Control Protocol) is a reliable end to end protocol. When UDP packets are transmitted, Linux neither knows nor cares if they arrive safely at their destination. TCP packets are numbered and both ends of the TCP connection make sure that transmitted data is received correctly. The IP layer contains code implementing the Internet Protocol. This code prepends IP headers to transmitted data and understands how to route incoming IP packets to either the TCP or UDP layers. Underneath the IP layer, supporting all of Linux's networking are the network devices, for example PPP and ethernet. Network devices do not always represent physical devices; some like the loopback device are purely software devices. Unlike standard Linux devices that are created via the mknodcommand, network devices appear only if the underlying software has found and initialized them. You will only see /dev/eth0 when you have built a kernel with the appropriate ethernet device driver in it. The ARP protocol sits between the IP layer and the protocols that support ARPing for addresses.
These sockets provide reliable two way sequenced data streams with a guarantee that data cannot be lost, corrupted or duplicated in transit. Stream sockets are supported by the TCP protocol of the Internet (INET) address family.
These sockets also provide two way data transfer but, unlike stream sockets, there is no guarantee that the messages will arrive. Even if they do arrive there is no guarantee that they will arrive in order or even not be duplicated or corrupted. This type of socket is supported by the UDP protocol of the Internet address family.
This allows processes direct (hence raw") access to the underlying protocols. It is, for example, possible to open a raw socket to an ethernet device and see raw IP data traffic.
These are very like datagram sockets but the data is guaranteed to arrive.
These are like stream sockets except that the data packet sizes are fixed.
This is not a standard BSD socket type, it is a Linux specific extension that allows processes to access packets directly at the device level.
he local address of the server. The socket's name or address is specified using the sockaddr data structure. An INET socket would have an IP port address bound to it. The registered port numbers can be seen in /etc/services; for example, the port number for a web server is 80. Having bound an address to the socket, the server then listens for incoming connection requests specifying the bound address. The originator of the request, the client, creates a socket and makes a connection request on it, specifying the target address of the server. For an INET socket the address of the server is its IP address and its port number. These incoming requests must find their way up through the various protocol layers and then wait on the server's listening socket. Once the server has received the incoming request it either accepts or rejects it. If the incoming request is to be accepted, the server must create a new socket to accept it on. Once a socket has been used for listening for incoming connection requests it cannot be used to support a connection. With the connection established both ends are free to send and receive data. Finally, when the connection is no longer needed it can be shutdown. Care is taken to ensure that data packets in transit are correctly dealt with.
The exact meaning of operations on a BSD socket depends on its underlying address family. Setting up TCP/IP connections is very different from setting up an amateur radio X.25 connection. Like the virtual filesystem, Linux abstracts the socket interface with the BSD socket layer being concerned with the BSD socket interface to the application programs which is in turn supported by independent address family specific software. At kernel initialization time, the address families built into the kernel register themselves with the BSD socket interface. Later on, as applications create and use BSD sockets, an association is made between the BSD socket and its supporting address family. This association is made via cross-linking data structures and tables of address family specific support routines. For example there is an address family specific socket creation routine which the BSD socket interface uses when an application creates a new socket.
When the kernel is configured, a number of address families and protocols are built into the protocols vector. Each is represented by its name, for example INET" and the address of its initialization routine. When the socket interface is initialized at boot time each protocol's initialization routine is called. For the socket address families this results in them registering a set of protocol operations. This is a set of routines, each of which performs a a particular operation specific to that address family. The registered protocol operations are kept in the pops vector, a vector of pointers to proto_ops data structures.
The proto_ops data structure consists of the address family type and a set of pointers to socket operation routines specific to a particular address family. The pops vector is indexed by the address family identifier, for example the Internet address family identifier (AF_INET is 2).
The INET socket layer supports the internet address family which contains the TCP/IP protocols. As discussed above, these protocols are layered, one protocol using the services of another. Linux's TCP/IP code and data structures reflect this layering. Its interface with the BSD socket layer is through the set of Internet address family socket operations which it registers with the BSD socket layer during network initialization. These are kept in the pops vector along with the other registered address families. The BSD socket layer calls the INET layer socket support routines from the registered INET proto_opsdata structure to perform work for it. For example a BSD socket create request that gives the address family as INET will use the underlying INET socket create function. The BSD socket layer passes the socket data structure representing the BSD socket to the INET layer in each of these operations. Rather than clutter the BSD socket wiht TCP/IP specific information, the INET socket layer uses its own data structure, the sock which it links to the BSD socketdata structure. This linkage can be seen in Figure 10.3. It links the sock data structure to the BSD socket data structure using the data pointer in the BSD socket. This means that subsequent INET socket calls can easily retrieve the sock data structure. The sock data structure's protocol operations pointer is also set up at creation time and it depends on the protocol requested. If TCP is requested, then the sock data structure's protocol operations pointer will point to the set of TCP protocol operations needed for a TCP connection.
The system call to create a new socket passes identifiers for its address family, socket type and protocol.
Firstly the requested address family is used to search the pops vector for a matching address family. It may be that a particular address family is implemented as a kernel module and, in this case, the kerneld daemon must load the module before we can continue. A new socket data structure is allocated to represent the BSD socket. Actually the socket data structure is physically part of the VFS inode data structure and allocating a socket really means allocating a VFS inode. This may seem strange unless you consider that sockets can be operated on in just the same way that ordinairy files can. As all files are represented by a VFS inode data structure, then in order to support file operations, BSD sockets must also be represented by a VFS inode data structure.
The newly created BSD socket data structure contains a pointer to the address family specific socket routines and this is set to the proto_ops data structure retrieved from the pops vector. Its type is set to the sccket type requested; one of SOCK_STREAM, SOCK_DGRAM and so on. The address family specific creation routine is called using the address kept in the proto_ops data structure.
A free file descriptor is allocated from the current processes fd vector and the file data structure that it points at is initialized. This includes setting the file operations pointer to point to the set of BSD socket file operations supported by the BSD socket interface. Any future operations will be directed to the socket interface and it will in turn pass them to the supporting address family by calling its address family operation routines.
port number. Normally the IP address bound to would be one that has been assigned to a network device that supports the INET address family and whose interface is up and able to be used. You can see which network interfaces are currently active in the system by using the ifconfig command. The IP address may also be the IP broadcast address of either all 1's or all 0's. These are special addresses that mean send to everybody"3. The IP address could also be specified as any IP address if the machine is acting as a transparent proxy or firewall, but only processes with superuser privileges can bind to any IP address. The IP address bound to is saved in the sock data structure in the recv_addr and saddr fields. These are used in hash lookups and as the sending IP address respectively. The port number is optional and if it is not specified the supporting network is asked for a free one. By convention, port numbers less than 1024 cannot be used by processes without superuser privileges. If the underlying network does allocate a port number it always allocates ones greater than 1024.
As packets are being received by the underlying network devices they must be routed to the correct INET and BSD sockets so that they can be processed. For this reason UDP and TCP maintain hash tables which are used to lookup the addresses within incoming IP messages and direct them to the correct socket/sock pair. TCP is a connection oriented protocol and so there is more information involved in processing TCP packets than there is in processing UDP packets.
UDP maintains a hash table of allocated UDP ports, the udp_hashtable. This consists of pointers to sock data structures indexed by a hash function based on the port number. As the UDP hash table is much smaller than the number of permissible port numbers (udp_hash is only 128 or UDP_HTABLE_SIZE entries long) some entries in the table point to a chain of sock data structures linked together using each sock's next pointer.
TCP is much more complex as it maintains several hash tables. However, TCP does not actually add the binding sock data stucture into its hash tables during the bind operation, it merely checks that the port number requested is not currently being used. The sock data structure is added to TCP's hash tables during the listen operation.
REVIEW NOTE: What about the route entered?
Once a socket has been created and, provided it has not been used to listen for inbound connection requests, it can be used to make outbound connection requests. For connectionless protocols like UDP this socket operation does not do a whole lot but for connection orientated protocols like TCP it involves building a virtual circuit between two applications. An outbound connection can only be made on an INET BSD socket that is in the right state; that is to say one that does not already have a connection established and one that is not being used for listening for inbound connections. This means that the BSD socket data structure must be in state SS_UNCONNECTED. The UDP protocol does not establish virtual connections between applications, any messages sent are datagrams, one off messages that may or may not reach their destinations. It does, however, support the connect BSD socket operation. A connection operation on a UDP INET BSD socket simply sets up the addresses of the remote application; its IP address and its IP port number. Additionally it sets up a cache of the routing table entry so that UDP packets sent on this BSD socket do not need to check the routing database again (unless this route becomes invalid). The cached routing information is pointed at from the ip_route_cache pointer in the INET sock data structure. If no addressing information is given, this cached routing and IP addressing information will be automatically be used for messages sent using this BSD socket. UDP moves the sock's state to TCP_ESTABLISHED.
For a connect operation on a TCP BSD socket, TCP must build a TCP message containing the connection information and send it to IP destination given. The TCP message contains information about the connection, a unique starting message sequence number, the maximum sized message that can be managed by the initiating host, the transmit and receive window size and so on. Within TCP all messages are numbered and the initial sequence number is used as the first message number. Linux chooses a reasonably random value to avoid malicious protocol attacks. Every message transmitted by one end of the TCP connection and successfully received by the other is acknowledged to say that it arrived successfully and uncorrupted. Unacknowledges messages will be retransmitted. The transmit and receive window size is the number of outstanding messages that there can be without an acknowledgement being sent. The maximum message size is based on the network device that is being used at the initiating end of the request. If the receiving end's network device supports smaller maximum message sizes then the connection will use the minimum of the two. The application making the outbound TCP connection request must now wait for a response from the target application to accept or reject the connection request. As the TCP sock is now expecting incoming messages, it is added to the tcp_listening_hashso that incoming TCP messages can be directed to this sock data structure. TCP also starts timers so that the outbound connection request can be timed out if the target application does not respond to the request.
Once a socket has had an address bound to it, it may listen for incoming connection requests specifying the bound addresses. A network application can listen on a socket without first binding an address to it; in this case the INET socket layer finds an unused port number (for this protocol) and automatically binds it to the socket. The listen socket function moves the socket into state TCP_LISTEN and does any network specific work needed to allow incoming connections. For UDP sockets, changing the socket's state is enough but TCP now adds the socket's sock data structure into two hash tables as it is now active. These are the tcp_bound_hash table and the tcp_listening_hash. Both are indexed via a hash function based on the IP port number.
Whenever an incoming TCP connection request is received for an active listening socket, TCP builds a new sock data structure to represent it. This sock data structure will become the bottom half of the TCP connection when it is eventually accepted. It also clones the incoming sk_buff containing the connection request and queues it onto the receive_queue for the listening sock data structure. The clone sk_buff contains a pointer to the newly created sock data structure.
otocol, say UDP, does not support connections. Otherwise the accept operation is passed through to the real protocol, in this case TCP. The accept operation can be either blocking or non-blocking. In the non-blocking case if there are no incoming connections to accept, the accept operation will fail and the newly created socket data structure will be thrown away. In the blocking case the network application performing the accept operation will be added to a wait queue and then suspended until a TCP connection request is received. Once a connection request has been received the sk_buff containing the request is discarded and the sock data structure is returned to the INET socket layer where it is linked to the new socket data structure created earlier. The file descriptor (fd) number of the new socket is returned to the network application, and the application can then use that file descriptor in socket operations on the newly created INET BSD socket.
One of the problems of having many layers of network protocols, each one using the services of another, is that each protocol needs to add protocol headers and tails to data as it is transmitted and to remove them as it processes received data. This make passing data buffers between the protocols difficult as each layer needs to find where its particular protocol headers and tails are. One solution is to copy buffers at each layer but that would be inefficient. Instead, Linux uses socket buffers or sk_buffs to pass data between the protocol layers and the network device drivers. sk_buffs contain pointer and length fields that allow each protocol layer to manipulate the application data via standard functions or methods".
points at the end of the data area in memory. This is fixed when the sk_buff is allocated.
This moves the tail pointer towards the start of the data area and decrements the len field. This is used when removing data or protocol tails from the received packet.
The sk_buff data structure also contains pointers that are used as it is stored in doubly linked circular lists of sk_buff's during processing. There are generic sk_buff routines for adding sk_buffs to the front and back of these lists and for removing them.
Chapter dd-chapter described how Linux's network drivers built are into the kernel and initialized. This results in a series of device data structures linked together in the dev_baselist. Each device data structure describes its device and provides a set of callback routines that the network protocol layers call when they need the network driver to perform work. These functions are mostly concerned with transmitting data and with the network device's addresses. When a network device receives packets from its network it must convert the received data into sk_buff data structures. These received sk_buff's are added onto the backlog queue by the network drivers as they are received. If the backlog queue grows too large, then the received sk_buff's are discarded. The network bottom half is flagged as ready to run as there is work to do.
When the network bottom half handler is run by the scheduler it processes any network packets waiting to be transmitted before processing the backlog queue of sk_buff's determining which protocol layer to pass the received packets to.
As the Linux networking layers were initialized, each protocol registered itself by adding a packet_type data structure onto either the ptype_all list or into the ptype_base hash table. The packet_type data structure contains the protocol type, a pointer to a network device, a pointer to the protocol's receive data processing routine and, finally, a pointer to the next packet_type data structure in the list or hash chain. The ptype_all chain is used to snoop all packets being received from any network device and is not normally used. The ptype_base hash table is hashed by protocol identifier and is used to decide which protocol should receive the incoming network packet. The network bottom half matches the protocol types of incoming sk_buff's against one or more of the packet_type entries in either table. The protocol may match more than one entry, for example when snooping all network traffic, and in this case the sk_buff will be cloned. The sk_buff is passed to the matching protocol's handling routine.
for the packet. For computers connected by modem to a single network, say via the PPP protocol, the routing choice is easy. The packet should either be sent to the local host via the loopback device or to the gateway at the end of the PPP modem connection. For computers connected to an ethernet the choices are harder as there are many computers connected to the network.
data structure describing the route to use. This includes the source IP address to use, the address of the network device data structure and, sometimes, a prebuilt hardware header. This hardware header is network device specific and contains the source and destination physical addresses and other media specific information. If the network device is an ethernet device, the hardware header would be as shown in Figure 10.1 and the source and destination addresses would be physical ethernet addresses. The hardware header is cached with the route because it must be appended to each IP packet transmitted on this route and constructing it takes time. The hardware header may contain physical addresses that have to be resolved using the ARP protocol. In this case the outgoing packet is stalled until the address has been resolved. Once it has been resolved and the hardware header built, the hardware header is cached so that future IP packets sent using this interface do not have to ARP.
Every network device has a maximum packet size and it cannot transmit or receive a data packet bigger than this. The IP protocol allows for this and will fragment data into smaller units to fit into the packet size that the network device can handle. The IP protocol header includes a fragment field which contains a flag and the fragment offset.
IP finds the network device to send the IP packet out on. This device is found from the IP routing tables. Each device has a field describing its maximum transfer unit (in bytes), this is the mtu field. If the device's mtu is smaller than the packet size of the IP packet that is waiting to be transmitted, then the IP packet must be broken down into smaller (mtu sized) fragments. Each fragment is represented by an sk_buff; its IP header marked to show that it is a fragment and what offset into the data this IP packet contains. The last packet is marked as being the last IP fragment. If, during the fragmentation, IP cannot allocate an sk_buff, the transmit will fail.
Receiving IP fragments is a little more difficult than sending them because the IP fragments can be received in any order and they must all be received before they can be reassembled. Each time an IP packet is received it is checked to see if it is an IP fragment. The first time that the fragment of a message is received, IP creates a new ipq data structure, and this is linked into the ipqueue list of IP fragments awaiting recombination. As more IP fragments are received, the correct ipq data structure is found and a new ipfragdata structure is created to describe this fragment. Each ipq data structure uniquely describes a fragmented IP receive frame with its source and destination IP addresses, the upper layer protocol identifier and the identifier for this IP frame. When all of the fragments have been received, they are combined into a single sk_buff and passed up to the next protocol level to be processed. Each ipq contains a timer that is restarted each time a valid fragment is received. If this timer expires, the ipq data structure and its ipfrag's are dismantled and the message is presumed to have been lost in transit. It is then up to the higher level protocols to retransmit the message.
which in turn uses the ARP services to translate the destination IP address into a physical address.
The ARP protocol itself is very simple and consists of two message types, an ARP request and an ARP reply. The ARP request contains the IP address that needs translating and the reply (hopefully) contains the translated IP address, the hardware address. The ARP request is broadcast to all hosts connected to the network, so, for an ethernet network, all of the machines connected to the ethernet will see the ARP request. The machine that owns the IP address in the request will respond to the ARP request with an ARP reply containing its own physical address.
The ARP table consists of a table of pointers (the arp_tables vector) to chains of arp_table entries. The entries are cached to speed up access to them, each entry is found by taking the last two bytes of its IP address to generate an index into the table and then following the chain of entries until the correct one is found. Linux also caches prebuilt hardware headers off the arp_table entries in the form of hh_cache data structures.
be notified and it is up to the protocol layer that is transmitting them to cope with this failure. UDP does not care about lost packets but TCP will attempt to retransmit on an established TCP link. If the owner of the IP address responds with its hardware address, the arp_table entry is marked as complete and any queued sk_buff's will be removed from the queue and will go on to be transmitted. The hardware address is written into the hardware header of each sk_buff.
The ARP protocol layer must also respond to ARP requests that specfy its IP address. It registers its protocol type (ETH_P_ARP), generating a packet_type data structure. This means that it will be passed all ARP packets that are received by the network devices. As well as ARP replies, this includes ARP requests. It generates an ARP reply using the hardware address kept in the receiving device's devicedata structure.
Network topologies can change over time and IP addresses can be reassigned to different hardware addresses. For example, some dial up services assign an IP address as each connection is established. In order that the ARP table contains up to date entries, ARP runs a periodic timer which looks through all of the arp_table entries to see which have timed out. It is very careful not to remove entries that contain one or more cached hardware headers. Removing these entries is dangerous as other data structures rely on them. Some arp_table entries are permanent and these are marked so that they will not be deallocated. The ARP table cannot be allowed to grow too large; each arp_table entry consumes some kernel memory. Whenever the a new entry needs to be allocated and the ARP table has reached its maximum size the table is pruned by searching out the oldest entries and removing them.
The IP routing function determines where to send IP packets destined for a particular IP address. There are many choices to be made when transmitting IP packets. Can the destination be reached at all? If it can be reached, which network device should be used to transmit it? If there is more than one network device that could be used to reach the destination, which is the better one? The IP routing database maintains information that gives answers to these questions. There are two databases, the most important being the Forwarding Information Database. This is an exhaustive list of known IP destinations and their best routes. A smaller and much faster database, the route cache is used for quick lookups of routes for IP destinations. Like all caches, it must contain only the frequently accessed routes; its contents are derived from the Forwarding Information Database.
Routes are added and deleted via IOCTL requests to the BSD socket interface. These are passed onto the protocol to process. The INET protocol layer only allows processes with superuser privileges to add and delete IP routes. These routes can be fixed or they can be dynamic and change over time. Most systems use fixed routes unless they themselves are routers. Routers run routing protocols which constantly check on the availability of routes to all known IP destinations. Systems that are not routers are known as end systems. The routing protocols are implemented as daemons, for example GATED, and they also add and delete routes via the IOCTL BSD socket interface.
Whenever an IP route is looked up, the route cache is first checked for a matching route. If there is no matching route in the route cache the Forwarding Information Database is searched for a route. If no route can be found there, the IP packet will fail to be sent and the application notified. If a route is in the Forwarding Information Database and not in the route cache, then a new entry is generated and added into the route cache for this route. The route cache is a table (ip_rt_hash_table) that contains pointers to chains of rtable data structures. The index into the route table is a hash function based on the least significant two bytes of the IP address. These are the two bytes most likely to be different between destinations and provide the best spread of hash values. Each rtable entry contains information about the route; the destination IP address, the network device to use to reach that IP address, the maximum size of message that can be used and so on. It also has a reference count, a usage count and a timestamp of the last time that they were used (in jiffies). The reference count is incremented each time the route is used to show the number of network connections using this route. It is decremented as applications stop using the route. The usage count is incremented each time the route is looked up and is used to order the rtable entry in its chain of hash entries. The last used timestamp for all of the entries in the route cache is periodically checked to see if the rtable is too old . If the route has not been recently used, it is discarded from the route cache. If routes are kept in the route cache they are ordered so that the most used entries are at the front of the hash chains. This means that finding them will be quicker when routes are looked up.
Figure 10.5: The Forwarding Information Database The forwarding information database (shown in Figure 10.5 contains IP's view of the routes available to this system at this time. It is quite a complicated data structure and, although it is reasonably efficiently arranged, it is not a quick database to consult. In particular it would be very slow to look up destinations in this database for every IP packet transmitted. This is the reason that the route cache exists: to speed up IP packet transmission using known good routes. The route cache is derived from the forwarding database and represents its commonly used entries.
Each IP subnet is represented by a fib_zone data structure. All of these are pointed at from the fib_zones hash table. The hash index is derived from the IP subnet mask. All routes to the same subnet are described by pairs of fib_node and fib_info data structures queued onto the fz_list of each fib_zone data structure. If the number of routes in this subnet grows large, a hash table is generated to make finding the fib_nodedata structures easier.
Several routes may exist to the same IP subnet and these routes can go through one of several gateways. The IP routing layer does not allow more than one route to a subnet using the same gateway. In other words, if there are several routes to a subnet, then each route is guaranteed to use a different gateway. Associated with each route is its metric. This is a measure of how advantagious this route is. A route's metric is, essentially, the number of IP subnets that it must hop across before it reaches the destination subnet. The higher the metric, the worse the route.


text:
krementz, joseph, 1840-1928 (photographer) (18)
terhune, albert wheaton (photographer) (9)
heimberger, c. (photographer) (4)
floyd county (ind.) (101)
new albany (ind.) (91)
ohio river (14)
floyds knobs (ind.) (5)
glenwood amusement park (new albany, ind.) (5)
clark county (ind.) (2)
georgetown (ind.) (2)
bank street (new albany, ind.) (1)
cityscapes (11)
stores & shops (11)
signs (notices) (8)
stereographs (22)
safety film negatives (8)
Coverage: Floyd County (Ind.)
Glenwood Park. Louisville, Ky., Aug.3, 1907.
Amusement parks; Chautauquas; Tents; Crowds
A Chautauqua assembly tent at Glenwood Amusement Park located along the banks of Silver Creek near Spring Street in New Albany, Ind. A crowd of people sit beneath the large white tent.
Street in New Albany, Indiana, 1936.
Cobblestone streets; Signs (Notices); Taxicabs
A cobblestone street is in the foreground and a sign for K & I Taxi service hangs outside a storefront on the corner.
Cobblestone streets; Signs (Notices); Men; Women; Restaurants; Taxicabs
A group of white men are sitting and standing around next to the White Line Cab Company at the intersection of two cobblestone streets with street car tracks. A group of white men and women are standing and sitting around the Independent Cab...
Gulf Refining Co. service station, New Albany, Indiana, 1928.
Gasoline pumps; Automobile service stations; Churches; Steeples
A Gulf service station in New Albany, Indiana is built at the intersection of a dirt road and a cobblestone street at the corner of Third and Market Streets. A church steeple rises from behind the buildings along Third Street.
Gasoline pumps; Automobile service stations; Dirt roads
A Gulf service station in New Albany, Indiana is built at the intersection of a dirt road and a cobblestone street at the corner of Third and Market Streets. The OK Supply House is on the south side of Market across the street next to a used car...
Gasoline pumps; Automobile service stations
A Gulf service station in New Albany, Indiana is built at the intersection of a dirt road and a cobblestone street at the corner of Third and Market Streets.
A Gulf service station in New Albany, Indiana is built near railroad tracks and a cobblestone street at 15th and Spring Streets.
Gasoline pumps; Automobile service stations; Dirt roads; Railroad tracks
"America's Crusade" pageant at Glenwood Park, New Albany, Indiana, 1919.
Pageants; Parks; Military parades & ceremonies; Military uniforms; Costumes; Tableaux
A large group of white women, men, and children dressed in costumes representing military themes stand in front of a columned backdrop at night. Military garb through the ages appears, including Roman armor, Red Cross nurses, Joan of Arc on a mule,...
Man overlooking fields and Ohio River.
Meadows; Rivers; Men
A man wearing suspenders and a hat stands at the top of a hill looking down on fields with a few clusters of buildings and a portion of the Ohio River visible in the distance. Title supplied by cataloger.
Market Street west from Pearl Street, New Albany, Indiana, 1922.
Streets; City & town life; Automobiles; Stores & shops; Horses; Carriages & coaches; Buildings; Transportation
A median separates two brick streets in a business district of New Albany, Indiana. At the end of the median is a long low building with a rounded roof where a number of horse-and-carriage rigs are parked. More carriages and cars are parked along...
Beechwood Avenue, New Albany, Indiana, 1928.
A view looking northwest from the east rail of tracks in New Albany, Indiana.
Railroad tracks; Automobiles; Houses
A view looking west, 22 feet from the east rail of railroad tracks in New Albany, Indiana. A car is parked in front of a two-story clapboard house.
Courier Journal & Times Co retail adv. Dept. Int. photo of kitchen at Mrs. Paul Niemacer made at New Albany Ind.
Kitchens; Women
A woman stands at a counter chopping vegetables in her kitchen in New Albany.
Grand Theatre, New Albany, Indiana, 1929.
Motion picture theaters; Theaters; Buildings; Architecture; Marquees
Address: 138 E Market. Two-story, pale brick structure with ornate facade housing the Grand Theatre. Ticket office located between two sets of double doors. Above, a marquee sign reads �The Little Wildcat with Audrey Ferris� and movie posters...
Residence of J.W. Jenner Co., New Albany, Indiana, 1924.
Houses; Dwellings; Snow
Address: 2312 Spring Street, New Albany, Indiana. Snow covers the ground in front of the residence of J.W. Jenner Company. The house is flanked by an attached garage.
Vincennes and Main Street intersection, New Albany, Indiana, 1935.
Railroad tracks; Streets; Signs (Notices); Houses
An arrow-shaped sign that says BRIDGE points down Vincennes Road. A bungalow-style house is on the corner. A sign attached to an elevated switch station on one side and a utility pole on the other side hanging over the street says BRIDGE TO...
C.P. Tighe residence, New Albany, Indiana, 1930.
Buildings; Dwellings; Houses; Architecture; Trees; Lawns
An exterior view of a Tudor Revival style two story house, identified as the C.P. Tighe residence in New Albany, Indiana. A portico supported by columns with half timbering is over an arched central doorway. Two trees in the front lawn are directly...
Lobby and bank teller counters inside bank, New Albany, Indiana, 1930.
Interiors; Banks; Banking; Financial facilities; Cages; Lobbies; Longcase clocks
An interior view of a lobby and bank teller counters inside a bank located in New Albany, Indiana. Men are seated behind the counter inside bank teller cages. Two tables are in the center of the lobby. A grandfather clock is against a column in...

redpajama_set_name: RedPajamaCommonCrawl


Diode Dynamics Best Coupon, Great Savings. Looking for diodedynamics coupons, promo code and discount codes? Click here because we provide timely price and verification on the latest diode dynamics best coupon to our customers.
:5% Off, today only.5% Off, today only.Save diodedynamics.com coupon code. Save coupon. DISCOUNT Reveal Coupon Code itsfriday .
Savings with Diode Dynamics 5% Off coupon codes June 2018 at diodedynamics.com.
Diode Dynamics Promo Codes for June, 2018. Save with 5 active Diode Dynamics promo codes, coupons, and free shipping deals. 🔥 Today's Top Deal: (@Amazon) Up to 25% off & Free Shipping on Select Diode Dynamics Products.
June, 2018 - 28 best Diode Dynamics coupons and promo codes. Today's top Diode Dynamics coupon: $25 Off Equalizer Sticker @ Diode Dynamics Coupon.
Coupon Code. Sale/Shopping tips. Submit This Coupon. All Coupons (72) Get 25% Off Diode Dynamics T-Shirt. Get Deal. GREAT DEAL. CODE. Get 5% Off. More.
Get 10 s and promo codes at CouponBirds. Click to enjoy the latest deals and coupons of Diode Dynamics and save up to 20% when making purchase at checkout.
Check Our latest s and deals including: Check out the steep promo code at Diode Dynamics! Assured to make your heart beat with these deals.
How to use diode dynamics promo code? Copy the above promo code, find input coupon code on the payment page of diode dynamics, click apply and observe the change in the payment amount.


text:
Q: Python script runs on boot then reboots at end - How to regain control? I have made a dreadful error and am looking for your help!
I have set up my raspberry pi to run a python script at start up by editing the rc.local file. This would be fine except I have written my script to reboot the raspberry pi when it exits. Now I am stuck in an infinite loop and I can't edit anything. Every time my script ends it reboots the pi and starts again!
My program uses Pygame as a GUI and I have a Raspberry Pi 3 running the NOOBS OS that came with it. If you need anymore info please ask.
Any help stopping my script so I can access the pi without losing any data will be greatly appreciated.
Edit - What an amazing community. Thank you everyone for sharing your knowledge and time. I was in a bit of a panic and you all came to my assistance really quick. If you are reading this because you are in a similar predicament I found Ben's answer was the quickest and easiest solution, but if that doesn't work for you I think FrostedCookies' idea would be the next thing to try.

A: Probably the easiest way is to take out the SD card from your Pi, mount the SD filesystem onto another computer running linux and edit your rc.local script from there to remove the infinite boot loop. You can also backup your data that way incase something goes wrong.

A: I'm not sure if this will work (I don't have a Pi right now), but if you can't access a terminal normally while the script is running, try the keyboard shortcut Ctrl+Alt+F1 to open one, then type sudo pkill python to kill the script (this will also kill any other python processes on your machine). Then use a terminal text editor (vi or nano perhaps) to edit your rc.local file so this doesn't happen again.

A: It's a Raspberry Pi solution rather than a Python/unix one, but you could plug the SD card into another computer, mount it, and modify the script to stop the reboot cycle.
More information about editing the files from your Pi's SD card on another computer here: https://raspberrypi.stackexchange.com/questions/9515/how-to-access-the-rpi-root-ext4-file-system-by-inserting-sd-card-into-a-differen

A: I'd firstly turn it off and on again..
If it wont help

*

*ps aux | grep -i python

*killall python - youll probably need to tweak the killall command with the python script name instead or in addition to "python"

redpajama_set_name: RedPajamaStackExchange


In 2008, long before the animated sloths worked the DMV counter in the hit movie "Zootopia," Neville Boston, CEO of Reviver Auto, wanted to find a way to simplify the vehicle registration process. He knew the process would only become better if drivers could avoid those sloths altogether and update their registration automatically and electronically.
"People often wonder how I worked around the DMV," Boston says. "I didn't. I worked with the DMV. They became like partners. But the process is the process." Which is probably why it still took Boston years to make his idea a reality, a digital license plate called RPlate Pro.
The Reviver Auto RPlate Pro digital license plate, which is available in California, uses e-ink technology — just like Kindle e-readers — to display license plate numbers and registration dates in black and white. To update registrations, drivers simply use the RConnect platform to renew and pay the DMV online. Instead of waiting for stickers to be sent or, worse, visiting the DMV, RConnect automatically changes the dates on the digital license plate.
Installing the plate is pretty easy, too. It connects to a car's battery, but "it takes no power to show an image," Boston says, "so the plate will always operate as a license plate." Unless, that is, someone takes the plate off the car. In that case, it blanks out and sends a text message to the owner. Then the license plate digits are replaced with word STOLEN and makes its location known via the RConnect online platform. This is one smart plate!
The RPlate Pro can display other messages, too. Owners can choose to have a different specialty plate every day to support causes like breast cancer awareness or college football teams. "You can have an unlimited amount of specialty plates on one plate," Boston says, noting that the states using his digital plates still receive revenue for specialty plates. The digital plates will also be able to display emergency messages such as Amber Alerts or severe weather warnings, similar to the messages broadcast on digital highway signs.
Drivers could even put ads on their tags. For instance, if you own a business with a fleet of delivery trucks, you might consider displaying an ad on your companies' plates. "When [business] vehicles are legally parked," Boston really emphasizes the legally here, "there is a messaging component."
There are a lot of other advantages for fleet owners who use digital plates on their vehicles, Boston says. For one, the registration for any truck in the fleet can be renewed remotely, even if the truck is on a job miles away. The license plates can also tell the owner where every truck is located at any time. Owners can even pay bridge tolls via the plates, and Reviver Auto is working on an update so the plates will interface with parking meters.
So what happens if you get rear-ended and your plate gets damaged? "First and foremost, [the plate] has to compliant," Boston says. That means no matter what, the license plate must be readable. He says the e-ink screen works the same way the safety glass in a car's windshield does. If a rock hits your windshield, it cracks and spiders, but it doesn't break. The same goes for the RPlate Pro.
Besides the physical vulnerability of the plate, there's also the digital security and privacy question. "We are extremely pro privacy," Boston says. "We talked to the ACLU and the Electronic Frontier Foundation, and we're transparent about all information that we're allowing to be enabled." For instance, drivers can choose to have GPS embedded on their license plates — or not. Turning it off means features like the stolen license plate location won't work, but it's an entirely optional setting in the privacy priorities.
As for security, Boston says they are using the same security protocols in online banking.
The RPlate Pro is on sale in California, and is also approved for use in Arizona, Texas and Florida (so far). But it's not cheap. It will cost drivers $599 just for the license plate and another $8 per month for the service plan. Like so many automotive technologies, that price is expected to drop as the product continues to roll out, Boston says. "Our hope is to have one on every vehicle."
While the RPlate may be expensive, it is an easy way to bring connectivity to older vehicles, whether they are privately owned or part of a business fleet. ReviverAuto plans to deploy the RPlate in nearly a dozen states in 2018, and internationally as well.
New York became the first U.S. state to require license plates in April 1901 — usually it was the person's initials. But in May 1903 the state legislature passed a law requiring the New York Secretary of State to assign each registered car owner a different license plate number. By 1918, all states required license plates, and they haven't changed much since.


Blink Publishing has appointed Media Agency Group to coordinate an advertising campaign to coincide with the launch of footballer Rio Ferdinand's autobiography.
Billboards, Underground panels and digital 6 sheets will feature at premium sites throughout Manchester and London.
The multi-format campaign will promote Rio Ferdinand's autobiography, #2sides, which promises to be a 'candid, outspoken and supremely honest' read when it hits shelves on October 2nd.
Positioned throughout the London Underground and Manchester Piccadilly rail station from September 22nd, the campaign will target mass audiences travelling across the country.
4 sheet billboards will feature in fifty Underground stations including Euston and London. The campaign will also feature at premium Tube stations including Oxford Circus and Leicester Square.
Digital 6 sheet advertising will be featured at Waterloo rail station.
Taxi superside advertising will also be used to add further weight to the marketing initiative. Taxi advertising is a hugely effective method of furthering reach of a campaign whist reinforcing the message in the minds of consumers.


GSM round cutter is equipped with 4 knives. By rotating the knob quarter a turn, the cutter will provide you the sample of 100 cm2.
To operate the instrument, place a piece of specimen between the cutting board and sample cutter. Now release the safety catch and exert light pressure on the hand wheel. To cut the specimen in accurate shape and size, rotate in clock-wise direction with light and even pressure. This will help you to get the circular sample with smooth edges.
Standard size of the cut is circular.
The cutter cut the specimen of area 100 centimeter square and diameter 113 mm.
The cutter has 4 stainless steel blade holders.
It has heavy duty reversible blades.
4 blades are provided with the machine.
It is equipped with a safety lock made up of fine brass.
It has special backelite handle.
The machine is incorporated with rubber-form pad.
The body is made up of aluminum casting for flexibility and light weight.
It provides round shape cutting.
Machine has 4 replaceable German Blades.
¼ rounds movement of hand wheel to cut the specimen.


Discussion in 'Designers and Collections' started by Diorette, May 28, 2009.
PARIS (AFP) – France's US-owned couture house Christian Lacroix SNC has declared insolvency after falling foul of the global crisis, the company said Thursday.
Arguably one of the most exuberant couturiers in Paris, Christian Lacroix SNC said in a statement that the company owned by Falic had declared insolvency before a Paris court due to "the sharp downturn of the luxury market."
The company said it "has filed a voluntary petition with the Tribunal de Commerce de Paris to put itself under the protection of the courts" but intends "to present a continuation plan" and "intends to maintain its business operations throughout the proceedings."
Declaring insolvency is a first step towards bankruptcy protection.
After being bought by the US firm from luxury group LVMH in early 2005, the company launched "an ambitious and costly restructuring plan to reposition the brand offering to higher end collections," terminating ready-to-wear lines and opening two stores in the United States, one in Las Vegas, one in New York.
"Unfortunately, this longterm strategy for repositioning of the brand was dramatically hindered by the current and ongoing world financial and economic crisis which severely hit the luxury sector," the company said.
I'm confused on how this is happening. If this brand is under the LVMH umbrella then how could this really happen? I thought many of the brands that didn't make money were somewhat supported by the huge profit margins and returns of other brands under LVMH.
^ He's not owned by LVMH anymore. They sold his brand in 2004. The Falic group owns his label now.
Christian Lacroix, the French couturier whose artistic and exuberant pouf dresses propelled him to fame in the 1980s, became the latest victim of the global financial crisis Thursday as the U.S.-owned fashion house bearing his name filed for court protection from creditors.
The voluntary petition, similar to Chapter 11 bankruptcy protection in the United States, was filed with the commercial court in Paris, which will decide whether to restructure or liquidate the company.
Although Lacroix's chief executive officer, Nicolas Topiol, emphasized that the brand intended to continue operating during the process, the news brings an end to a luxury business model for which Lacroix was the last of the Mohicans.
Founded in 1987 by Bernard Arnault, chairman and chief executive of LVMH (Moët Hennessy Louis Vuitton), the concept was to start with haute couture, at the apex of the luxury pyramid, and develop from it a range of ready-to-wear, accessories and fragrances. This was the system that had reaped mighty profits for established houses like Christian Dior and Chanel.
But despite years of critical success, the company failed to break even, let alone turn a profit. Mr. Arnault sold Lacroix in 2005 to the Florida-based Falic Group, known for its Duty Free Americas chain. The Falic brothers aimed to refocus the luxury brand at the peak, subsequently suppressing the lower-priced clothing and jeans lines.
According to people with knowledge of the situation, Lacroix was badly hit in the United States, where it has opened two stores in New York and Las Vegas and where buyers have recently reduced or canceled orders. Ready-to-wear sales for the coming autumn season were down 35 percent and losses for 2008 were €10 million, or $14 million, on overall revenues of approximately €30 million.
Mr. Topiol's statement said only that the "long-term strategy for repositioning of the brand was dramatically hindered" by the financial crisis.
That has been evident for some time across the luxury sector, where even the biggest players are being hurt by recession and financial turmoil. LVMH, the world's biggest luxury goods company, recently scrapped a plan to open a Louis Vuitton flagship store in Tokyo. Early this year, Chanel announced the layoffs of 200 temporary employees.
Versace, an independent Italian house, is currently in a state of turmoil, announcing that revenues fell 13 percent in the first quarter of the year. The board of directors this week approved a three-year plan to steer the company through the economic crisis, while continuing to deny rumors that its chief executive of four years, Giancarlo Di Risio, will soon exit the company.
The lessons seem to be that it is now difficult to survive in high fashion without being part of a corporate group with recourse to investment for product development and flagship stores, and that the pyramid model is no longer viable.
The modern strategy, as exemplified by the growth of the Giorgio Armani brand, is a sunburst, with the designer at the epicenter and all product categories (except sunglasses, which are technically demanding) under the brand control.
Yet, significantly, an Armani Privé couture line was created to add prestige and a direct link with celebrity clients.
The loss of Christian Lacroix to Paris haute couture is immeasurable. Although the designer hopes to hold a small presentation during the July couture season, this was the last house established under the formal couture rules. Even a restructuring would likely have severe implications on his 125-member staff.
The grandeur and artistry of the couturier's work was displayed earlier this month in the sumptuous gown created for Philomèna de Tornos, the bride of Jean de France, Duc de Vendôme, a descendent of the French royal dynasty.
But just as royalty now has less attention than celebrity, so couture has lost its unique prestige, with the word bandied about by any high-end designer. And whereas fragrances produced from the mystique of haute couture once kept the houses afloat, now it is just as likely that a hip jeans brand like Diesel or a celebrity like Jennifer Lopez will have the perfume hit that has stubbornly eluded Lacroix. Mr. Lacroix, who received the Chevalier de la Legion d'Honneur in 2002, for services to fashion, has other strings to his bow, apart from his colorful and sophisticated collections. He was creative director for Emilio Pucci, the Italian fashion house, from 2002 to 2005, while he was still within the LVMH group.
The designer also has his own XCLX company, for which he has created decor for the French TGV high-speed train, as well as hotel interiors and uniforms for Air France. He has also designed for theater, opera and dance and acted as curator for fashion exhibits, including one currently at the National Museum of Singapore.
As this global depression continues, I expect to see more such thing. While many of these niche markets have been isolated from such downfalls because the uber wealthy are the uber wealthy, there is also a large abundance of designers and houses that are out there.
terrible truth of the current market!
And didn't Lacroix just report a big boost in couture sales recently ?
Lacroix is a classic. It can't die out.
Maybe LVMH will buy it back ?
of all brands, why lacroix??? i love the way his collections always pop. and nobody does colour like lacroix. nobody!!!
^ Are people buying it? What is the market for RTW versus HC? Part of the biggest issue is Lacroix went through a huge restructuring only to emerge in a bad market. Bad timing. This is like an investor building a huge building when floor space is selling at $X/sq foot and then by the time the building is ready to lease, the economy has downturned and commercial real estate is at 1/2 X.
This news is yet another reminder to us all that the credit crisis is real and discriminates against no one. Nevertheless, we shouldn't shun the luxury market as we all like to be spoilt. Maybe it's not a good idea to go to Bond Street or 5th Avenue and spend money like its 2005, however, it's time to be more aware of ourselves and what fits our with lifestyles. Designer-high street collaborations, made famous by H&M, are the best way forward, this way designers maintain recognition and perhaps future costumers and high street chains gain record sales.
Though it's sad that a major fashion brand is in trouble we mustn't forget our part in the world and what we can do to keep such things from happening. The luxury market has been somewhat of a target for the credit crunch thanks to bankers wives parading around in couture ensembles accessorized with Fendi bags most of us could never afford. However, fashion inspires the young and opens up the imagination of so many. It would be a crime to see the industry suffer for the mistakes of so few.
He was my favorite designer!!! THIS CAN BE HAPPENING!!! I ALWAYS look forwards to his couture collections. This can't be. It can't be!!!
I can't believe it.Lacroix was one of the first names in the fashion world that I heard of.He's truly one of the few designers that I would qualify as being an 'artist'.He'll seriously be missed.I guess it's just unfair to see many hip brands carrying on while some of the most inspiring figures are forced to stop/retire.
It is sad that the art of couture cant maintain its place in society. <- this is one of my motivations, to change this pattern.
I'm in a state of panic...my heart is racing! And just today I was talking with a friend about how incredible Lacroix is.
I mean...Haute Couture without Lacroix is just...worthless. Lacroix is Haute Couture. I'm so heartbroken. I hope things work out soon, but I can't get too hopeful. This recession is ruining EVERYTHING! I mean, we like to say that a recession is good for fashion every once and a while to separate the talented from the...untalented...but when it threatens those who truly are talented, it no longer seems like the recession can do any good for the biz.
Well, it makes sense. I mean nobody in their right mind would pay twenty grand for a dress that's not even wearable. Not everybody is filthy rich and able to just shed money for stuff like that, people need to start realizing that.


Find and book Game Lodges in Bergville. Whether on holiday or for business travels, browse listings of all game lodges in Bergville to find your ideal accommodation.
View the Map of Bergville to find the Game Lodges in the location you wish to stay or view all types of accommodation in Bergville.