Mobile ad hoc networks (MANETs) are highly vulnerable to both link and node failures due to nodal mobility. The routing resilience against link and/or node failures needs to be enhanced to avoid the degradation of network performance. This can be achieved by multipath routing which uses multiple alternative paths to route the messages via multiple disjoint paths and result in increased bandwidth, fault-tolerance, and security. An optimized link state routing (OLSR) protocol is a proactive routing protocol. An advanced OLSR (AOLSR) protocol is proposed based on a modified Dijkstra's algorithm which enables routing in multiple paths of dense and sparse ne0074work topologies. The routing is based on the energy of nodes and links (implied from the lifetime) and the mobility of the nodes. It is a hybrid ad hoc routing protocol because it combines the proactive and reactive features. It is another form of source routing protocol which allows a sender of a data packet to partially or completely reveal the route the packets take through the network. Two cost functions are introduced to build link-disjoint or node-disjoint paths. Secondary functions, namely path recovery and loop discovery process are involved to manage the topology changes of the network. AOLSR protocol is analyzed and compared with the existing MANET routing protocols namely, dynamic source routing (DSR) and OLSR. Its performance is observed to be satisfactory in terms of average end-to-end delay, packet delivery ratio (PDR), average time in first-in-first-out (FIFO) queue, and throughput.
Network connectivity is an important aspect of mobile technologies. An advantage in mobile ad hoc networks (MANETs) is that all the nodes can act as routers to forward the packets without any additional infrastructure. This is efficient due to its self-coordinated, self-maintained, and spontaneous nature. Data routing in such networks is a challenging task owing to the lifetime, scalability, and security issues.
Several routing protocols have been designed for ad hoc networks. The link failures and node failures in ad hoc networks form a major problem due to the depleted node mobility or node power and might break down the path for routing. The routing resiliency can be enhanced by simultaneous routing of a message through multiple disjoint routes. This will ensure that the destination node will receive the message. Multipath routing protocols are advantageous especially in large and dense ad hoc networks. They solve the limitations in bandwidth and energy consumption.
The primary goals of a multipath routing protocol are to balance the network load, decrease the intersection of nodes or connections among the parallel routes, enhance the quality of service (QoS), and ensure that reliable communication is provided, while the secondary goals are to decrease the delay, overhead, and increase the network lifetime. A link failure in one path should not affect other routes. The multiple paths utilized in this type of routing protocol can act as backup routes or additional routes for parallel data transmission.
A hybrid ad hoc routing protocol is a combination of proactive and reactive routing protocols. A proactive routing protocol maintains a routing table (next hop information) for all potential destinations and so it is also known as table-driven routing protocol. A reactive routing protocol determines a route only on demand by inundating the network with route request (RREQ) packets and so it is also known as an on-demand routing protocol.
An optimized link state routing (OLSR) protocol is a proactive routing protocol. An advanced OLSR (AOLSR) protocol is proposed based on a modified Dijkstra's algorithm which permits routing in multiple paths of dense and sparse network topologies. The routing is based on the energy of nodes and links (implied from the lifetime) and the mobility of the nodes. Energy factors are used to determine the multiple parallel and disjoint routes. AOLSR is a hybrid ad hoc routing protocol because it integrates the proactive and reactive characteristics. It is also a source routing protocol which permits the sender of a data packet to partially or completely reveal the route that the packets traverse through a network. This enables the discovery of all possible paths to a host. Two cost functions are introduced to construct link-disjoint or node-disjoint routes. Secondary functions namely, path recovery and loop discovery process are included to manage the topology changes of the network. The network topology varies frequently due to the movement of the mobile nodes and energy constraints.
The remaining part of the paper is organized as follows: section 2 involves a brief description of the existing methods - dynamic source routing (DSR) and OLSR - and the problems involved in them. Section 3 involves the works related to probable solutions for problems in DSR and OLSR in terms of routing overhead and QoS. Section 4 involves the description of the proposed method - advanced OLSR (AOLSR). Section 5 involves the performance evaluation and comparison of AOLSR and existing techniques based on DSR and OLSR. The paper is concluded in section 6.
2. Existing methods
Two existing routing protocols for MANET are considered. One is the DSR which is a reactive routing protocol and another one is the OLSR protocol which is a proactive routing protocol.
2.1 Dynamic source routing protocol
In DSR , the mobile nodes maintain the path caches that comprise the pre-known source routes. The elements of the path cache are updated as the new paths are discovered. This protocol consists of two functions namely, path discovery and path maintenance. When a packet is to be transmitted to a destination, the source node first determines whether its path cache already consists of an existing path to the destination. If a path to the destination is available, the packet is routed using that path. Otherwise, the node starts a path discovery process by RREQ broadcast.
The maintenance of path caches extends the validity of the paths. The information in the path caches can also be extracted by the intermediate nodes for effective reduction of control overhead.
2.2 Demerits of DSR protocol
The following are the disadvantages of using the DSR protocol:
The disconnected links cannot be fixed by the local path maintenance scheme.
The idle path cache information leads to variations during the path reconstruction phase.
Higher connection setup delay compared to table-driven routing protocols.
Degradation of performance with higher mobility of nodes.
Higher routing overhead.
2.3 Optimized link state routing protocol
The OLSR protocol characterizes low bandwidth and high mobility . It involves a novel periodic flooding of control information using multipoint relays (MPRs), which decrease the number of transmissions in the network.
The OLSR daemons regularly exchange the various messages namely, HELLO, multiple interface declaration (MID), and topology control (TC). These messages maintain the network topology information under the link failure and mobility conditions.
HELLO messages are interchanged between each neighboring nodes which are at a distance of (1 - hop), where ‘hop’ is the minimum hop distance between two nodes.
TC messages are produced periodically by the MPRs to identify the other nodes which have been MPRs.
MID messages are transmitted by the nodes to inform about the involvement of network interfaces.
The timeouts before transmitting HELLO, MID, and TC messages are HELLO_PERIOD, REFRESH_ PERIOD, and TC_ PERIOD, respectively. The validity period of the information obtained from the three messages are given by the variables NEIGHB_HOLD_PERIOD, MID_HOLD_PERIOD, and TC_HOLD_PERIOD.
2.4 Demerits of OLSR protocol
The following are the disadvantages of using the OLSR protocol:
No provision for sensing of the link quality,
High consumption of network and power resources,
Large amount of bandwidth required to estimate the optimal routes.
This section deals with the probable solutions (various existing multipath routing protocols and variants of Dijkstra's algorithm) considered for solving the problems that were earlier faced by DSR  and OLSR  during the estimation of the shortest routes in MANETs and other communication fields. The conventional MANET routing protocols determine only a single route from a source to a destination . Multiple disjoint routes between the source and destination are estimated during the path discovery phase. Every node constructs a map of the whole network and uses Dijkstra's algorithm to discover the best routes to each destination. This will decrease the overhead and packet loss rate and enhance the network reliability.
Banimelhem and Khasawneh designed a grid-based multipath routing protocol integrated with congestion avoidance (GMCAR) . This is suited for grid-based sensor networks focusing on energy efficiency. The network was divided into grids, where each grid composes of a master node. The master node is responsible for delivery of data obtained from any node in the corresponding grid. A master node also routes the data from the other master nodes in the surrounding grids. Each master node stores the multiple diagonal routes to its sink in a routing table. A congestion control scheme combined with grid densities and hop count enhances the performance of this protocol. It consumed an average of 22% energy of the total stored energy. The average delivery ratio was around 50% and the average end-to-end packet delay was about 280 ms.
Thulasiraman, et al. proposed a multipath routing scheme in wireless multihop networks . The QoS was enhanced by a fair max-min bandwidth allocation algorithm based on different routing metrics. An optimization formulation was designed to solve the multi-commodity flow problem in the bandwidth allocation algorithm. Dijkstra's algorithm with some prominent edge lengths was also considered for reducing the communication overhead (determination of single source shortest route) in multipath routing algorithms . A MANET was modeled as a graph (abstract data type) comprising of edges with positive length and the prominent edge lengths. Considering a graph with x vertices, y edges, and Z prominent edge lengths, this Dijkstra's algorithm possesses the following communication complexity:
Yang, et al. proposed a disjoint, integrated, and reliable multipath routing scheme for sensor networks . The multiple paths were constructed using a hop-by-hop technique. This scheme maintains only the local route information on each node before estimating the end-to-end paths. The neighbors were clustered into groups according to their hop count. This enhanced the network traffic balance. The local nodes chose their own backup nodes to construct additional logical routes using an integrated multipath model. This method effectively guaranteed the load balance of the network and decreased the number of transmission routes and nodal energy consumption. Sermpezis, et al. investigated a junction-based multipath source routing algorithm for vehicular ad hoc networks (VANETs) . The adoption of the junction-focused logic and source routing schemes resulted in an average packet delivery ratio (PDR) of 83% and an average delay of 0.425 s. This technique chooses the paths according to Dijkstra's algorithm. Dijkstra's algorithm is used to perform a bidirectional search on time-dependent road networks  and plan the motion of unmanned aerial vehicles (UAVs) based on terrain elevation . Dijkstra's algorithm was also recently used for solving mathematical problems like L-concave function maximization .
Zuo, et al. proposed a hybrid multipath routing protocol for industrial wireless mesh networks . Usually multipath routing methods are designed only for enhancement of reliability and not guaranteed transmission. This hybrid multipath technique enhances both the reliability and trust of data transmission. This method uses an enhanced Dijkstra's algorithm for the determination of the shortest path from the gateway to each end node. The multiple routes are estimated using the ant colony optimization algorithm and the link failures are managed using the path maintenance scheme. Some other multipath routing protocols include concepts like independent directed acyclic graphs , forward error correction , border gateway protocol (BGP) , inter-domain routing , multiple-exit discriminator (MED) , hiding routes , and adaptive multi-metric ad hoc on-demand multipath distance vector (AM-AOMDV) routing protocol .
4. Hybrid ad hoc routing protocol
The primary functions of AOLSR protocol are topology detection and path estimation. The network topology is sensed to inform the nodes the topology information. The path estimation utilizes the modified Dijkstra's algorithm to compute the various paths based on the information from topology detection. A link failure in one path should not affect other routes. The source path (route from source to destination including all the hops) is always preserved in the header of the data packets. The data flow diagram of AOLSR protocol is shown in Figure 1.
Topology detection and path estimation are responsible for the determination of the multiple paths from the source to the destination. The instability of the wireless medium and the variations in the network topology necessitates the auxiliary functions of the OLSR protocol such as, path recovery and loop discovery. Path recovery is used for the effective decrease of the packet loss and loop discovery is used to detect and avoid loops in the routing paths.
4.1 Topology detection
The information in the network topology is sensed by topology detection. The procedure in AOLSR consists of an additional process known as energy detection to that of OLSR, with processes namely, link detection, neighbor detection, and topology discovery. Link detection constructs the link set consisting of local link information. It concentrates on the packet communication between the OLSR interfaces and their addresses. Neighbor detection constructs a single-hop neighbor set and a double-hop neighbor set consisting of network information and node addresses. Topology discovery constructs a topology set containing the information about the nodes that are greater than double hops. The topology set construction depends on the TC message flooding.
Each sensor node in the WSN obtains sufficient topological information to enable routing. The AOLSR protocol estimates the route quality and energy usage according to the number of hops and maintains the link information. The hop count and energy consumption are used as the link metrics in the AOLSR protocol.
4.2 Path estimation
The determination of paths is based on an on-demand methodology to obviate the density estimation of multiple paths for every feasible destination. The lifetime of the nodes and links determine the path selection. The routes with longer lifetime (energy) are chosen to prohibit the failure of the entire route in case of energy exhaustion of certain nodes or links. A multipath estimation hypotheses model is introduced as a prerequisite for the modified Dijkstra's algorithm.
4.2.1 Hypotheses model
A multipath routing protocol constructs a group gn of n paths without any loops. These paths connect a source node S to a destination node D.
An ad hoc network is defined by a directed energy graph (an abstract data type) G = (gv, ga, fc), where gv is the group of vertices, ga⊂gv × gv the group of arcs, and fc: gv → ℝ*+ a rigidly real-positive cost function. The graph is initialized to be undirected, i.e., (v1, v2) ∈ga⇒ (v2, v1) ∈ga and fc(v1, v2) = fc(v2, v1) and loop-free, i.e., No arcs from a node connect to itself. It is also assumed that a pair of vertices cannot be linked by more than one arc. A path between S and D is defined as a sequential order of vertices (v1, v2, …, vD) so that consecutive vertices are elements of ga, where v1 = S and vD = D. These hypotheses define the cost function fc in an ad hoc manner.
4.2.2 Modified Dijkstra's algorithm
The AOLSR maintains a status flag for every sensor node in the WSN to learn the validity of the routes to the relative sensor node. The status flag of every node x (status _flagx) is initially set to 0, which implies the path to the corresponding destination needs to be refreshed or does not prevail. The source node will initially check status _flagx when a RREQ to node x is placed.
When status _flagx is equal to 0, the node executes Algorithm I to obtain the multiple routes to node x. These routes are stored in the multipath routing table and the relative status _flagx is updated to 1.
When status _flagx is equal to 1, the node determines a valid path to node x in the multipath routing table.
Whenever the node receives a new HELLO or TC message, variations occur in the topology set, and all the status flags will be set to 0. Algorithm I briefs the steps for the determination of n routes from S to D.
This modified Dijkstra's algorithm is applied to a graph G = (gv, ga, fc), two vertices (S, D) ∈ga2, and a rigidly real-positive integer n. It results in n paths (P1, P2, …, Pn) from S to D obtained from G. The following predefined functions or conventions are used:
Dijkstra(G, S) is the conventional Dijkstra algorithm  which yields the source tree (Ts) of the shortest route from vertex S in a graph G, where a tree is a type of data structure.
Get_Path(Ts, D) is the function to obtain the shortest path to D from Ts.
a-1 means the opposite edge of a.
Vertex _Head(a) gives the head (forward vertex edge) of a.
Initially, the links are selected according to the maximum lifetime as per the following three conditions:
The link with the maximum lifetime is chosen from the former links which initiate from a specific node x.
When there are many links with equal lifetime, the lifetimes of the neighbors in each link are compared, and the link whose neighbor possesses the maximum lifetime is chosen.
When there are various links with equal lifetime and whose neighbors also possess equal lifetime, a link is chosen at random.
The links are selected are selected every time and further path selection is performed by using the two incremental functions. The energy factors are given by two iteration factor weights: weight for links (Wl) and weight for nodes (Wn). The range of these weights is [0, 1]. The iteration factor weights are given by the following formulae:
In (2), tl _max, tl _min, and tl _avg respectively denote the maximum, minimum, and average lifetime of the links in the entire route. In (3), tn _x denotes the lifetime of node x and tn _threshold denotes the threshold of the lifetime for any node in the route. The computation of the energy factors can be altered according to the various inclines for the disconnectivity of the links or disconnectivity of the nodes during path selection.
Two incremental functions fa, fr : ℝ*+ → ℝ*+ are introduced at each round to obtain a disjoint route between S and D. fa is used to increase the arc costs that converge to the vertices of the previous path Px. fr is used to increase the arc costs that belong to the previous path Px (or the opposite arcs belonging to it). This will enable the further routes to utilize various arcs. The three possible conditions are as follows:
When fi = fa < fr, the routes become arc-disjoint.
When fi < fa = fr, the routes become vertex-disjoint.
When fi < fa < fr, the routes try to be vertex-disjoint, but if not possible, they become arc-disjoint.
In the above conditions, fi denotes the identity function. The cost functions determine the variety in the n paths of the network topology. There is no necessity that the multiple paths estimated by this algorithm require being completely disjointed. This is because the number of disjoint routes is bounded to the (S, D) minimal cut. The minimal cut of (S, D) is the dimension of the smallest subset of edges necessary to link S to D. The minimal cut is estimated by the neighborhoods of source and destination. A demerit of completely disjoint algorithm is the generation of longer routes because each local cutoff can be applied only once.
An illustration of the modified Dijkstra's algorithm is shown in Figure 2. The number of hops is used as the connection cost metric, fa(c) = 2c, and fr(c) = 3c. More penalties are assigned to the traversed links. The cost of the links is set to unity initially.
First, the shortest route S → E → F → G → D is determined. Then, the cost functions are applied to increase the cost of the corresponding arcs:
S → E, E → F, F → G, G → D will be modified from 1 to 3 as per fr.
S → A and C → G will be altered from 1 to 2 as per fa.
Next, the second shortest route S → A → B → C → G → D is determined. Different cost functions can determine numerous multipath sets (link-disjoint or node-disjoint) according to the network preferences. Another network topology example is shown in Figure 3.
When fa(c) = c, and fr(c) = 3c are chosen, the penalty is assigned only to the traversed links, and the two link-disjoint routes obtained are S → E → A → F → D and S → B → A → H → D.
When fa(c) = 2c, and fr(c) = 3c are chosen, the penalty is assigned only to the traversed nodes, and the two node-disjoint routes obtained are S → E → A → F → D and S → B → C → G → H → D.
4.3 Path recovery
Topology detection determines the network topology details with the communication of HELLO and TC messages. This information is stored in the link set, neighbor set, or topology set of the local node. Practically, the topology information base is not competent compared to the real network topology owing to the mobile nature of the ad hoc network.
During the message generation time interval of the HELLO and TC messages, the topology may vary due to nodal movement. The control message can get expired or even get lost due to the possible collision or delay in the control messages. These conditions are the reasons for the variability between the actual network topology and the network topology information base.
Path recovery is used to fulfill the gap between the actual network topology and the network topology information base. First, a node checks whether the next hop in the source path is one of its neighbors. If so, the packet is transmitted normally; otherwise, it is decided that the ‘next hop’ node is not available. Next, the node will recalculate the path and transmit the packet in the new route.
An example of path recovery is given in Figure 4. The packets are routed from source S to destination D. The actual paths are S → E → F → D and S → A → B → G → D. But, the node G displaces out of the transmission range of node B and loses the second path. Now, the link failure cannot be detected immediately by the source node because of the delay in TC messages. So, the source node keeps on transmitting the packets along the same path which are dropped consequently. When path recovery is included, the node B will check upon the incoming packet whether node G is yet one of its neighbors before transmitting the packet according to the primary route. When node G is not one of the neighbors of node B, the former node will recalculate the path to node D, and find B → C → D. Then the incoming packets are transmitted through the new route.
This technique does not introduce much additional delay because path recovery checks only the topology information stored in the local node. It will also greatly enhance the PDR of the network. The delivery ratio of the AOLSR protocol with path recovery is about 50% higher than that without path recovery.
4.4 Loop discovery
Loops in the network are an essential issue in routing because they result in data redundancies and communication latency. Link layer notification (LLN) must be mandatorily discussed for the enhancement of the packet delivery ratio, before handling the problem of loops in the network . The link layer information briefs about the linkage to the available neighboring nodes. This information is additionally used to that of the HELLO message for the maintenance of the neighbor set and MPR selector group. The AOLSR protocol acts on the Acknowledgement (ACK) message from LLN and deletes the related connections from its information base.
Theoretically, the routes produced by Dijkstra's algorithm and the AOLSR protocol are devoid of loops. But, practically due to LLN and path recovery, loops in the network are possible. A node attempts to transmit a packet over a link but does not succeed in the end and so the link layer will give a feedback to the AOLSR protocol to apprise about the link loss. This sort of sudden interruption will require additional executions on the topology information base besides the normal HELLO and TC messages. This implies that other nodes do not know about these modifications immediately. Consequentially, the LLN might result in variable topology information in the various nodes. The inclusion of path recovery enables the modification of the route in intermediate nodes and the loop in the network is temporarily constrained.
An example of loop production is shown in Figure 5. Here, node X is taken as an intermediate node of some former route. The packets with the primary path X → Z arrive at node X and require to be transmitted to node Z. Next, node Z displaces out of the transmission coverage of nodes X and Y, which expires the links X → Z and Y → Z.
The transmission of the incoming packets at node X to node Z will be failed, as a result of which the AOLSR protocol in node X will be accepted by LLN, and the path X → Z is removed from the link set of node X. For node X, although it identifies the link failure of X → Z by LLN, it is tough to detect the failure of Y → Z instantly. This is due to the late removal of link Y → Z because of the high expiry time of NEIGHB _HOLD _PERIOD. Simultaneously, the path recovery process will be triggered and a fresh path X → Y → Z will be determined. The forthcoming packets will be transmitted through this new path and will be rerouted to node Y. These operations are also repeated in node Y. Since node Y cannot identify the link failure of X → Z immediately, the recent route discovered by path recovery is Y → X → Z. This creates a loop as the packet will traverse Y → X → Y. This is only a transient loop existing for several seconds and will diminish when the corresponding link expires. But this sort of temporary loops will hinder the links in the loop and choke the respective transmission area.
To overcome the previous disadvantage, a loop discovery technique based on source routing is applied which does not accumulate much memory overhead. After the process of path recovery, a new route will be estimated from the present node to the destination. This method will utilize the new route when there are no loops in the network; otherwise, it will determine another route according to the modified Dijkstra's algorithm. Suppose no suitable route exists, the packet will be discarded.
Node X will obtain a route X → Y → Z by path recovery. Now, when the packet arrives at node Y, a new route Y → X → Z will be produced because of the connection failure of Y → Z. Node Y will examine the new route with the former primary route X → Y → Z in the packet. The reduction of loops in the network will efficiently decrease the network congestion and end-to-end delay.
5. Performance analysis
The network topology with the distribution of nodes is given in Figure 6. The AOLSR protocol is analyzed and compared with the existing MANET routing protocols namely, dynamic source routing (DSR)  and OLSR . Its performance is observed to be satisfactory in terms of average end-to-end delay, packet delivery ratio (PDR), average time in first-in-first-out (FIFO) queue, and throughput.
5.1 Average delay
The average delay for the OLSR and AOLSR protocols is analyzed and compared in Figure 7, while the average delay for all the three protocols DSR, OLSR, and AOLSR are analyzed and compared in Figure 8.
5.2 Average end-to-end delay
The average end-to-end delay for OLSR and AOLSR protocols is analyzed and compared in Figure 9.
5.3 Packet delivery ratio
The PDR for all the three protocols DSR, OLSR, and AOLSR are analyzed and compared in Figure 10.
5.4 Average time in FIFO queue
The average time in a FIFO queue for all the three protocols DSR, OLSR, and AOLSR are analyzed and compared in Figure 11.
The throughput for all the three protocols DSR, OLSR, and AOLSR are analyzed and compared in Figure 12.
In this paper, a hybrid ad hoc routing protocol, i.e., an advanced OLSR (AOLSR) protocol, is proposed based on a modified version of Dijkstra's algorithm. The major additions to the conventional Dijkstra's algorithm are the two cost functions to create the multiple disjoint or connected routes, secondary functions, i.e., path recovery and loop discovery to ensure the QoS. The routing is based on the energy of nodes and links (implied from the lifetime) and the mobility of the nodes. This routing protocol effectively enhances the network performance in the case of heavy network traffic and high mobility.
The main aspects in a MANET such as confidentiality, network lifetime, scalability, and reliability are satisfied by the AOLSR protocol. The network lifetime is enhanced by decreasing the number of transmitted packets per node. The future work involves the enhancement of this model in terms of security via a partial network topology to detect attacks like spoofing attack, invalid MPR attack, disruption attack, and hop limit attack.
Qadri N, Liotta A: Analysis of Pervasive Mobile Ad Hoc Routing Protocols. In Pervasive Computing. Edited by: Hassanien AE, Abawajy JH, Abraham A, Hagras H. Springer, London; 2010:433-453.
Cervera G, Michel B, Joaquin GA, Evangelos K: Security issues in link state routing protocols for MANETs. vol. 18. In Advances in Network Analysis and its Applications. Edited by: Kranakis E. Springer, Berlin Heidelberg; 2013:117-148.
Thulasiraman P, Chen J, Shen X: Multipath Routing and Max-Min Fair QoS Provisioning under Interference Constraints in Wireless Multihop Networks. IEEE Trans on Parallel and Distributed Systems 2011, 22(5):716-728.
Orlin JB, Madduri K, Subramani K, Williamson M: A faster algorithm for the single source shortest path problem with few distinct positive lengths. J Discrete Algorithms 2010, 8(2):189-198. 10.1016/j.jda.2009.03.001
Medeiros F, Silva J: A Dijkstra algorithm for fixed-wing UAV motion planning based on terrain elevation. In Advances in Artificial Intelligence – SBIA 2010. Vol. 6404. Edited by: Rocha Costa A, Vicari R, Tonidandel F. Springer, Berlin Heidelberg; 2011:213-222.
Bucciol P, Li FY, Fragoulis N, Carlos J: Hierarchical and QoS-aware routing in multihop wireless mesh networks. In Guide to Wireless Mesh Networks. Edited by: Misra S, Misra S, Woungang I. Springer, London; 2009:49-75.
Open Access This article is distributed under the terms of the Creative Commons Attribution 2.0 International License (https://creativecommons.org/licenses/by/2.0), which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited.