[PATCH] user/tools: Add RTEMS TFTP Proxy command documentation

chrisj at rtems.org chrisj at rtems.org
Tue Feb 18 00:16:04 UTC 2020


From: Chris Johns <chrisj at rtems.org>

---
 images/user/tftp-proxy-1.png  | Bin 0 -> 15339 bytes
 images/user/tftp-proxy-1.puml |  34 +++++++
 user/testing/tftp.rst         |   2 +
 user/tools/boot-image.rst     |   2 +-
 user/tools/index.rst          |   1 +
 user/tools/tftp-proxy.rst     | 166 ++++++++++++++++++++++++++++++++++
 6 files changed, 204 insertions(+), 1 deletion(-)
 create mode 100644 images/user/tftp-proxy-1.png
 create mode 100644 images/user/tftp-proxy-1.puml
 create mode 100644 user/tools/tftp-proxy.rst

diff --git a/images/user/tftp-proxy-1.png b/images/user/tftp-proxy-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..e6f4b5535e409b585e0e9ed1ff379278ef76ea94
GIT binary patch
literal 15339
zcmZv at 1z40(*DkCef<p_)&>~7m4Ty9osdNcQ4&9B2q(e)JG)T9k(nyS?lysMLclW;s
z-}gJ`Kj(09!OSyz_OoN{b>Hh=>-nT8FNF&shupe#3-|RaaphaL&|ciSbz2n+4O|gZ
zC$<Own4BauoD6O4K3Ex>INg#mwlQ|lcQQ75Xz<~onUj+pKRdgfmA;MBJ8LU8LtAS?
z7#}6*q1jwj!|A`*Z`}snxP0~aA{U+rBk<pjIl-rsx4U(FEn7!^Vnb@;jiS;+zKtiG
zu+RdGMDj>Bt;2>9JX-xBi<Xw;4@*h!cP5>Jq=$IQC03}by`S`Zg!=u(D)UKa%ocBy
zW=byMoV_B+XR4QfYh>`lI6~raOprt2tvq6O^ot5CB-Z$;SaO*D1aaAtQH03;qw^z*
zg;Ay`DRHWBTXB=CnCGl1n~~j9ueWfLFZokO?g`>v<X9?9zrWt}2*50ma9h)fpGX|G
z94BF1{LC4+VZIO_<$ODt=MM(Qs66y!3ERiTeslZ*N8t=Z$lQ5z-0o#(7x_=cm+n+|
z(gfz&_OGxd9d|gpDRFv&cz);4r++TX*0%maLaFF1Yln5o7|2EaAlIzQj{71$SdUV=
zuT1t at vxVI0)BY2kmkh3NAE_3od?BgpUu64`i3wRxreM44=(yMHx8VtC6cT|kxn$6I
z3)(~ydKZft7b;4*?Ecc?#2}O2gjBRM)=*Kkj?YPnj7q5M66!{5pGD*uxZ{td@)Ug1
zZ*jR6-P*z2w9NV$o!-9+<v#T}{#0<_f8dI3 at Iv0k@8~gRQs-~IOvGjPEed?*TetWM
zUyHv~bs67G!d4}IpS(TB;j91bQ-Z!mn7&X!z7mh?P at jujt3BB}t`Od4OkJl>4wQ2V
zZ`#D?aYv-S?jmepU(6`EBwI)y28F_XU$`)SzXuDH_6~|W!U)Pu&HXLr*zldR{P|_B
zXRnj`J1>!CuQSz={CuzLw&m;MZ(DmO$poTUO0?8Cw`qL|AR*vQ8WQWjFEJ#+OGUUZ
zxQdZ2tGTv4ycEqj7Nbc{9xqo!YW==b`0#EFn&W##_eep1 at PW-jEN7xN`}kIj#~LmR
zh9u%rvHVYKQGU0K!4JVCorXWVXpR$B4t8Zz4CjN?8jujQ^E8VzMiEbU at Af?>A)faC
z>+=kxRq<(FABCfXLr`!qGc)u0+FG1k5ux>aqBvJ{8H5s?IBxT~i2WEQdFb8fhJu2E
znwo^M1 at b;;9z-5b2{9B5VoZ1cy+on>t5>gNWCkqC`IEx_j|S!WOWTvx&-nPr>P9*`
zq)j3%#V2qvvip(B at S6@e#&7;9!L5|z<*ZDZV4~o at sMo|$Fa*Mi5MpRXx27a&Fi;|l
zR_7QrI$~&kjPBmfPDv*}aom>-(@iBMI8{^*=x6B+ZU6J%)zheynI6;b1P!f3F$9ww
zJg{qL79Dpv9J(vRVdfl?9B_{jmRPEgs*;m(awaU|byfEBeFJ9=@jJWOMjmRx6HRtk
zK0YnUF!!;}_0>N~Ufj02aZZk4MIH4JuV>WMP1E*pD27weR8o<;uB&>%LC!L!F;N?v
zGYvV0-WBiG&mEU!(~wqwgzYtR&IP#+DhF~fDRf+q3QR6e2nh)rMkbo7>>K`c1X)_1
zGY^uG at zDxiyuVonGIQ<TPNEzY6+=uM7edEgYwg+-{J9HebxsC3^2N<fKYK03-r`Ij
z?lPy_x2H;87wb;(*y>t1xx+0gH82wm#aJ5Uowu~}M*NRfcF}|hi$_bH^6T6(F!8s7
zC3qi~;q}jR9KQWVG>Sl97ZpXzdbaC4Q-94(GW*i!?BT<ypXb&SM-29UxD?Z3G&DjU
zr=Qod%F4nIg*EBFo$zL0d_*G}sB_aKR#lOqAcr((NoI`nD?cjCyczpt?voHCShTk;
ziSgC<GQJZr+~@Gv)Z|VmIi5**!qRB=_hi at Q08=S;+KpXw1C}l%QTp!8i8H(5bm>+$
zZlZeplmV5!W39p2-(UEC5}!U<wn&UVz}?!K%5N@&v+Fx~U#%9rC8AX?P08X%%#zF(
z1_k*vQp)}<<SLnKo^7J|%WCu)_AQz3nYgxoqwh?r2N#91`BRq3=gu3<bFW!Xa~ps3
zQ#K1T!J2~nmB*<OIyF%UT`XY3O7JtM^&@Om{N1ylQEkX!hgmtIHQD2cOrLynyf0&-
zSt5?xO4ryq_}$)Kg)|Q-`vttGUjkT&Ki(#TP1b-18=LD%$*YYN%@dNrN3az^P6uxo
zX0ktP2n1(_pPBj3iu|{4{VkQ8w9(1ijng($9V0(?OrCyoJ&$^D3nGidR6}S$BV%iB
zyh!VW)l8k%w<4E9UF&+N4J<ALc_0NJ$j10Y<!tssHaS`09%+1wG_U6c)&WsVa8ILq
z!QGVCQzoOe9UBh at ToZ$Jl$wM(50qI?S)N01%#j~S`<h-f`c6Nx7iCw={-H&mDf+Fj
z`z0n?R^!g&(!AUb;#<?rv}iLjJq|Lqb1(26zya8r8c29Lk>Y-zg!q7Y+V2%uAIWc+
z{_H)1^Q^KN{N-g)&?y3)!)WGZxbbQBKrYhA+44Q2-91Jc!~Z3eocHnW!nZy)(Q}NW
zzrRN2TQ4<v$#P?j(xnmcg=Wy&`m?oLsx&fNj(u8Xo|ixAr0Q9Ol5Tv>=!}kTOtRO&
z&rs2E-`CrIM8_HL at 7^1bRIrO5FYICxXH>E6=~oHNu8-|9%~OSoGG;EHg-G%~bBr9@
zh`Gn4Y_?*XW$JS%Pn!_*bT2rEfVFz6(sE=OXFED}2F78}+Q^LehY<$Wbiel}ub{Q&
zXBQt^`9BXt8d7L at OYknuGQGVwiRdpRH3loU8?bl^SDjMusVCJZ!>6BLOxK~~pez)^
zWB*mKT47R~(sW~rVk)BzyYW%&-8)WAl%;5qr!0q%uE9qcJoehvUrvX$(j?zMBI^IJ
z-`M<{f<8VMg7IRK!FCQ7?J+ysKxBJf_SmtH^<!Pv)kQGa=1Cd2t4O;0a?<r@=iOfJ
zdm<^~jlQGB>@1T*4PFXX-u`=$3h9~8?be5nIf#OLT`m{dgN1}rI193}fnh4<e@`o^
z?weToj;G7PI>4{7_m+(XHY+>- at isez>~US_^v;M*w&>GqF_ZY*t<ham4osz6jIfLd
zDTWspzp|dh2NNdh>IO3GFu@>Qau~yXtBJOFaN-uPWfd3hUG{Tr_Vb&iD}B=amF&^v
zAf8)VxcQN%-i?Jq0oX96TRfpJYRT;c9+O%~S23xM5mr%33{697l#ga|CNjbRn9*60
zF~KAg%TZ>{2&0FDYyuo(gsHJ|=XHU1;3}4uBqXFS8;R<&#5fZPwZ6H`2;<HphEBYN
zgebxbH2<IIz{Xrsx;~P|$SnBAt6qx_(<hKm7yj)xJ!xQt=#OnpXEYR=?7s<auULR1
zIL5y{xPcdef&N|>x(3x(00xO-JwEmqbVc><AG at _)=A`49n@;B3yLZpr++4FzEoY$G
zgqu|(;^2VUhQ#`bk)G&vyBnsQKAZ_=z_j9J&P7hVm=t8xL$OVdgQqe`ORE+Lol^rp
zIy#$Q#>&>46z+RSR$G at PMS6Ts{356~cKGWqYDr?0wY5V;L&7wEaE_JptmZUGPgkh$
zN%?Bf8U$(?8yoBBB*~Zz)Q?tqu-`#_{fo!Bq{NonrU)5WB8}TY>@{%BLT;%%Gs!N&
z3q9s2N5MdnNB&i5Gp@^jsA9XayAD&ba85*QD6HE|XGjI^9}8Vt3{RuufR!(}mBbze
zPm)*9Q<c8 at 5+`hz;1GuSU9_2iNA)}apQgr$J9<m_;Pg6qwxZA3{m6r3D}0P-#u&_a
z&Z6x3b4&NuNxlq2M#|R3OTIP+DGt1_*{kUBD7K894n;+HGX_(9-O)jRcZg5ZiH(%2
zQZuCW7stavmT6+B{af;meC11T7_lKEBaAd-_ktv}CobmfCk_UNq;^afVpje6X^4+u
z?qr-cKaan?-7V06H2ZaweJV1L+3|yy{PapS`20m=huYBX$)|a|la2<K^XUHGXmmxg
zS}KkSUUu`R%%Ha=P9xlSL^9d at 3k2cFG8j$mupFWqXJ{3JV03<%`{oM at 1LcXelba>=
zXc$W$XGaRZKw1%KbX$$z|6;tcX9^LMQlYFqYaCW>O`8V;3Tf=(1+xpy?Pl&?;fc0i
zF$;R6=3YscWWVxoJRt%9`0H=%8ZbqHu!DGIb-OQM$b+4$S&1?x#m1D3usP>c{l#ih
zh-}^Dz)<EH#%y#NnA5~=Rr#h}&!^fmIYb`ul|wul9i^{5!7zf-!`kzm>+N~?`yx|P
zs?}$H4cghrKrQ^n{tF*ItaV-obkh;Q8}XdkE923dW?`ra*~l%nE_jcSa^Mli1 at RJ<
z2H at ub-g!DJxuDwca5_*Hk>>}Ny7s*f8r_0ay-sy#_yriFsQtoP<hCbja=sU%Swklw
zvkwdC{x(pK#U|jeZcn8mvHECy&6{Fic+Lz$4}BSaZoHCg$fN922JNX<`uCj0A+oco
zEm=EC&csk!$-gP-%5Z7PlNsFPm24yyN8|i(MTn<LvBe%4M8MmA^OCtdMC|<KHpGJk
zwcO3TvB%3h)f-2~Gb+V9FN2+#;`Q*nA|o=9SP|&mch0MwAGaGa`t-^t6iqe1sHoqd
z6nlvveAHI>B?!z)xF8-)1+N-Ws=z*VGlRGsCz}vI5n`Qki#KLwxo(p8^aT0&H9eC8
z-W at XONOGvfG<Oh_zNcxYgia3+c0tD}#ULS7gmNP`>0@<{k_-)+j*g|_;XN(Eq*KqN
zN!he_4i6;=jE1Xo@?Ya)=@+nkiq1=Ssah7F<(6;lt$- at Sn>TZVWZH4RvU+v9j}+<X
z>+5@||Gn~`PLPRZ^H{nUOv=t(&f``%kZj1v&Q2rbT2@(E+0fwS?p_PqKiZra$d=pR
z+glqiUk at VjIu6i^q?a2nH4T4)W?0bG+QBHLm&mRgVT at xPOp75o8Bsv{Y+-xph2 at to
zUku8mWoA5&#!TrXL#j at Fk;oUd&nKI8*UOfnf4=e!WJraFgoH?iQ%_ad8&21LXuMb*
z$dQtiOkbWD9OSYbF4&x?3{HH^z_9*2FZ)ibMto>A?M%_+UBst4#@1ec)Wqbf-zZ1)
z8%K3*Oa6SntqaI$1!o5R^78e`1g9(xjqs!$kz1i*6Gxz>q_}us9h_+eJA>(TH$+Wk
z;CBRFi^NE=o)iHKA=J>ATg`PaHc4h5-=@Yna<O{})q5cyN%`xg6gNR3A=bRE>FMbe
zL&!iJQmaXBqdW|^?P1Yawc~PC6|abhNZG@*w6sdw8Ez}ZUiRU0ZI)<Tzh{{K&%kC%
zOUqp91YYl5QO58j8oojhzRxMlBdhzncHn)4CA(eNSGZ9wFA)CHb<JeF%)IepXUDGA
z+7*rdpd#8<(PCfP5#98e+Aw#$Bu!i+7?rO^+Z#F0Z+f5mM8qIiSS1TlVU2Fh{qHh`
z^uA}k7~y4M!LjXoJ6&c@#Q$fG{^V>g$4MN)p=M(E#DU%f- at nk`3$qETNeyi3GYwM`
z1zlYXo3};G*RNI;oa;LH|0XBz7Dfw$DJ~6$zHoQHI9MHMseJwV^&aVv#J`>t)$NqG
z`$;<!%Q?UyIHl<&6`pjQs~#1vI|ZmjL at x`|iuV)vVKZ5!?;;gbm0dS%-ougloj_qq
zTv9R!x9uyRV+rk99~l{0o$DdL*Hvv*;n+k1s`Hphv}t88(xaMW9U~_u!`~At_rCiH
zm^$TozI0W<wzRfBJUpzkoAoYpkS1Ja*R360u{Gc~NIIfy`t~Nj#(8sXanaAS$VG_?
zH`Ff6<6xz4adC03Bj%z+mH1|pt>wDG+1;Oro{)9Ugo<5#jwhI?syYvBH4T}rPAaz?
zsTtzKt$U`)!NIY&9(ZHn(i9b$Mn{^b at 1SCpXC1`Q?+g-z%zKhOi*&3kQcq!znt%u8
zxVV3{^BDxvqbb9!m~X{QR0}?t0{jqACW-w*P0-lpc^?wu#L^fUUq2D?M^U2 at Y~io<
zU??V;1!oy~3WxhJX&N$+?uAxlzwuyqql14V3(NxrOD|1)gMQoz;2`!zqr(%eN)vPW
zjRE4ft$S(2`ky-#!5w*{f}ZaNxXHU~sP_PD<F;E4!8 at vnifg&~5b<Tq64+to;EXXC
zj^$=FHG#p&fQu;b_Pp}7b;7m>+S8Y^h_`=$&nt<&$XEh8Kp-7sn6`(z1F;vSB;swO
zkdE9pJ;l>K1u}>zf^ZrA9Tjl=`X>%yO^mS8qsGzvr)+*{4~d~l5XD$-t9$p`^oiq`
zw)FCZCLJGnVJI-d(wpr^0boG`$b?(llV<VbG1fZ&=x at B!w|px05`3%}aBulOA0E-H
z-fKjn-(sy{vLal3wQO*vo0?mNqQZ9s+=v4W>h>mwv;+ob%t)1sJr8@#AA;7D+quKx
z0Hg}>K0E<ozMuwtM at Ph)mMk;(R<0=Z?~<T#?!8%8DCN at 9^}uWengB^TlhDIVfa${+
zU at mXMn#%NLI5GWy?t5L;q#-|V`^|Qi26Qi68-eZ0t!GGHqM5u(cJc7=NQRs~a-R5w
z(Em^*DkkRR&i!2HXZ&*`NwA47M{xjjNpdxaig(Ed{wxQi9UdssUN7xVo>O}WYWrQd
zS4*W}dG)!?Z601wf!zySx3fQv0Ayr*e}Um8oW|ooss7vVGcy56_~{x0H at BKDy!=Df
zO7;%^(mlXA2)OKk^+Q9)hJ{G)(2JlcE>${*TEh2suWh9GH{N~l!t3M%omx6vOIr_r
zCL1q#!hJDCjFEi at At5ETys$t_N~*4=Has+RFIZl}x?_ds at DCZ43@`W!GuX=%%4j}V
z?drH3MD`t;R)tl(WCo(Cqod<ne!kY)_5*+RHqr&$0APJvjqUG6<PWh$=Zn}7uWe0t
z4h}Yk@<#$_JXh4vf`fvj|0}eZ?l%B$V6Zv~z4CYl?&4<u!7B`$uf=eG<uIi0>O`e&
zfUhr>>5vh(Ib$&x&rtN83diL?3kwTfajZ-YP)GY?!Wbj4Kkvm|nkDTQEM#of6%&x2
zb~}rmF6-Od>^ccwzU-~#7rVN-VOvfQ3~d}!2)LivZ8N|h@$jf?h;VY=U&kTmdNoO#
z&4Ic99aGkfi`<^DqVel5A57+#@blJd()z)6AH5PBB7m&yg`xOi80^2vIh!`vlSmk0
z`e8XaIZozq_`_!UqMerHOA4X8cQ7#Yo1Fn~m4zp5Y*?{a*w{P>DL3wXP}`E9nmar^
ztn<@Z-?h>A-kj%BcVYmaNsoqe8S(+UM%2#UVCGfY*trT&vEF_J8#<ZP5!w!RbWdSY
zF%`+CTWiLPCIEb(Q>49^7cRo%e6zAqOBPNQ($p;Ev^hRBGIHGLhb=5D9M?+O<#n(^
zXd)U4ei{>|0OSqk4IHkIBr%rU3iq14+$cW2+bunv7#A5Sh9E?Fct8c^_VHt?>0X?U
zAaUAEk;i#n7r|{W>XKaC+=6ZKsrY^QJUu;K<P;Q0m)Uh{R4Kn+9u|AG0MD6`bTSoQ
zOIkW+*qiXli=YSu+rSJKygoNH>6*W%H4q&9`QCPwPbdTJJa2ixO-MI}aI}raD}?X%
z?b|K@(ldCk_ZB-(0s-vHUau;6HTIvJxa7F6S7a}x2a;gA)^9EEs_fF^p&}>W6-Rm#
z1psQZ^UKj6aJx483F#ysf4~uXw-&XdwoPpC;X`$7ta_!*RFPgon7VARrMLZjtNvoX
zdNCe37glgWV$#lW)%!myoM&>ZVcJP<3)rhVfv6Y{i(|~pfQ$a}LxD6#OkyH7B9ux%
zt?HAQT|cSbh28b^<@qs(f767o at 15Ef=4`jawI{mA_qPOzZDz3W@!ww at lN8B8jyu+;
zBo$B#N-!^IV=ZvH)z+)wF~;`>8|MWa8laE0xVrl3d#oMyqc}dtY$vX}Xz1vE6Duuz
zJMkr2zdqn)WL<3m2PkzWOL+Y-2&EFzs at Z{aD|yS*;0S5@^pcq=b(hR=Uxd};WHz9Y
zl{!oi#SRWWeg+HGPhr6blt)4Xs^j88YT$Zp{%(AY;);ggaF%Sw4~A0<LGbb0Ds{^(
zq7CuN0kc5Y%eZF#H(D*^LzdH1B}1VrCJ}}axjPTY$pJtP0hsf{Cgoq^rRc~9p at 4V2
zcV9*p66j5Vp+?)2r1O0ui!=0zmpyn{v~^!HHQ21=<W at PQd9^H^Fm5($6pOr9p8EQ;
z at TO2&lC`CUT4#iztl`l0mH>1%g3<iy7Y}yl;{3lMP+-t&ql*b70$;g=-0|Og3Moh$
zG%{1U^aim>TwOOXDX<)yB%{X)Hb06rh{DsLy3yCLZ}X8EINP7>_#3Y+&D>c$9z#&!
zxah`17{aY4A)~lE_DW4Q9!WH_`AU6|cIs)~i%B~;>*4#tAd&wzyj?X5!j_y^8?_C^
z0s!EhDHCIT at EuKl9{O&PQOz7cr2x18gLZz^-f$~Jsr7Su(cet8 at LKoNoLADkU;OvJ
z0V*4&5cb3Uuf)w^0x=7+yK!$r|5>@djMe#2i6u4;I{U8P7uF9~&u{KZ$pE{}HL!Y{
zcG-Z)+A>=Jjk4=g<%q!UEt_an%GGBW=*8#i787J%H>>Crg?s_RJF|j5BfTCr<;DoF
zO1e5m1HaO{x{Z2bV}d*BH(N4)haS)^&WxEs!(Z56JtYbEdi`1LhmqJcQ^^R at f460Y
zA-+{bsWzncS95SrR>0Z+(MEwiqKSkA1qo~K220MeqtJg#L-`oCQ&LoKbTrO&{TH|*
z`RXBR!(Z$H4XY*LK4tyrqC3%>>sB{I<kf_uRZ2gF;qdpHc7RYCufAbEx#+H>JreVm
zMoUCK$Ih2)b-*OS0nU95M+1>DG{_h~arL(dgHs4{XK06s#BxsHRnN^qw9iJ?dpQ_R
zSC2LW?1Sj)EyOXD!r{K*>s6N`1^FVvd=Ry*UN0UHkpWBexpUVV9%uX%fWG^4zBObI
zTCs=H<I;pW<u7f$c;k-Ugqvxkt<iNvZkL_+DY$LT%>WYx-}`Zg-puE<@YHYi@~2n-
z?)w?}pJW85tm#NGP;x*s2Mqt1v)y?jS^rg6oBKDb$OtQkusnCAQ&rX0#-SJ*8oKd!
zzGx}|$osJ#seNYfj2}OKtgTtx%vTY<Mlf2GJM_P)F#l~Iiew at FZ<oMjpqispXkflK
zLKVv1QSZSp!0(M$frNazIR<MF;sVS=*vj1_<&!+;mXG)SuxDI${#wTOMC*m3(V@;t
z-0843?DGX>J~yA6+B46Kz`($nPFu!O@|)fmVGLL}d1-0LiHXh)|Nfy8vnKyz7)#S%
z*|<_5{tLO*f)oU?E)eE}_*hw=hy@%?R6Ax>1x)=^$0Z*;_ak+m7{7Y at r`ba1r*J@$
z3hIRTqB;5^>19ts&61j%%j;a<iFojn4KT<*Zq&CU$u8FE+?t*$&NO1r-VJ&OGwsh*
zQqI>uE36ddyP44zBdjT3I|jSp$DZP=SE*wvfv)-bN^joOR5^{7Tz&YU)lv!6YS_{J
z>~Na!fTnsNxNl%o>dWiT7TreIC03{A+cRdl at l9A#a5dgykQV`hcraL(s`m=aUPJ-Y
z7Ov+92kz3YY6JuQv{PYJUPpVb{Lh~cE4sw88Ha$piZ1%iipP0ybNozrgQivI%0_(h
z3)42(5s&)9Zevs(_T6ETQue=-4MU=|b0NP#^Ic*CAi{cGd+~p8NGaalk9#n(+Bfe9
zw0#6Z%!Tw30GBl6SNal=#Grkw0U2<?#ai*_Ya|nO$uF^swOhreZ=%$X1PKcYuH2r4
z=Uz7kiiNSnh4 at t2XDF=85z2>8^8lB6@))I`Ci|56>WLZVRaUB7TjSlB%cLlrEfSAr
z8fG~x4k8tB$`s)i(oh#%=#Ig=cMtw!QbUi~i*tTDd$2uoB)XOkx at mR6<N6;fy)m{l
zplSZk`~R^-V3`CHcaEyc3+cu3akZ2$Ot>&i)Zq7oyc*7vL>RW^{+%etJ9lmMf4|u|
zO9yI3t?s19g2kE=q^kgV6qb?%+YtFub0PW6z{LFGrEkQ|o`(@Z6Q-Jk7?whl-IzG?
zv#!__Xf-_`92`uBEv+GhwvR$U6!!0EPGWVHjAbFMs_vR}=-ym1FGe~X(OA?t4}3Yq
zK!D^S9_#Z+eNiKp+E4R9!fV}E|A&UyDArbcJ|iP|_E<z at P1zu35zX+6LJZc%H+qpF
z_LaZLk{Q<%Hr<lIn=w7G&(EA|o>*6 at 3As<+J1Lf;Ri!T at HXnMSOq(TXE318Uo7{4l
z{v|X>T3}vS?!Q!)Kk1Ju47gB0gZ90IbSLL8^L_PtMk`IwZx(UEjImgBh6XL4UBGm6
z8=09}K4ivamiL~Y1j{O?@r5h_S#!=!YEqNlU-V+eYkgCwxaajAMP&8WvzzVsO*=h0
zMU5aKCCvzJ<)s_TdjW5UpmV%5BA^+~Eh_p`fb^`r8xt2587+6?Cp^^Kxl$|c;mEN{
zLV>i}2HNxer#()?)?~F|9x_A+-O|#+#@ZceAPa&#Nf1UAY7nIWj{lS`%jb^&cMNhf
zpsTK`J}i;;L&QDg48-3!+?j1U!Ybgedolkko7dqm=^1~F1)v<HIrSUb?HlEQtePF#
zJcxNei6u+>0=_2XB4d*w<)7^0c8N&2bOSNa=QNgC;49dEH`Scg_Br<Hi_|&ogOD<Y
zC-vI{4Qt&zOKjQH^4;5a2LK6r`9SL=LkKv-boy at t*hW{!zn)-ZTUedYmX^Pj1ujv$
z`gRsl^)bp_rrY#lHss`^>=yyJ!}KC5UUbr=pmG1{paqoFmIN1|!V>`{(ezp&fV8%L
zMeQ|4hBRo at tfc-%TiW%-Z$P{bjh8n at KPtm5NTFsm&ikr^+2|tY?}_m(fM*tenHn6b
z6gxFR59u<#L*J|HRS5_{qe2^07p#B;DpCup`aO$=#vG*a5<!MHTx?4EeHa{_sw=FA
z+}zv><$$KX+5SbhSBo71&fX{+><v01?~<8U7QW}z3FaU=F5xj&4fxE4LvZaAE-tQx
z>(G^z730nri9B2^7U{+2mX^1B7bVX9%3kVKAEK}EWC7c|KFVS=z(|OD#^Lt0znO92
zRF`c>uq4dQQ$xU9&@1cjp#-2AK$o=R0uW-5LL{(43RLf?F5UI!>F=V++ly#D=<8L>
z0b_pSwf%s|fGBsr7y)wF;}{|DGJB#Xkz*@V0>`h2_uSb at U8ptMghaZ+-~=&iq=SmO
zE&M>HG7vDKah-#r8dx%EpTEuO_<nJ!f8^%{0pk<J0vJZ?%S$pn3A9cFU!ZybrnU5e
zBHidmK(`=JcF6(Ip3<;AG0DR8CH7~x&1>j1BWQ6 at P><ws-I`4%dUKg;30C;L*J*R<
zA34?!elgexSOyS5qyL2Jdj*4_Q%25zcvWQQQFBGu$Zoq5;Fj*H^dN?c0?hcL+Du9+
z?&S(EU^^d%K*GY;3F|er7}*`vqW}8^-Zls at _IVmbC3y1?O6z~44FQ6CHTOFVhJgzo
zb}KoQE;0u}B at LQl-1#oL0Yf9hg>)?fIkg?c${IUp(?)>G4yi8z;ulP(E at L~ad86Di
z`V3GLAXiq*Ix$+~1Xz}4MED{CIq^fsc6Qz at MbS9|qEBC)tP=&~$?5o}r6m&@niL?l
zatd$Gf_SdJz8)+4!eX&g#JG!!(lG+;GncR-I1en>SW8hV4&d98t-4^3{jZC^TaFZ!
zl$10ub9jl_c4x`N3h(;@^*8a17>Jvj9C1_2Kq<|UOI-TL?Max`%1l$T!>s!=U%MS`
ze1FUib<97CPfQeWSa`LuJZ74b#OJsaO2K0lSp7oh*Xw+0<D8<eKTb!9-v}_m4EDr>
zW at QI^qN0d1qQ%dSN_&JUI1HM*8SdP at J6AYMf27$qZdhWJGLWMH<Xdr?lDs_g;exjy
zs<&Mh#?3c#aQLBXXbNea{N at ox!NVpXaNd_8HQFPvU5g$+M&LN1s3c#${GVH4fDpDg
zFONeDS5bF=f8Wpie`&Ux9KSbICedAEbH6rn(Kk!>`g<gNOGoLoFtYuyV7`y7K$W!)
ztnM7aqX?6WF9#U|wTIStMnS2Sl|18k-wA*HlWEJ_9+oO(ydf5nE1gIXlF#VI6!zoT
zu8Q*s3Bg&#>e`F@>AqPqI~w&CHTCPK-;Re@)c!lg+1c4rlWq&3#dg_PI;Y?fKn;s3
zoA&nhVs%|#Z^r~VLkf!iE at U;ckp9j)qD)M;z{HUBJkk4LJ$hee7zd at zKK>*vh5iWW
z!g$!&VkCR}`x9m6D$9S8HmBRfp{#<h8{;NQdJNmb4%dd(2lG at aS|*8svjXX-r#$re
zLOJ7(RzcsWh~s|lPlX)-(#%q;1I6Is;~TSj-Yc*kTIruSYDr}o{_C5E_sPi#P|qtJ
zQ~cj>F)_7o7+cJ8yS7e_dsuLhb9sSm9e4923y2_1 at Nn3ZC=6X<BZC~i3AJT^9)F35
z*k&GXrrF}_+sk?M<nd$KIM^?%=LA~<HTLuVvmR1&3IAOX$EB`ckQG)FBcoJ0ud9m>
ziO1$^W~|jp8Yi^R3~h#lIp}wek3}4pLiC%h>iM+7K`sYqp=M1nD?*_X5`06+hAOW%
zQ<0NYv)gwI&az}IE%S?uw?QnL>8B9H>$N-AlI?k_fBddM=x*t`ctd|rPfus3<v$fS
z#)`RAp~<jxCnv!hi8AO_{f}=rD$5>m2{Yp8CG)rz4eGCTFeQe|(E?*|v_xrLxL>E7
zHnYnqigbQfh<VA*<30Qcgk2ML6i?!KuhCT~gh)G%{nW*@yhMz##0Jt{JN9Le0IwyP
zf8-qX_lD(R(Q;x{_7MTEQkh+t7q5`{I8*E;Nhj{t%aWpGRF-VYWpdp4p!^g_!%&DQ
zf0V7dO(!K(J^;8K8%k{5)MFnK(N~!EuB#>?O&U|c)G(z at inHpl>>mTYuE2>Hs&D$4
z;1EIn9`pf3$WURD7$7PNf+U|Hl|rD(#~M^J3}m4LLtp5W#eSQ$K0p;{<=#gL*f%i-
z>MwAoD3996+zQlK7VupVyFoD_A<(qd at otdd`Y>`ALo(|1JJ**9Ua;#v5K)|!aSH?C
zYaV1DQTa_`833q9oJ_EE1pw+GK;I!w5B at c=q7x3_3*_ at kzdcoj0|ov=^Y=_Smvg|e
zYS|s3khvv*YK*lQotKXUvaX}V8m{S{<<mJ-*P%5{3k9N|76xpagum1g6a)$~I0Ml$
z-f0y!2hg1!>gg`_pUXcy?i}?=(JT at Ld@P!b75D<hoLg#cZ5;=tQ&ZlHRDa+x at 5I?A
zq~M$ElD-6UCouu6ao-$48qznn+&nle>`!|;6B}C*AX at qPhS*Cs)hKux94}+ls*ug-
zOMM4)xBQ|a6YL|y(yKe~e;Y$W;vVzx at NjV*08e;$aBu)}Tf>DDnXe<eh6z;E4c;<z
z?@fg{#qj5ACg<kn`uh5om2nlS<qxbz4SV17doa{CF+nkeS<Xa9=Yv*i$fg39&dIte
zQW1WCb#eN8?8E+&PMs@>ZDL{~P}jJeH#9me13fGw1h7Ixj4IO1LBM6|;J{h49336q
zK^zD3Sn7&@TWT`Psw=bHsy*ZcPh53HdlubE9G710C>aaz*ySq7M}$XMn0kzykgzYA
z+`uBKxc<yy;djJJWV$K8S?|Lr8GAw_K94ge{jL#^k^&i|gK8Y9cQG5%8qc0QSsYT=
zYk_>r?IDiC#+H2u)KN$0+RCR{os6 at 3*|O2IX<`8eatGus)*v8h^2aSL*^yDmLM6}6
z?}21j-E*ZGx8tqN#YGYVf)dLSHf+m$^lwm%Yy;}b3gd%BS0;|mU7Ap7Z!45oH-+K6
zG5TFTi9eKD=<Mupy|A!QG{x!sXtS{&h_Ca7iodpI8p0n at K%r(9wtGMC54SDFvg<8j
zg`lYfBI_ at Yw7L*q|1 at v3Q*-aH#8zi_?8LBY!Km)ve`FJE-u25J8 at mCPl#~>@nwpvl
z5ND>^5tGOzIKKaROV)gAXw$^Ofs>yq2Sm1oSgMFENMklCTvAVVT7erIr-kYnyLQ#X
zT5B7d)(PD@*L$`CLcel(agXU6nDsCBmwWOV+n8Xnq at y4!3B#Nxkp*<%qQT2^NR><y
z6VHcQHGqQ0<}WJ<+JeSLN6qwSNwcLwpa}Co6${0XrcBEO&9#H4l8C(MZRbo=JRDm~
z3ug{QnmqaR3?hMv3UQkfnflUa`onTkLISypTjWeMIXk){+~!FMU{2q!VSi((b--4{
zKQo=Pwz6W$_DeZ12rKu~(@@#Y^+kud`u1nZ7aI`AJw+uvmuTFVL;k$Q?6uD!z<8cc
zPBFExHk1#__W-Fdutv1XZpwM81BoH~1p*k^y&M9+%G(MemDBTH<&(CYHK*!&9#7N|
zx6$vy$sG$=FE$C|2J%5`X(03!w)gVy-f{-A^GhE45K6xL&$_2&C&$MVl9Smcy{%At
zrksI1u{~g8F9CRC_{TKGgFa@~RFJ=2HDJ2V&G1sl?dWg0?Myv4vF9vt`Y73RS4iKW
za*jF&NR9=9G9abY38s?bhAZ+*0o4{D`_FCy@}k72)aIK7fUqU!Z)x*Zj!RE;csTyF
zZiDAkqfT{`^)V<HxO0~$RVuJDA|m2Jj6MMok&m2j<MnI+&A8%;qoX57Xu^{^x%puB
z`p-pqm8!L$npWS0pwU%CCM8jklaGT_0gO`r at xu1D2q?jGhTx?BWVjI4%#B}(1o|$z
ztZX8;+=+N?dSmbivch&Ij1QE+jgbI-hDjXW_*_Rd<#i<er=^li9Ixw2Hy&SRg~lmL
zFhyRR;a?o74-B22OnaZyEpWSPKxEtwR?^;6)H#ARMZw3Y_uG+9RT<zXP?fg8hrbf|
zE7o?;-Vrf1Fr+=2u=ZQwz!eSLsXSQb(_7&D$uLDH-@*Y_XP;uuu&|h3DZ{_ro?;8_
zfihgJ1vB2cqNq#6#!<~7H9AOKD`?mORTu97e>KI8N8yXV_f9|;F_2R|@m311KLf~k
z_tpJ)9z<myZljc_xY0bJep6|{gMklK;Q~DPxv(Mi at X#}mV$48_gD@|{xGE=KAB?wS
zv2)gT?*}F-{1O9+N)U3#0l(y64!C?I$O+v at X;>Jo*`cgZjMfc?=GmR;e}OHS=)X$<
zrT(-Ed5y~=n1b61tuIob07LWt6{rm1+Mc8%qgwKE<(`y|aN>csY7rE?KMmvr!O$GZ
zp>A1c7$DEqt_YCrtpuo=F%z2H%;_eMQ%3HH0710#9Don#kD}^Zdk;1DK%x9&P}h;>
zV7LbYiV*Y&1c<*7?JCfEO4fUhW9Dd<c at 0{L>TCXaPV!w at 3+zK~7p%CUR5}_{6;^?(
z>ttTe%f+^D$Q)ykU$vx*v#BLy=7h-#c at eWKs50j~HlQhPnjyYhm4q<q!CA7xy3G6_
z8&(@N<F$|J-(-RkFFs{B3k8c|2Psr0&yZ6y4Xugi!^O#+$fx~>laHk!A;vz&vZrW<
zOz&hRRp7EmOpc(mOUV@!I4gZzTU!HVXUj1hkS;3D1T at 1R3h^@9M+nJ`m$#qZ;8!*>
z?yFWSBkcWeGe}6gu(6H$;M)HNP5=KdYsFid%KZBA%czZ05>YLNy4y{O@`DgG!=utJ
zCDdCPCXCkFOr!>P93u<}Kdqoh09D8g_R%yQ39iK`Lu5(D!sjbH`8x#nj%;&*b7O8$
zEBZ=Aex{{vUAi-*R-7z@$g6=(tV1Uy;MDg8g;MtR&rd-mtfi&nq#S(D-cA8A`xn$}
znelox2kHgQbcUTS>Z7^&UCuT=qDf)npIYvZr{Jy~DPMPVdG7i+iT|>B<oNV-KWD1$
zJo=6PYU=ir6i}aPUv`qPMF%_ms$77~3<%9O`A;qM64b$=B82kvN9 at QzlEAgqbS+G#
zK7-<(>{&$(KXxA_cR>RMM3x at UhPfnG_iQ9ReX2kH$rHEp<L%WrtMQt{OOUM at W!?~Y
zUxb5Ak<a6}((4IodqF|6rG+CFK3(GKfX^oML1IJf7?*i}F3?D;qmf1q((PzOIX%fk
zAv7Y79?czdu7^_`uNM?lRa7*H>O at 2kH8y!kA=($oRN3WovRm<>JCBx9eM((+X_`;f
zi;U7MK;lim_C6?JT}{P3eD*Mvf_rr+|9q)iCiG}nZu7x9+|epfV)Pz4Rb9disNw`p
z$)Kmd at MtSk@|iCvl#Vi7-HkhA>70Ma7JWK=5(Ubm;hx7^o)Z<9?RJ%Bdo}OQTYw6x
z7J<a0)F8copE2oE<@wQNWuD-3^4lS{z1`xbD#ApE%9`VCt~9KX;h=b0LOub`?oPG(
z)wZ6G0Lm-gJGwg1o(*XN_0$VhZ}cNx&mA{@Y at fMK>3#YsSW{CPMrmcn_?f+jQ}00=
zoY9<zFiu}S{#&8l-Kd9MQlBJxS<Kyy5?IXd#nwl+>#ZhpNC{e%N?-{@RP+#!&a_~^
z4U53^&u^UQ>XL){edUb^T(unep|m^g<rPzcmDD at mHXk8`wc at rd5h#QebvNo(8s7_a
zgn3h|yh){o)FfqboUqG|m_DIv$J`^U;3b6(D+A_1=QNcN`3_)uN_O3zF^l#Du?c6x
z0r<8r@<SyWSFD%12<mXdDNpabnOo_zULyxZ+UOu>{jW&-!0i(eCt)0HmM1se<e5?e
z1p9p`)p?MMu7og68j*SYFX7M%G+sf<IHy1963={FvB{BTd5s_MXEDG^^*N#s>Pe;Z
z%A%VOv~2x4VogukgMa_EtSLkuICQ95Z%!QRJ$%|l44Ex6e`!KNb4o9x*_dT(yf<Qk
zs`9=qpbV#1=rxS`2>q0E*rNIL&bZlzqWHfG?=cqZY!2(u(e{l8>kEt4(Kc+lw#ekH
zU|{sA^DH(`>MC}3^dm-Jf8SyL-S*2Y?~A9UJEZj_`zh1{`^;u;dhiKsaQ64_dySN3
znT-!y&5{#>ZuyhXX~oM%C1d}m*t^l_Db3*#6RShN?^cEG5v__Z9w)i5x#`>OX5w+W
zKAH#qEoPh-x;tcHFWrOjh|b*i7RNSXqqmcP9x;j6edT<kMVMYwBbed#Z0O`S&)fd{
zY#z*!4Rc)`9b&y{jOwLmiNZpo8- at HfLTF-M;v2$rIW4|t?Aq^$gF8=l>3Z!6iY0@(
zeVqnF{_Stv at Pzh8B6RC*_Jl#Z>04?{`#irH&6<hD&TFEq>uI4v@?yk2B5#j~=5e#Q
z98SXC(!e}fVr3whYvMM~>^K$WxkoWMaH2KEY4AUg!uEcd**A at o@N|_-P^Qr!PS%56
z>D4HH$EUG9tE0}EL~xkF7U_WJ7#ejn!O73!do+NW1t-R|>QzvHZ`fX=pKai#Pc2gT
z^zl>174=$drLA%N8n>HzbGrJ*7Zb3w`C5=Y*o|S3c^bz{TdMUFTXw0GCETZKaIjMH
zJNJ+~DY4b|^b|X&1$V{p at 4LGO{o*3oVwRJ6iRQNRcin#8leLcW34OeKnIarKH<6h`
zASULOKXQ?FZR66l^1cDoq#M<|(eIPtoWY(517>L#+|cF8LJX}>ok$kt>S9tUCs|!+
z_n`48!%9-sn^_(y)Ph&+M%ex^n%0bKh?#u#1JtrZn_l<itH34a{OUg*TqI6M%bNQ<
zs>6^07355KvJ^s7Mi!Nv87{<9bwV-<v<YXroGHd1C^PxF&I)&#BuSnW*v*MQI(wU!
z_x&kJ9D)04wQ$CVr$o0`J!Os4ACjoV-ZS1KeA4_yB~V}Au%+{`(q>WQeB)Waz at I)r
z{V+Svo}HM%BAt|Ht{J6yCD1ETnWa6`aBB9{T at o7x4z1+H1{QzfEq9^-U6dQ?ciPmf
zC`;)4DjH?}V?pb_%-+bxqXibc)-ObSHmtA^$3A94TZ!)WG4Jn3;8~GgvX_l;(T%L5
z&2#ofRwHQ6e=6f8mQa=P6at_!enhEH<USASPgb{M$qYuU;GH16=Sy*gJ2#VT&dRPY
zKX~8|9%S*8DeuPxp8fZXcdi{GUeoBqoi3BP+7J2$x)hg8A$jh^L0_vBRCw(F`ZUXN
zTe&C*im=dk5qc7sRDEzc*>0wwFSPbpXo$6g`P at BxTe=h;gC%>_S+j3_;Lm6Lts;y@
z1kK?-<bK&fzs$A8%^oe_w|}{a*1J>KsH=9_+)ZUWN8tJ9_>aIf?V;cg=@VS4`}EDa
z&LA0fb?Ih6#H9rueRvXjK3uqMNdF+s8C7WCVu|1XP8PsMYL~v4zGDW+EK$`OjDLZ!
z at 4t;{dpVidRVn$F2KHA%KLU{NJ|XdFf*$p%I3&xbk7Ke?*T0Hoh0{$R#*h*7Wk`i_
z#DFwcBZf0hB2IvK9NopkE<49Ey_gHe-U=E{!-p%Io5ly6iG6(8^#yKMpWo8w$PTGR
zQHBJ-X!Ha2THM$cC}`s8J2zUeN>7;^u$rXn8tGCxFPNErW&vdRsFvs@*Lp3gDk{pZ
zafOqpa{q2|sfnD`b+N(jknqW0>#OLf;6?Up>5e`!Zby?qJ0jSI-}L7vJRY1%@U8e>
zj<%9F+n5$XXO*OouIf`61RsCTeWDSAK|chy|7;m4Myt`&v at oa5v#(Fy=XPv^yyfgg
z7IIWs5s)&#cb)-Obwg|_0Lv*&`Gk6>A<YCc0a<Yr_4&t;ngL<@&+}a3i0>E~$hb=u
z#~bc+!;f$TIsrop0c7mvApyW~O?oy&etJ^X--~>DpR+Rp&2S7(rcw`jri$!?kU%5X
zzBJuwZRX5&M{w}bXOJ+I#Q3*ToMwqihfc>;ZJ at i8(J$sC*{9Gyew>+=WnQkCBtJrU
z(@AM<2%pS9n%Qzs77`|z(f2oT<8ct?m~WS842bLAsH=O;{3=1wQI&t~B(Mvrs-T#6
z at EM3&e5^!GXgd{A#FAh0e`u+>lxbNyhQAmB!4cF&`=7qj+MIwS8TJ6$dABoe52ICi
zypOEV4DqY(1dTtb=nEsY5fLZ$TYt1;kS6-SS`muAa?_+<26c!+u^_tuq5(iM=}?gl
z(5C=z=lEY&4UbR)8cL)Bx*B+amB{^XFHpkOdjbtBD=TV{Qh=24fhuh+So9JQhQO1E
zVQso-bWgh%k01qUX|&h2;!;xVS`{oo1frCp+S=LzG%9TmWQVFZ^xO8M-TCoo#p}ZJ
z46(Cov at 3FuCr*^2fvz_#-c?&EAa+-IeF+YQv%^^9)*Qx?(dGy2v1r#kWT~`ZLyJG!
rj=_inAwco_pT{3jPeT6QxxOuNeVOdNSA%+b_tt9(dGR7qxcC1D69qMs

literal 0
HcmV?d00001

diff --git a/images/user/tftp-proxy-1.puml b/images/user/tftp-proxy-1.puml
new file mode 100644
index 0000000..7f27c73
--- /dev/null
+++ b/images/user/tftp-proxy-1.puml
@@ -0,0 +1,34 @@
+'
+' TFTP Proxy 1:
+'
+' Copyright (c) 2020 Chris Johns <chrisj at rtems.org>
+' All rights reserved.
+'
+ at startuml
+
+ agent Beaglebone as bbb
+ agent MicroZed as uzed
+ agent RPi2 as rpi2
+
+ rectangle Proxy {
+  agent "TFTP Proxy" as proxy
+ }
+
+ rectangle "CI Tester" as tester {
+  agent "Beaglebone Black" as bbb_proxy
+  agent "MicroZed (ARM Zynq)" as uzed_proxy
+ }
+
+ rectangle "Developer" as devel {
+  agent "RasberryPi 2" as rpi2_proxy
+ }
+
+ bbb -- proxy : "(10.0.0.10:69)"
+ uzed -- proxy : "(10.0.0.10:69)"
+ rpi2 -- proxy : "(10.0.0.10:69)"
+
+ proxy .. bbb_proxy : (10.0.0.100:9001)
+ proxy .. uzed_proxy : (10.0.0.100:9002)
+ proxy .. rpi2_proxy : (10.0.0.110:9001)
+
+ at enduml
diff --git a/user/testing/tftp.rst b/user/testing/tftp.rst
index 1abf469..ade8f9a 100644
--- a/user/testing/tftp.rst
+++ b/user/testing/tftp.rst
@@ -2,6 +2,8 @@
 
 .. Copyright (C) 2018 Chris Johns <chrisj at rtems.org>
 
+.. _tftp-and-uboot:
+
 TFTP and U-Boot
 ---------------
 
diff --git a/user/tools/boot-image.rst b/user/tools/boot-image.rst
index 6e76a2d..8e8f63d 100644
--- a/user/tools/boot-image.rst
+++ b/user/tools/boot-image.rst
@@ -2,7 +2,7 @@
 
 .. Copyright (C) 2019 Chris Johns <chrisj at rtems.org>
 
-.. _RTEMSExecutableInfomation:
+.. _rtems-boot-image:
 
 RTEMS Boot Image
 ================
diff --git a/user/tools/index.rst b/user/tools/index.rst
index 2ee619b..03e198d 100644
--- a/user/tools/index.rst
+++ b/user/tools/index.rst
@@ -23,3 +23,4 @@ developers.
    bsp-builder
    tester
    boot-image
+   tftp-proxy
diff --git a/user/tools/tftp-proxy.rst b/user/tools/tftp-proxy.rst
new file mode 100644
index 0000000..7516a0d
--- /dev/null
+++ b/user/tools/tftp-proxy.rst
@@ -0,0 +1,166 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. Copyright (C) 2020 Chris Johns <chrisj at rtems.org>
+
+.. _RTEMSTFTPProxy:
+
+RTEMS TFTP Proxy
+================
+
+.. index:: Tools, rtems-tftp-proxy
+
+The RTEMS TFTP Proxy (:program:`rtems-tftp-proxy`) command is an RTEMS
+tool to simplify hardware testing using the RTEMS Test and Run
+commands. This command lets a test set up support a number of
+similarly configured boards running tests at the same time by proxying
+the TFTP session requests. The :ref:`tftp-and-uboot` section details
+the process to run a test executable on a network connected board.
+
+The TFTP Proxy approach does not require any special modifications in
+a boot loader to work and works with any compliant TFTP boot client.
+
+An identical SD card boot configuration can be used in similar board
+when a test set up has a number of similar boards. There is no need to
+specialize boot configurations. The TFTP proxy server identifies each
+board by MAC address.
+
+A configuration file maps a board's MAC address to a TFTP server's IP
+address and port number. This provides a centralized means to
+partition hardware in a test rack between members of a team, continuous
+integration services or any other project demands.
+
+The TFTP port number a proixed service runs with does not need to be
+the privileged TFTP port number removing the need to be root to run
+the RTEMS Test or Run commands. Only the TFTP Proxy needs to running
+as a privileged user. The RTEMS Test and Run commands lets you
+specified the TFTP port to bind too.
+
+Operation
+---------
+
+A network connected board with a suitable boot loader such as U-Boot
+is configured to boot using TFTP. The boot loader's configured TFTP
+server IP address is the address of the host computer running the TFTP
+Proxy server or the proxy. The TFTP Proxy runs as root or an
+administrator as it binds by default to the default TFTP port of 69.
+
+A reset board sends a TFTP read request (``RRQ``) packet to the host
+machine running the TFTP proxy on the standard TFTP port (69). The
+proxy server searches the configuration data for a matching MAC
+address. A configuration match creates a session, forwarding the
+read request to the proxied IP and port.
+
+The response from the proxied server identifies the remote session
+port number and the proxy server knows the board's client port number
+from the initial request. The proxy transfers the TFTP data
+transparently between the session's ports until the transfer finishes.
+
+An example configuration is three different types of boards used for
+RTEMS kernel regression testing and application development.
+
+.. _fig-tftp-proxy-1:
+
+.. figure:: ../../images/user/tftp-proxy-1.png
+   :width: 75%
+   :alt: RTEMS TFTP Proxy Test Lab
+   :figclass: align-center
+
+   RTEMS TFTP Proxy Test Lab
+
+The project has a continuous integration (CI) server on address
+``10.0.0.100`` and two boards, a BeagleBone Black and Xilinx MicroZed
+board, are confgured for testing. A developer on another host machine
+is using a RaspberryPi to develop an application. The configuration
+file is:
+
+.. code-block:: none
+
+   ;
+   ; Project Foo Test network.
+   ;
+   [default]
+   clients = bbb, uzed, rpi2
+
+   [bbb]
+   mac = 1c:ba:8c:96:20:bc
+   host = 10.0.0.100:9001
+
+   [uzed]
+   mac = 6e:3a:1c:22:aa:5f, 8a:3d:5f:67:55:cb
+   host = 10.0.0.100:9002
+
+   [rpi2]
+   mac = b8:27:eb:29:6b:bc
+   host = 10.0.0.110:9001
+
+The MicroZed board can be seen by different MAC addresses depending on
+how U-Boot starts. As a result both are listed.
+
+Configuration
+-------------
+
+The boot image tool is configured by an INI file that is passed to the
+TFTP proxy on the command line when it starts.
+
+The ``[default]`` section has to contain a ``clients`` entry that
+lists the clients. There needs to be a client section for each listed
+client.
+
+A client section header is a client name listed in the ``clients``
+record in the ``defaults`` section. A client section has to contain a
+``mac`` record and a ``host`` record. The MAC record is a comma
+separated list of MAC addresses in the standard 6 octet hex format
+separated by ``:``. A list of MAC addresses will match for any address
+listed. The host record is the IP address and port number of the
+proxied TFTP server.
+
+Command
+-------
+
+The :program:`rtems-tftp-proxy` tool runs a TFTP proxy server using a
+user provided configuration file. The command line options are:
+
+:program:`rtems-tftp-proxy`
+
+.. option:: -h, --help
+
+   Display the command line help.
+
+.. option:: -l, --log
+
+   Set the log file name.
+
+.. option:: -v, --trace
+
+   Enable trace or debug logging.
+
+.. option:: -c CONFIG, --config CONFIG
+
+   The INI format configuration file.
+
+.. option:: -B BIND, --bind BIND
+
+   The interface address the proxy binds too. The default is ``all``
+   which means the proxy binds to all interfaces.
+
+.. option:: -P PORT, --port PORT
+
+   The port the proxy server binds too. The default is the TFTP
+   standard port of 69. This is a privileged port so if using this
+   port number run the TFTP proxy with root or administrator
+   privileges.
+
+Examples
+--------
+
+The examples show running the TFTP Proxy as a privileged user:
+
+.. code-block:: none
+
+  $ sudo rtems-tftp-proxy -c foo-test-lab.ini
+  Password:
+  RTEMS Tools - TFTP Proxy, 5.1.0
+   Command Line: rtems-tftp-proxy -c foo-test-lab.ini
+   Host: FreeBSD ruru 12.0-RELEASE-p3 FreeBSD 12.0-RELEASE-p3 GENERIC amd64
+   Python: 3.6.9 (default, Nov 14 2019, 01:16:50) [GCC 4.2.1 Compatible FreeBSD Clang 6.0.1 (tags/RELEASE_601/final 335540)]
+  Proxy: all:6
-- 
2.23.0



More information about the devel mailing list