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
|
msc=omegapple;
defproc procedure {
msc+=hcn;
|||;
->gw.f=>bs1.f==>ue [pkt]: Downlink packet;
note at gw.f: TEID=1 added;
note at bs1.f: Tx over radio [note.pos=near];
<-gw.f<=bs1.f<==ue [pkt]: Uplink packet;
note at bs1.f: TEID=11 added [note.pos=near];
note at bs1.f: Rx over radio;
>bs1.cnc: Handover trigger
\-target BS;
bs1.cnc=>cnc: HANDOVER
\-target BS;
cnc--cnc: Decides on new chain
graph and site mapping;
cnc--cnc: Decides on new UL/DL
TEIDs for target BS
\-UL-TEID(GW)=12, DL-TEID(tBS)=2;
cnc--cnc: Decides on new ids for PP contexts
\-HB, PPx in tBS will be by id3/id5, id4;
.._gw: Set up UL reordering {
cnc=>gw.cnc->gw.h: INSERT to HB(id1):
\-old TEID=11, new TEID=12;
activate gw.h;
cnc=>gw.cnc->gw.f: INSERT:
\-TEID=11 or 12 => add HB(id1);
gw.cnc=>cnc: INSERT ACK;
};
comment: Uplink packets arriving on the new path
are held off until all packets from the
old path have passed.;
cnc=>bs2.cnc: HANDOVER REQ
\-from (sBS with UL-TEIDin=-, DL-TEIDin=1) fetch (PPx(id2), ...)
use UL-TEIDout=12, DL-TEIDin=2, PPx(id4), HB(id3/id5), ...;
..:Set up reordering {
{
bs2.cnc->bs2.h: INSERT to HB(id3):
\-old TEID=11, new TEID=-;
activate bs2.h;
bs2.cnc->bs2.f: INSERT:
\-TEID=11 or - => add HB(id3);
};
vertical brace: uplink [number=no];
{
bs2.cnc->bs2.h: INSERT to HB(id5):
\-old TEID=1, new TEID=2;
bs2.cnc->bs2.f: INSERT:
\-TEID=1 or 2 => add HB(id5);
};
vertical brace: downlink[number=no];
};
bs2.cnc=>bs1.cnc: Forward & Take context
\-Forward: UL-TEIDin:-, DL-TEIDin:1 to tBS
Take context: PPx(id2);
bs1.cnc->bs1.f:INSERT:
TEID=- or 1: fw to tBS;
->gw.f=>bs1.f[pkt]: Downlink packet;
note at gw.f: TEID=1 added;
bs1.f=>bs2.f-bs2.h [pkt];
note at bs2.h: Buffered;
bs2.h<=bs2.f<=bs1.f<==ue [pkt]: Uplink packet;
note at bs1.f: TEID=11 added;
{
bs1.cnc>ue: Handover command;
mark $$~ue_switch_top [centerline=yes];
bs1.cnc->bs1.f [pkt, color=green-30]:EOT packet;
bs1.f=>bs2.f-bs2.h [pkt, color=green-30];
note at bs2.h: note last pkt
on old UL path [];
};
vertical brace [side=end, number=no]:
\-Can happen in parallel
to context transfer;
bs1.cnc<->bs1.p: Extract context;
bs1.cnc=>bs2.cnc: Sending Context;
parallel bs1.cnc--bs1.p: Deleting flow entries;
deactivate bs1.f;
..:Set up target BS {
bs2.cnc->bs2.p: INSERT:
\-PPx(using id4);
bs2.cnc->bs2.f: INSERT:
\-TEID=1,2,11,12 => PPx(id4);
activate bs2.f;
};
bs2.cnc->bs2.h: Release buffered
packets;
parallel bs2.cnc=>cnc: HANDOVER ACK;
mark $$~sw_path_top [centerline=yes];
bs2.h=>bs2.f==>ue [pkt]: Downlink packet;
note at bs2.h: reorders old and new paths;
bs2.h=>bs2.f [pkt];
bs2.f=>gw.h [pkt]: Uplink packet;
note at gw.h: reorders old and new paths;
gw.h=>gw.f [pkt];
gw.f-> [pkt];
cnc=>gw.cnc->gw.f: UPDATE:
\-DL TEIDout encaps@IP (to 2 & iBS);
mark $$~sw_path_bottom [centerline=yes];
vertical pointer $$~sw_path_top>$$~sw_path_bottom at cnc+;
gw.cnc=>gw.f=>bs1.f [pkt, color=green-30]:EOT packet;
bs1.f=>bs2.f-bs2.h [pkt, color=green-30];
note at bs2.h: note last pkt
on old DL path [note.pos=near];
->gw.f=>bs2.f==>ue [pkt]: Downlink packet;
gw.cnc=>cnc:UPDATE ACK;
ue>bs2.cnc:RRC connection establishment;
mark $$~ue_switch_bottom [centerline=yes];
mark $$~ue_switch_bottom2 [offset = 0];
vertical pointer $$~ue_switch_top>$$~ue_switch_bottom at ue-;
parallel gw.h--gw.cnc: \-When buffer empties,
it is removed from path;
deactivate gw.h;
ue==>bs2.f=>bs2.h [pkt]: Uplink packet;
note at bs1.h: reorders old and new paths;
mark $$~ue_switch_bottom3 [centerline=yes];
vertical pointer $$~ue_switch_bottom2>$$~ue_switch_bottom3 at ue-;
bs2.h=>bs2.f [pkt];
bs2.f=>gw.f-> [pkt];
parallel bs2.h--bs2.cnc: \-When buffer empties,
it is removed from path;
deactivate bs2.h;
ue==>bs2.f=>gw.h-> [pkt]: Uplink packet;
};
hspace right comment 120;
defstyle comment [text.wrap=yes];
defstyle arrow [arrow.midtype=dot];
defstyle entitygroup, box [fill.color=lgray];
defstyle entity [vfill.color=lgray+20];
defstyle CP [fill.color=navy-40, line.color=navy, vline.color=navy,
vline.width=2];
defstyle pkt [line.color=blue, arrow.midtype=dot,
arrow.color=blue, text.color=blue];
defstyle ==> [line.type=triple_thick, line.width=1.5];
defstyle => [line.width=2];
defstyle -> [line.width=2];
ue: UE;
_bs1: source Base Station [fill.color=lgray+40] {
_bs1.dp: Data Plane {
bs1.p: PPx tables;
activate bs1.f: FlowTables;
bs1.h: HOBUff;
};
bs1.cnc: Local CNC [CP];
};
_bs2: target Base Station [fill.color=lgray+40] {
_bs2.dp: Data Plane {
bs2.p: PPx tables;
bs2.f: FlowTables;
bs2.h: HOBUff;
};
bs2.cnc: Local CNC [CP];
};
_gw: GW site [fill.color=lgray+40] {
_gw.dp: Data Plane {
gw.p: PPx tables;
activate gw.f: FlowTables;
gw.h: HOBUff;
};
gw.cnc: Local CNC [CP];
};
cnc: CNC [CP];
comment: Packets processed by a DP node are
shown to pass only the flow table
and not the PPx tables. This is just
to simplify rendering. Packets in reality
are also processed by PPs.\n
Gray bars indicate DP state kept for user;
replay procedure;
replay procedure;
|