1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096
|
%\documentstyle[11pt,fullpage]{article}
%\setlength{\parindent}{0 in}
%\setlength{\parskip}{.1in}
%\setlength{\topmargin}{-0.5in}
%\setlength{\textheight}{8.5in}
%\begin{document}
\chapter{Satellite Networking in \ns}
\label{chap:satellite}
This chapter describes extensions that enable the simulation of satellite
networks in \ns. In particular, these extensions enable \ns~to model
the following: i) traditional geostationary ``bent-pipe'' satellites with
multiple users per uplink/downlink and asymmetric links, ii) geostationary
satellites with processing payloads (either regenerative payloads or full
packet switching), and iii) polar orbiting LEO constellations such as
Iridium and Teledesic. These satellite models are principally aimed at
using \ns~to study networking aspects of satellite systems; in particular,
MAC, link layer, routing, and transport protocols.
%\paragraph{Notice (caveat emptor)}
%This code (including perhaps the APIs at OTcl level) is likely to change
%over the next few months (as of this writing in June 1999) as the \ns~
%developers work on integrating the structure of satellite nodes,
%wireless nodes, hierarchical nodes, etc. In particular, we plan on
%modifying the code to support mixed-node topologies (e.g., simulations
%consisting of traditional \ns~nodes and satellite nodes) and running existing
%unicast and multicast OTcl-based routing protocols. \nam~~is
%not currently supported with these extensions.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Overview of satellite models}
\label{sec:satellite/overview}
Exact simulation of satellite networks requires a
detailed modelling of radio frequency characteristics (interference, fading),
protocol interactions (e.g., interactions of residual burst errors on the
link with error checking codes), and second-order orbital effects (precession,
gravitational anomalies, etc.). However, in order to study fundamental
characteristics of satellite networks from a {\em networking} perspective,
certain features may be abstracted out. For example, the performance of
TCP over satellite links is impacted little by using an approximate rather than
detailed channel model-- performance can be characterized to first order
by the overall packet loss probability. This is the approach taken in this
simulation model-- to create a framework for studying transport,
routing, and MAC protocols in a satellite environment consisting of
geostationary satellites or constellations of polar-orbiting
low-earth-orbit (LEO) satellites. Of course, users may extend these models
to provide more detail at a given layer.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Geostationary satellites}
\label{sec:satellite/overview/geo}
Geostationary satellites orbit the Earth at an altitude of 22,300 miles
above the equator. The position of the satellites is specified in terms
of the longitude of the nadir point (subsatellite point on the Earth's
surface). In practice, geostationary satellites can drift from their
designated location due to gravitational perturbations-- these effects
are not modelled in \ns.
Two kinds of geostationary satellites can be modelled. Traditional
``bent-pipe'' geostationary satellites are merely repeaters in orbit--
all packets received by such satellites on an uplink channel are piped
through at RF frequencies to a corresponding downlink, and the satellite node
is not visible to routing protocols. Newer satellites will
increasingly use baseband processing, both to regenerate the digital signal and
to perform fast packet switching on-board
the spacecraft. In the simulations, these satellites can be modelled more like
traditional \ns~nodes with classifiers and routing agents.
Previously, users could simulate geostationary satellite links by simply
simulating a long delay link using traditional \ns~links and nodes. The
key enhancement of these satellite extensions with respect to geostationary
satellites is the capability to simulate MAC protocols. Users can now
define many terminals at different locations on the Earth's surface and
connect them to the same satellite uplink and downlink channels, and the
propagation delays in the system (which are slightly different for each
user) are accurately modelled. In addition, the uplink and downlink channels
can be defined differently (perhaps with different bandwidths or error models).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Low-earth-orbiting satellites}
\label{sec:satellite/overview/leo}
\begin{figure}
\centerline{\includegraphics{sat-constellation}}
\caption{Example of a polar-orbiting LEO constellation. This figure
was generated using the SaVi software package from the geometry center at the
University of Minnesota.}
\label{fig:constellation}
\end{figure}
Polar orbiting satellite systems, such as Iridium and the proposed Teledesic
system, can
be modelled in \ns. In particular, the simulator supports the specification
of satellites that orbit in purely circular planes, for which the neighboring
planes are co-rotating.
There are other non-geostationary constellation configurations
possible (e.g., Walker constellations)-- the interested user may develop new
constellation classes to simulate these other constellation types. In
particular, this would mainly require defining new intersatellite link
handoff procedures.
The following are the parameters of satellite constellations that can currently
be simulated:
\begin{itemize}
\item {\bf Basic constellation definition} Includes satellite altitude,
number of satellites, number of planes, number of satellites per plane.
\item {\bf Orbits} Orbit inclination can range continuously
from 0 to 180 degrees (inclination greater than 90 degrees corresponds to
retrograde orbits). Orbit eccentricity is not modeled. Nodal precession is
not modeled. Intersatellite spacing within a given plane is fixed. Relative
phasing between planes is fixed (although some systems may not control phasing
between planes).
\item {\bf Intersatellite (ISL) links} For polar orbiting
constellations,
intraplane, interplane, and crossseam ISLs can be defined. Intraplane ISLs
exist between satellites in the same plane and are never deactivated or
handed off. Interplane ISLs exist between satellites of neighboring
co-rotating planes. These links are deactivated near the poles (above
the ``ISL latitude threshold'' in the table) because the antenna pointing
mechanism cannot track these links in the polar regions. Like intraplane ISLs,
interplane ISLs are never handed off. Crossseam ISLs may exist in a
constellation between satellites in counter-rotating planes (where the
planes form a so-called ``seam'' in the topology). GEO ISLs can also be
defined for constellations of geostationary satellites.
\item {\bf Ground to satellite (GSL) links} Multiple terminals
can be connected to a single GSL satellite channel. GSL links for GEO
satellites are static, while GSL links for LEO channels are periodically
handed off as described below.
\item {\bf Elevation mask} The elevation angle above which a GSL
link can be operational. Currently, if the (LEO) satellite serving a terminal
drops below the elevation mask, the terminal searches for a new satellite
above the elevation mask. Satellite terminals check for handoff opportunities
according to a timeout interval specified by the user. Each terminal
initiates handoffs asynchronously; it would be possible also to define
a system in which each handoff occurs synchronously in the system.
\end{itemize}
The following table lists parameters used for example simulation scripts
of the Iridium\footnote{Aside
from the link bandwidths (Iridium is a narrowband system only), these
parameters are very close to what a broadband version of the Iridium system
might look like.} and Teledesic\footnote{These Teledesic constellation
parameters are subject to change;
thanks to Marie-Jose Montpetit of Teledesic for providing
tentative parameters as of January 1999. The link bandwidths are not
necessarily accurate.} systems.
\begin{table}[h]
\begin{center}
{\tt
\begin{tabular}{|c||c|c|}\hline
& {\bf Iridium} & {\bf Teledesic}\\\hline\hline
{\bf Altitude} & \rm 780 km& \rm 1375 km\\\hline
{\bf Planes} & \rm 6& \rm 12\\\hline
{\bf Satellites per plane} & \rm 11 & \rm 24\\\hline
{\bf Inclination (deg)} & \rm 86.4 & \rm 84.7\\\hline
{\bf Interplane separation (deg)} & \rm 31.6 & \rm 15\\\hline
{\bf Seam separation (deg)} & \rm 22 & \rm 15\\\hline
{\bf Elevation mask (deg)} & \rm 8.2 & \rm 40\\\hline
{\bf Intraplane phasing} & \rm yes & \rm yes\\\hline
{\bf Interplane phasing} & \rm yes & \rm no\\\hline
{\bf ISLs per satellite} & \rm 4 & \rm 8\\\hline
{\bf ISL bandwidth} & \rm 25 Mb/s & \rm 155 Mb/s\\\hline
{\bf Up/downlink bandwidth} & \rm 1.5 Mb/s & \rm 1.5 Mb/s\\\hline
{\bf Cross-seam ISLs} & \rm no & \rm yes\\\hline
{\bf ISL latitude threshold (deg)} & \rm 60 & \rm 60\\\hline
\end{tabular}
}
\end{center}
\caption{Simulation parameters used for modeling a broadband version of
the Iridium system and the proposed 288-satellite Teledesic system.
Both systems are examples of polar orbiting constellations.
}
\end{table}
\clearpage
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Using the satellite extensions}
\label{sec:satellite/usage}
\begin{figure}
\centerline{\includegraphics{sat-spherical}}
\caption{Spherical coordinate system used by satellite nodes}
\label{fig:spherical}
\end{figure}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Nodes and node positions}
\label{sec:satellite/usage/nodes}
There are two basic kinds of satellite nodes: {\em geostationary}
and {\em non-geostationary} satellite nodes. In addition, {\em terminal} nodes
can be placed on the Earth's surface. As is explained later in
Section \ref{sec:satellite/implementation},
each of these three different types of nodes is actually implemented with
the same \code{class SatNode} object, but with different position,
handoff manager, and link objects attached.
The position object keeps track of the satellite node's location
in the coordinate system as a function of the elapsed simulation time.
This position information is used to determine link propagation delays and
appropriate times for link handoffs. Section~\ref{sec:node:nodeconfig}
introduced the
"node-config" utility used to prime the node generator for different
types of satellite nodes.
Figure \ref{fig:spherical} illustrates the spherical coordinate system,
and the corresponding Cartesian coordinate system.
The coordinate system is centered at the
Earth's center, and the $z$ axis coincides with the Earth's axis of rotation.
$(R,\theta,\phi) = (6378 km, 90^o, 0^o)$ corresponds to $0^o$ longitude
(prime meridian) on the equator.
Specifically, there is one class of satellite node \code{Class Node/SatNode},
to which one of three types of \code{Position} objects may be attached.
Each \code{SatNode} and \code{Position} object is a split OTcl/C++ object,
but most of the code resides in C++. The following types of position objects
exist:
\begin{itemize}
\item \code{Position/Sat/Term} A terminal is specified by its latitude and
longitude. Latitude ranges from $[-90, 90]$ and longitude ranges from
$[-180, 180]$, with negative values corresponding to south and west,
respectively. As simulation time evolves, the terminals move along
with the Earth's surface. The node generator can be used
to create a terminal with an attached position object as follows:
\begin{program}
$ns node-config -satNodeType terminal \bs
(other node config commands go here...)
set n1 [$ns node]
$n1 set-position $lat $lon; # in decimal degrees
\end{program}
\item \code{Position/Sat/Geo} A geostationary satellite is specified by its
longitude above the equator. As simulation time evolves, the geostationary
satellite moves through the coordinate system with the same orbital period
as that of the Earth's rotation. The longitude ranges from $[-180,180]$
degrees. As we describe further below, two flavors of geostationary nodes
exist: ``geo'' (for processing satellites) and ``geo-repeater'' (for bent-pipe
satellites). The node generator can be
used to create a geostationary satellite with an attached position object as
follows:
\begin{program}
$ns node-config -satNodeType geo (or ``geo-repeater'') \bs
(other node config commands go here...)
set n1 [$ns node]
$n1 set-position $lon; # in decimal degrees
\end{program}
\item \code{Position/Sat/Polar} A polar orbiting satellite has a purely
circular orbit along a fixed plane in the coordinate system; the Earth
rotates underneath this orbital plane, so there is both an east-west and
a north-south component to the track of a polar satellite's footprint on
the Earth's surface. Strictly speaking, the polar position object can
be used to model the movement of any circular orbit in a fixed plane;
we use the term ``polar'' here because we later use such satellites to model
polar-orbiting constellations.
Satellite orbits are usually specified by six parameters: {\em altitude},
{\em semi-major axis}, {\em eccentricity},
{\em right ascension of ascending node}, {\em inclination}, and
{\em time of perigee passage}. The polar orbiting satellites in \ns~have
purely circular orbits, so we simplify the specification of the orbits to
include only three parameters: {\em altitude}, {\em inclination}, and
{\em longitude}, with a fourth parameter {\em alpha} specifying initial
position of the satellite in the orbit, as described below.
{\bf Altitude} is specified in kilometers above the Earth's surface, and
{\bf inclination} can range from $[0,180]$ degrees, with $90$ corresponding
to pure polar orbits and angles greater than $90$ degrees corresponding
to ``retrograde'' orbits. The {\em ascending node} refers to the point
where the footprint of the satellite orbital track crosses the equator
moving from south to north. In this simulation model, the parameter
{\bf longitude of ascending node} specifies the earth-centric longitude at
which the satellite's nadir point crosses the equator moving south
to north.\footnote{Traditionally, the ``right ascension'' of the ascending
node is specified for satellite orbits-- the right ascension corresponds to the
{\em celestial} longitude. In our case, we do not care about the
orientation in a celestial coordinate system, so we specify the earth-centric
longitude instead.} {\em Longitude of ascending node} can range from
$[-180,180]$ degrees. The fourth parameter,
{\bf alpha}, specifies the initial position of the satellite along this
orbit, starting from the ascending node.
For example, an {\em alpha} of $180$ degrees indicates that the
satellite is initially above the equator moving from north to south.
{\em Alpha} can range from $[0,360]$ degrees.
Finally, a fifth parameter, {\bf plane}, is specified when creating
polar satellite nodes-- all satellites in the same plane are given the
same plane index.
The node generator
used to create a polar satellite with an attached position object as
follows:
\begin{program}
$ns node-config -satNodeType polar \bs
(other node config commands go here...)
set n1 [$ns node]
$n1 set-position $alt $inc $lon $alpha $plane
\end{program}
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Satellite links}
\label{sec:satellite/usage/links}
\begin{figure}
\centerline{\includegraphics{sat-stack-basic}}
\caption{Main components of a satellite network interface}
\label{fig:sat-stack-basic}
\end{figure}
Satellite links resemble wireless links, which are described in Chapter
\ref{chap:mobility}. Each satellite
node has one or more satellite network interface stacks, to which
channels are connected to the physical layer object in the stack. Figure
\ref{fig:sat-stack-basic} illustrates the major components. Satellite
links differ from \ns~wireless links in two major respects: i) the
transmit and receive interfaces must be connected to different channels,
and ii) there is no ARP implementation. Currently, the {\em
Radio Propagation Model} is a placeholder for users to add more detailed
error models if so desired; the current code does not use a propagation
model.
Network interfaces can be added with the following instproc of
\code{Class Node/SatNode}:
\begin{program}
$node add-interface $type $ll $qtype $qlim $mac $mac_bw $phy
\end{program}
The \code{add-interface} instproc returns an index value that can be used
to access the network interface stack later in the simulation. By convention,
the first interface created on a node is attached to the uplink and downlink
channels of a satellite or terminal. The
following parameters must be provided:
\begin{itemize}
\item {\bf type}:~~The following link types can be indicated:
\code{geo} or
\code{polar} for links from a terminal to a geo or polar satellite,
respectively, \code{gsl} and \code{gsl-repeater} for links from a satellite
to a terminal, and \code{intraplane}, \code{interplane}, and \code{crossseam}
ISLs. The type field is used internally in the simulator to identify the
different types of links, but structurally they are all very similar.
\item {\bf ll}:~~The link layer type (\code{class LL/Sat} is currently
the only one defined).
\item {\bf qtype}:~~The queue type (e.g., \code{class Queue/DropTail}).
Any queue type may be used-- however, if additional parameters beyond the
length of the queue are needed, then this instproc may need to be modified
to include more arguments.
\item {\bf qlim}:~~The length of the interface queue, in packets.
\item {\bf mac}:~~The MAC type. Currently, two types are defined:
\code{class Mac/Sat}-- a basic MAC for links with only one receiver (i.e.,
it does not do collision detection), and
\code{Class Mac/Sat/UnslottedAloha}-- an implementation of unslotted Aloha.
\item {\bf mac\_bw}:~~The bandwidth of the link is set by this
parameter, which controls the transmission time how fast the MAC sends. The
packet size used to calculate the transmission time is the sum of the
values \code{size()} in the common packet header and \code{LINK_HDRSIZE},
which is the size of any link layer headers. The default value for
\code{LINK_HDRSIZE} is 16 bytes (settable in \code{satlink.h}).
The transmission time is encoded in the packet header for use at the
receive MAC (to simulate waiting for a whole packet to arrive).
\item {\bf phy}:~~The physical layer-- currently two Phys
(\code{Class Phy/Sat} and \code{Class Phy/Repeater}) are defined.
The class \code{Phy/Sat} just pass the information up and down the stack--
as in the wireless code described in Chapter \ref{chap:mobility},
a radio propagation model could be attached at this point. The class
\code{Phy/Repeater} pipes any packets received on a receive interface
straight through to a transmit interface.
\end{itemize}
An ISL can be added between two nodes using the following instproc:
\begin{program}
$ns add-isl $ltype $node1 $node2 $bw $qtype $qlim
\end{program}
This creates two channels (of type \code{Channel/Sat}), and appropriate
network interfaces on both nodes, and attaches the channels to the
network interfaces. The bandwidth of the link is
set to \code{bw}. The linktype (\code{ltype})
must be specified as either \code{intraplane}, \code{interplane}, or
\code{crossseam}.
A GSL involves adding network interfaces and a channel on board the
satellite (this is typically done using the wrapper methods described
in the next paragraph), and then defining the correct interfaces on
the terrestrial node and attaching them to the satellite link, as
follows:
\begin{program}
$node add-gsl $type $ll $qtype $qlim $mac $bw_up $phy \bs
[$node_satellite set downlink_] [$node_satellite set uplink_]
\end{program}
Here, the \code{type} must be either \code{geo} or \code{polar},
and we make use
of the \code{downlink_} and \code{uplink_} instvars of the satellite;
therefore, the satellite's uplink and downlink must be created before
this instproc is called.
By default, the node generator for satellite nodes (described in
Section~\ref{sec:node:nodeconfig}) will create nodes of a
given type, give them an uplink and
downlink interface, and create and attach an (initial) uplink and downlink
channel, based on the interface options specified.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Handoffs }
\label{sec:satellite/usage/handoffs}
Satellite handoff modelling is a key component of LEO satellite network
simulations. It is difficult to predict exactly how handoffs will occur
in future LEO systems because the subject is not well treated in the
literature. In these satellite extensions, we establish certain criteria for
handoffs, and allow nodes to independently monitor for situations that
require a handoff. An alternative would be to have all handoff events
synchronized across the entire simulation-- it would not be difficult to
change the simulator to work in such a manner.
There are no link handoffs involving geostationary satellites, but there
are two types of links to polar orbiting satellites
that must be handed off: GSLs to polar satellites, and crossseam ISLs.
A third type of link, interplane ISLs, are not handed off but are deactivated
at high latitudes as we describe below.
Each terminal connected to a polar orbiting satellite runs a timer that,
upon expiry, causes the \code{HandoffManager} to check whether the current
satellite has fallen below the
elevation mask of the terminal. If so, the handoff manager detaches the
terminal from that satellite's up and down links, and searches
through the linked list of satellite nodes for another possible satellite.
First, the ``next'' satellite in the current orbital plane is checked-- a
pointer to this satellite is stored in the Position object of each
polar satellite node and is set during simulation configuration using
the \code{Node/SatNode} instproc ``\code{$node set_next $next_node}.''
If the next satellite is not suitable, the handoff manager searches
through the remaining satellites. If it finds a suitable polar
satelite, it connects its network interfaces to that satellite's uplink and
downlink channels, and restarts the handoff timer. If it does not find
a suitable
satellite, it restarts the timer and tries again later. If any link
changes occur, the routing agent is notified.
The elevation mask and handoff timer interval are settable via OTcl:
\begin{program}
HandoffManager/Term set elevation_mask_ 10; # degrees
HandoffManager/Term set term_handoff_int_ 10; # seconds
\end{program}
In addition, handoffs may be randomized to avoid phase effects by setting
the following variable:
\begin{program}
HandoffManager set handoff_randomization_ 0; # 0 is false, 1 is true
\end{program}
If \code{handoff_randomization_} is true, then the next handoff interval
is a random variate picked from a uniform distribution across
$(0.5 * term\_handoff\_int\_, 1.5 * term\_handoff\_int\_)$.
Crossseam ISLs are the only type of ISLs that are handed off. The criteria
for handing off a crossseam ISL is whether or not there exists a satellite
in the neighboring plane that is closer to the given satellite than the
one to which it is currently connected. Again, a handoff timer running
within the handoff manager on the polar satellite determines when the
constellation is checked for handoff opportunities. Crossseam ISL
handoffs are
initiated by satellites in the lower-numbered plane of the two. It is
therefore possible for a transient condition to arise in which a polar
satellite has two crossseam ISLs (to different satellites). The
satellite handoff interval is again settable from OTcl and may also be
randomized:
\begin{program}
HandoffManager/Sat set sat_handoff_int_ 10; # seconds
\end{program}
Interplane and crossseam ISLs are deactivated near the poles, because
the pointing requirements for the links are too severe as the satellite
draw close to one another. Shutdown of these links is governed by a parameter:
\begin{program}
HandoffManager/Sat set latitude_threshold_ 70; # degrees
\end{program}
The values for this parameter in the example scripts are speculative;
the exact value is dependent upon the satellite hardware. The handoff
manager checks the latitude of itself and its peer satellite upon a handoff
timeout; if either or both of the satellites is above
\code{latitude_threshold_} degrees latitude (north or south), the link
is deactivated until both satellites drop below this threshold.
Finally, if crossseam ISLs exist, there are certain situations in which
the satellites draw too close to one another in the mid-latitudes (if
the orbits are not close to being pure polar orbits). We check for
the occurence of this orbital overlap with the following parameter:
\begin{program}
HandoffManager/Sat set longitude_threshold_ 10; # degrees
\end{program}
Again, the values for this parameter in the example scripts are speculative.
If the two satellites are closer together in longitude than
\code{longitude_threshold_} degrees, the link between them is deactivated.
This parameter is disabled (set to $0$) by default-- all defaults for
satellite-related bound variables can be found in \nsf{tcl/lib/ns-sat.tcl}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Routing }
\label{sec:satellite/usage/routing}
The current status of routing is that it is incomplete. Ideally, one should
be able to run all existing \ns~routing protocols over satellite links.
However,
many of the existing routing protocols implemented in OTcl require that
the conventional \ns~links be used. Contributions in this area are welcome,
but unfortunately it is not a trivial change.
With that being said, the current routing implementation is similar to
Session routing described in Chapter \ref{chap:unicast}, except that it
is implemented entirely in C++. Upon each topology change, a centralized
routing genie determines the global network topology, computes new routes
for all nodes, and uses the routes to build
a forwarding table on each node. Currently,
the slot table is kept by a routing agent on each node, and packets
not destined for agents on the node are sent by default to this routing
agent. For each destination for which the node has a route, the forwarding
table contains a pointer to the head of the corresponding outgoing link.
As noted in Chapter \ref{chap:unicast}, the user is cautioned that this type
of centralized routing can lead to minor causality violations.
The routing genie is a \code{class SatRouteObject} and is created and
invoked with the following OTcl commands:
\begin{program}
set satrouteobject_ [new SatRouteObject]
$satrouteobject_ compute_routes
\end{program}
where the call to \code{compute_routes} is performed after all of the
links and nodes in the simulator have been instantiated.
Like the \code{Scheduler}, there is one instance of a SatRouteObject in the
simulation, and it is accessed by means of an instance variable in C++.
For example, the call to recompute routes after a topology change is:
\begin{program}
SatRouteObject::instance().recompute();
\end{program}
Despite the current use of centralized routing, the design of having
a routing agent on each node was mainly done with distributed routing
in mind. Routing packets can be sent to port 255 of each node. The key
to distributed routing working correctly is for the routing agent to
be able to
determine from which link a packet arrived. This is accomplished by the
inclusion of a \code{class NetworkInterface} object in each link, which
uniquely labels the link on which the packet arrived. A helper function
\code{NsObject* intf_to_target(int label)} can be used to return the head
of the
link corresponding to a given label. The use of routing agents parallels
that of the mobility extensions, and the interested reader can turn to
those examples to see how to implement distributed routing protocols in
this framework.
The shortest-path route computations use the current propagation delay of
a link as the cost metric. It is possible to compute routes using only
the hop count and not the propagation delays; in order to do so, set
the following default variable to "false":
\begin{program}
SatRouteObject set metric_delay_ "true"
\end{program}
Finally, for very large topologies (such as the Teledesic example), the
centralized routing code will produce a very slow runtime because it executes
an all-pairs shortest path algorithm upon each topology change even if
there is no data currently being sent. To speed up simulations in which
there is not much data transfer but there are lots of satellites and
ISLs, one can disable {\em handoff-driven} and enable {\em data-driven}
route computations. With data-driven computations, routes are computed
only when there is a packet to send, and furthermore, a single-source
shortest-path algorithm (only for the node with a packet to send) is
executed instead of an all-pairs shortest path algorithm. The following
OTcl variable can configure this option (which is set to "false" by
default):
\begin{program}
SatRouteObject set data_driven_computation_ "false"
\end{program}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Trace support}
\label{sec:satellite/usage/trace}
Tracefiles using satellite nodes and links are very similar to conventional
\ns~tracing described in Chapter \ref{chap:trace}. Special SatTrace objects
(\code{class SatTrace} derives from \code{class Trace}) are used
to log the geographic latitude and longitude of the node logging the trace
(in the case of a satellite node, the latitude and longitude correspond
to the nadir point of the satellite).
For example, a packet on a link from node 66 to node 26 might normally be
logged as:
\begin{program}
+ 1.0000 66 26 cbr 210 ------- 0 66.0 67.0 0 0
\end{program}
but in the satellite simulation, the position information is appended:
\begin{program}
+ 1.0000 66 26 cbr 210 ------- 0 66.0 67.0 0 0 37.90 -122.30 48.90 -120.94
\end{program}
In this case, node 66 is at latitude 37.90 degrees, longitude -122.30
degrees, while node 26 is a LEO satellite whose subsatellite
point is at 48.90 degrees latitude, -120.94 degrees longitude (negative
latitude corresponds to south, while negative longitude corresponds to
west).
One addition is the \code{Class Trace/Sat/Error}, which traces any packets
that are errored by an error model. The error trace logs packets dropped
due to errors as follows, for example:
\begin{program}
e 1.2404 12 13 cbr 210 ------- 0 12.0 13.0 0 0 -0.00 10.20 -0.00 -10.00
\end{program}
It may happen that a satellite node generates a packet that it cannot
forward (such as in sat-mixed.tcl). This will show up as a drop in
the tracefile with a destination field set to -2, and the coordinates
set to -999.00:
\begin{program}
d 848.0000 14 -2 cbr 210 ------- 1 14.0 15.0 6 21 0.00 10.00 -999.00 -999.00
\end{program}
This indicates that node 14, in trying to send a packet to node 15, could
not find an available route.
To enable tracing of all satellite links in the simulator, use the following
commands {\em before} instantiating nodes and links:
\begin{program}
set f [open out.tr w]
$ns trace-all $f
\end{program}
Then use the following line after all node and link creation (and all
error model insertion, if any) to enable tracing of all satellite links:
\begin{program}
$ns trace-all-satlinks $f
\end{program}
Specifically, this will put tracing around the link layer queues in all
satellite links, and will put a receive trace between the mac and the
link layer for received packets. To enable tracing only on a specific
link on a specific node, one may use the command:
\begin{program}
$node trace-inlink-queue $f $i
$node trace-outlink-queue $f $i
\end{program}
where $i$ is the index of the interface to be traced.
The implementations of the satellite trace objects can be found in
\nsf{tcl/lib/ns-sat.tcl} and \nsf{sattrace.\{cc,h\}}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Error models}
\label{sec:satellite/usage/error}
\ns~error models are described in Chapter \ref{chap:error_model}. These
error models can be set to cause packets to be errored according to various
probability distributions. These error models are simple and don't
necessarily correspond to what would be experienced on an actual satellite
channel (particularly a LEO channel). Users are
free to define more sophisticated error models that more closely match a
particular satellite environment.
The following code provides an example of how to add an error model to a
link:
\begin{program}
set em_ [new ErrorModel]
$em_ unit pkt
$em_ set rate_ 0.02
$em_ ranvar [new RandomVariable/Uniform]
$node interface-errormodel $em_
\end{program}
This will add an error model to the receive path of the first interface
created on node \code{$node} (specifically, between the MAC and link layer)--
this first interface generally corresponds to the uplink and downlink
interface for a satellite or a terminal (if only one uplink and/or downlink
exists).
To add the error model to a different stack (indexed by $i$), use the
following code:
\begin{program}
$node interface-errormodel $em_ $i
\end{program}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Other configuration options}
\label{sec:satellite/usage/other}
Given an initial configuration of satellites specified for time $0$,
it is possible to start the
satellite configuration from any arbitrary point in time through the use of the
\code{time_advance_} parameter (this is really only useful for LEO
simulations). During the simulation run, this will set the position of
the object to the position at time
\code{Scheduler::instance().clock + time_advance_} seconds.
\begin{program}
Position/Sat set time_advance_ 0; # seconds
\end{program}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{\nam~~support}
\label{sec:satellite/usage/nam}
\nam~~is not currently supported. Addition of \nam~~ for satellite
is open to interested contributors.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Integration with wired and wireless code}
\label{sec:satellite/usage/integration}
Recently (November 2001), support has been added to connect traditional
OTcl-based wired nodes with the satellite nodes. This section describes
the capabilities and limitations of that code.
The satellite code (and the wireless code) normally performs all routing
in C++, while the traditional ns code uses a mix of OTcl and C++ code.
For backward compatibility reasons, it is difficult to fully integrate
both the wired and wireless code. The strategy for integrating wireless
and wired code has been to define a special gateway node (called a
"basestation"), to use hierarchial routing, and to locate a single basestation
node in the wireless network with a network stack located in both the
wireless and the wired subnet. Because routing is not fully integrated,
the topology of the simulation is limited to only one gateway node per
wireless subnet (i.e., a packet cannot enter the wireless network from
one wired gateway and leave via another).
The satellite/wired code integration takes a different strategy. By
selecting the node configuration
\code{$ns node-config -wiredRouting ON} option, the C++
routing in the satellite code is turned off, and instead, all satellite
topology changes lead to upcalls into the OTcl code. As a result,
the \code{link_} array in OTcl is manipulated according to all topology
changes, and OTcl-based routing can occur. The penalty for doing this
is a much longer execution time for larger simulations (such as Teledesic),
but for smaller simulations, the difference is not as noticeable.
An example script detailing the use of this new option is shown in
\nsf{tcl/ex/sat-wired.tcl}, and a similar test in the satellite test suite
exercises this code. Additionally, all of the satellite example scripts
in \nsf{tcl/ex} directory can be converted to OTcl routing by using the
\code{$ns node-config -wiredRouting ON} option. However, there are a
few caveats:
\begin{itemize}
\item The wired routing option for satellite has only been tested with
(the default) static routing: \code{$ns rtProto Static}. The code triggers
a global routing table update upon any satellite topology change.
\item The option \code{data_driven_computation_}
can not be set to ``true'' when wiredRouting is ON. Note that the enabling
or disabling of \code{data_driven_computation_} can give subtle differences
in simulation output since routes are computed at different times (while
propagation delays are continuously changing). This effect can be seen
by toggling this parameter in the Iridium example
script \nsf{tcl/ex/sat-iridium.tcl}.
\item In the trace file, when a packet is dropped due to ``no route to
host'' (such as when there is a topology change), the trace looks a bit
different depending on whether wiredRouting is turned OFF or ON. In the
former case, there is one line per drop, with the destination labelled
as ``-2''. In the latter case, there are three events (enque ``+'',
deque ``-'', and drop ``d'') corresponding to the same packet, and the
destination is shown as ``-1''.
\item In rare cases, there may be warning messages during the execution
indicating ``node out of range.'' This can occur if a node becomes
disconnected in the topology and then another node tries to send a packet
to it. For example, try enabling \code{wiredRouting} in the file
\nsf{tcl/ex/sat-mixed.tcl}. This occurs because the routing table is
dynamically sized upon topology change, and if a node becomes disconnected
it may not have any entries inserted in the routing table (and hence
the routing table is not grown to accommodate its node number). This
warning should not affect actual trace output.
\item There has been no attempt to interoperate with wireless or
mobile-IP code.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Example scripts}
\label{sec:satellite/usage/example}
Example scripts can be found in the \nsf{tcl/ex} directory, including:
\begin{itemize}
\item \code{sat-mixed.tcl} A simulation with a mixture of polar and
geostationary satellites.
\item \code{sat-wired.tcl} Similar to the previous script, but shows how
to connect wired nodes to a satellite simulation.
\item \code{sat-repeater.tcl} Demonstrates the use of a simple bent-pipe
geostationary satellite, and also error models.
\item \code{sat-aloha.tcl} Simulates one hundred terminals in a mesh-VSAT
configuration using an unslotted Aloha MAC protocol
with a ``bent-pipe'' geostationary satellite. Terminals listen to their
own transmissions (after a delay), and if they do not successfully receive
their own packet within a timeout interval, they perform exponential
backoff and then retransmit the packet. Three variants exist:
\code{basic}, \code{basic_tracing}, and \code{poisson}. These variants
are described further in the header comments of the script.
\item \code{sat-iridium.tcl} Simulates a broadband LEO constellation with
parameters similar to that of the Iridium constellation (with supporting
scripts \code{sat-iridium-links.tcl}, \code{sat-iridium-linkswithcross.tcl},
and \code{sat-iridium-nodes.tcl}).
\item \code{sat-teledesic.tcl} Simulates a broadband LEO constellation with
parameters similar to those proposed for the 288 satellite Teledesic
constellation (with supporting scripts \code{sat-teledesic-links.tcl} and
\code{sat-teledesic-nodes.tcl}).
\end{itemize}
In addition, there is a test suite script that tries to exercise a lot
of features simultaneously, it can be found at \nsf{tcl/test/test-suite-sat.tcl}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Implementation}
\label{sec:satellite/implementation}
The code for the implementation of satellite extensions can be found
in \nsf{\{sat.h, sathandoff.\{cc,h\}, satlink.\{cc,h\}, satnode.\{cc,h\},
satposition.\{cc,h\}, satroute.\{cc,h\}, sattrace.\{cc,h\}\}}, and
\nsf{tcl/lib/ns-sat.tcl}. Almost all of the mechanism is implemented
in C++.
In this section, we focus on some of the key components of the implementation;
namely, the use of linked lists, the node structure, and a detailed look
at the satellite link structure.
\subsection{Use of linked lists}
\label{sec:satellite/implementation/list}
\begin{figure}
\centerline{\includegraphics{linked-list}}
\caption{Linked list implementation in \ns.}
\label{fig:linked-list}
\end{figure}
There are a number of linked lists used heavily in the implementation:
\begin{itemize}
\item \code{class Node} maintains a (static) list of all objects of class
\code{Node} in the simulator. The variable \code{Node::nodehead_} stores
the head of the list. The linked list of nodes is used for centralized
routing, for finding satellites to hand off to, and for tracing.
\item \code{class Node} maintains a list of all (satellite) links on the
node. Specifically, the list is a list of objects of class \code{LinkHead}.
The variable \code{linklisthead_} stores the head of the list. The
linked list of LinkHeads is used for checking whether or not to handoff
links, and to discover topology adjacencies.
\item \code{class Channel} maintains a list of all objects of class
\code{Phy} on the channel. The head of the list is stored in the variable
\code{if_head_}. This list is used to determine the set of interfaces on a
channel that should receive a copy of a packet.
\end{itemize}
Figure \ref{fig:linked-list} provides a schematic of how the linked list
is organized. Each object in the list is linked through a ``LINK\_ENTRY''
that is a protected member of the class. This entry contains a pointer
to the next item in the list and also a pointer to the address of the
previous ``next'' pointer in the preceding object. Various macros
found in \nsf{list.h} can be used to manipulate the list; the
implementation of linked-lists in \ns~is similar to the \code{queue}
implementation found in some variants of BSD UNIX.
\subsection{Node structure}
\begin{figure}
\centerline{\includegraphics{sat-node}}
\caption{Structure of \code{class SatNode}.}
\label{fig:sat-node}
\end{figure}
Figure \ref{fig:sat-node} is a schematic of the main components of a
\code{SatNode}. The structure bears resemblance to the \code{MobileNode}
in the wireless extensions, but there are several differences. Like all
\ns~nodes, the SatNode has an ``entry'' point to a series of classifiers.
The address classifier contains a slot table for forwarding packets to
foreign nodes, but since OTcl routing is not used, all packets not destined
for this node (and hence forwarded to the port classifier), are sent to
the default target, which points to a routing agent. Packets destined
on the node for port 255 are classified as routing packets and are also
forwarded to the routing agent.
Each node contains one or more ``network stacks'' that include a generic
\code{SatLinkHead} at the entry point of the link. The \code{SatLinkHead}
is intended to serve as an API to get at other objects in the link structure,
so it contains a number of pointers (although the API here has not been
finalized). Packets leaving the network stack are sent to the node's
entry. An important feature is that each packet leaving a network stack
has its \code{iface_} field in the common packet header coded with the
unique \code{NetworkInterface} index corresponding to the link. This value
can be used to support distributed routing as described below.
The base class routing agent is \code{class SatRouteAgent}; it can be used
in conjunction with centralized routing. SatRouteAgents contain
a forwarding table that resolves a packet's address to a particular
LinkHead target-- it is the job of the \code{SatRouteObject} to populate this
table correctly. The SatRouteAgent populates certain fields in the header
and then sends the packet down to the approprate link. To implement
a distributed routing protocol, a new SatRouteAgent could be defined-- this
would learn about topology by noting the interface index marked in each
packet as it came up the stack-- a helper function in the node
\code{intf_to_target()} allows it to resolve an index value to
a particular LinkHead.
There are pointers to three additional objects in a SatNode. First,
each SatNode contains a position object, discussed in the previous section.
Second, each SatNode contains a \code{LinkHandoffMgr} that monitors
for opportunities to hand links off and coordinates the handoffs. Satellite
nodes and terminal nodes each have their specialized version of a
LinkHandoffMgr.
Finally, a number of pointers to objects are contained in a SatNode. We
discussed \code{linklisthead_} and \code{nodehead_} in the previous
subsection. The \code{uplink_} and \code{downlink_} pointers are
used for convenience under the assumption that, in most simulations,
a satellite or a terminal has only one uplink and downlink channel.
\subsection{Detailed look at satellite links}
\begin{figure}
\centerline{\includegraphics{sat-stack}}
\caption{Detailed look at network interface stack.}
\label{fig:sat-stack}
\end{figure}
Figure \ref{fig:sat-stack} provides a more detailed look at how satellite links
are composed. In this section, we describe how packets move up and down
the stack, and the key things to note at each layer. The file
\nsf{tcl/lib/ns-sat.tcl} contains the various OTcl instprocs that assemble
links according to Figure \ref{fig:sat-stack}. We describe the composite
structure herein as a ``network stack.'' Most of the code for the
various link components is in \nsf{satlink.\{cc,h\}}.
The entry point to a network stack is the \code{SatLinkHead} object. The
SatLinkHead object derives from \code{Class LinkHead}; the aim of link
head objects is to provide a uniform API for all network stacks.
\footnote{In the author's opinion, all network stacks in \ns~ should
eventually have a LinkHead object at the front-- the class SatLinkHead
would then disappear.} The SatLinkHead object contains pointers to
the LL, Queue, MAC, Error model, and both Phy objects. The SatLinkHead
object can also be queried as to what type of network stack it is-- e.g.,
GSL, interplane ISL, crossseam ISL, etc.. Valid codes for the \code{type_}
field are currently found in \nsf{sat.h}. Finally, the SatLinkHead
stores a boolean variable \code{linkup_} that indicates whether
the link to at least one other node on the channel is up. The C++
implementation of SatLinkHead is found in \nsf{satlink.\{cc,h\}}.
Packets leaving a node pass through the SatLinkHead transparently to the
\code{class SatLL} object. The SatLL class derives from LL (link layer).
Link layer protocols (like ARQ protocols) can be defined here. The current
SatLL assigns a MAC address to the packet. Note that in the satellite case,
we do not use an Address Resolution Protocol (ARP); instead, we simply use
the MAC \code{index_} variable as its address, and we use a helper function
to find the MAC address of the corresponding interface of the next-hop node.
Since \code{class LL} derives from \code{class LinkDelay}, the \code{delay_}
parameter of LinkDelay can be used to model any processing delay in the
link layer; by default this delay is zero.
The next object an outgoing packet encounters is the interface queue.
However, if tracing is enabled, tracing elements may surround the
queue, as shown in Figure \ref{fig:sat-stack}. This part of a satellite
link functions like a conventional \ns~ link.
The next layer down is the MAC layer. The MAC layer draws packets from
the queue (or deque trace) object-- a handshaking between the MAC and the
queue allows the MAC to draw packets out of the queue as it needs them. The
transmission time of a packet is modelled in the MAC also-- the MAC computes
the transmission delay of the packet (based on the sum of the
LINK\_HDRSIZE field defined in \code{satlink.h} and the \code{size} field
in the common packet header), and does not call up for another packet until
the current one has been ``sent'' to the next layer down. Therefore, it
is important to set the bandwidth of the link correctly at this layer.
For convenience, the transmit time is encoded in the \code{mac} header; this
information can be used at the receiving MAC to calculate how long it must
wait to detect a collision on a packet, for example.
Next, the packet is sent to a transmitting interface (Phy\_tx) of class
\code{SatPhy}. This
object just sends the packet to the attached channel. We noted earlier
in this chapter that all interfaces attached to a channel are part of the
linked list for that channel. This is not true for transmit interfaces,
however. Only receive interfaces attached to a channel comprise this linked
list, since only receive interfaces should get a copy of transmitted packets.
The use of separate transmit and receive interfaces mirrors the real world
where full-duplex satellite links are made up of RF channels at different
frequencies.
The outgoing packet is next sent to a \code{SatChannel}, which copies the
packet to every receiving interface (of class \code{SatPhy}) on the channel.
The Phy\_rx sends the packet to the MAC layer. At the MAC layer, the packet
is held for the duration of its transmission time (and any appropriate
collision detection is performed if the MAC, such as the Aloha MAC,
supports it). If the packet is determined to have arrived safely at the MAC,
it next passes to an \code{ErrorModel} object, if it exists. If not, the
packet moves through any receive tracing objects to the \code{SatLL}
object. The SatLL object passes the packet up after a processing delay
(again, by default, the value for \code{delay_} is zero).
The final object that a received packet passes through is an object of
\code{class NetworkInterface}. This object stamps the \code{iface_} field
in the common header with the network stack's unique index value. This
is used to keep track of which network stack a packet arrived on. The
packet then goes to the \code{entry} of the SatNode (usually, an address
classifier).
Finally, ``geo-repeater'' satellites exist, as described earlier in this
chapter. Geo-repeater network stacks are very simple-- they only contain
a Phy\_tx and a Phy\_rx of \code{class RepeaterPhy}, and a SatLinkHead.
Packets received by a Phy\_rx are sent to the Phy\_tx without delay. The
geo-repeater satellite is a degenerate satellite node, in that it does not
contain things like tracing elements, handoff managers, routing agents, or
any other link interfaces other than repeater interfaces.
\section{Commands at a glance}
\label{sec:satcommands}
Following is a list of commands related to satellite networking:
\begin{flushleft}
\code{$ns_ node-config -satNodeType <type>}\\
This node configuration declares that the subsequent new nodes created
will be of type <type>, where <type> can be one of the following:
\code{geo, geo-repeater, polar, terminal}. Other required fields for
satellite nodes (for setting up initial links and channels) are as follows
(see Section~\ref{sec:node:nodeconfig}):
\code{$ns_ node-config -llType <type>}\\
\code{$ns_ node-config -ifqType <type>}\\
\code{$ns_ node-config -ifqLen <length>}\\
\code{$ns_ node-config -macType <type>}\\
\code{$ns_ node-config -channelType <type>}\\
\code{$ns_ node-config -downlinkBW <value>}\\
(note-- satNodeType geo-repeater only requires specifying the channelType-- all other options are disregarded. See \code{tcl/ex/sat-repeater.tcl} for an example.)
\code{$ns_ satnode-polar <alt> <inc> <lon> <alpha> <plane> <linkargs> <chan>}\\
This a simulator wrapper method for creating a polar satellite node. Two
links, uplink and downlink, are created along with two channels, uplink
channel and downlink channel. <alt> is the polar satellite altitude,
<inc> is orbit inclination w.r.t equator, <lon> is the longitude of
ascending node, <alpha>
gives the initial position of the satellite along this orbit, <plane>
defines the plane of
the polar satellite. <linkargs> is a list of link argument options that
defines the network interface (like LL, Qtype, Qlim, PHY, MAC etc).
\code{$ns_ satnode-geo <lon> <linkargs> <chan>}\\
This is a wrapper method for creating a geo satellite node that first
creates a satnode plus two link interfaces (uplink and downlink) plus two
satellite channels (uplink and downlink). <chan> defines the type of
channel.
\code{$ns_ satnode-geo-repeater <lon> <chan>}\\
This is a wrapper method for making a geo satellite repeater node that
first creates a satnode plus two link interfaces (uplink and downlink)
plus two satellite channels (uplink and downlink).
\code{$ns_ satnode-terminal <lat> <lon>}\\
This is a wrapper method that simply creates a terminal node. The <lat>
and <lon> defines the latitude and longitude respectively of the terminal.
\code{$ns_ satnode <type> <args>}\\
This is a more primitive method for creating satnodes of type <type>
which can be polar, geo or terminal.
\code{$satnode add-interface <type> <ll> <qtype> <qlim> <mac_bw> <phy>}\\
This is an internal method of Node/SatNode that sets up link layer, mac
layer, interface queue and physical layer structures for the satellite
nodes.
\code{$satnode add-isl <ltype> <node1> <node2> <bw> <qtype> <qlim>}\\
This method creates an ISL (inter-satellite link) between the two nodes.
The link type (inter, intra or cross-seam), BW of the link, the queue-type
and queue-limit are all specified.
\code{$satnode add-gsl <ltype> <opt_ll> <opt_ifq> <opt_qlim> <opt_mac> <opt_bw> <opt_phy> <opt_inlink> <opt_outlink>}\\
This method creates a GSL (ground to satellite link). First a network
stack is created that is defined by LL, IfQ, Qlim, MAC, BW and PHY layers.
Next the node is attached to the channel inlink and outlink.
\end{flushleft}
\endinput
|