ofs | hex dump | ascii |
---|
0000 | 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 03 91 00 00 01 ce 08 06 00 00 00 01 95 8d | .PNG........IHDR................ |
0020 | b4 00 00 00 09 70 48 59 73 00 00 12 74 00 00 12 74 01 de 66 1f 78 00 00 00 07 74 49 4d 45 07 e2 | .....pHYs...t...t..f.x....tIME.. |
0040 | 08 16 0e 24 04 2e 41 5b 1e 00 00 00 07 74 45 58 74 41 75 74 68 6f 72 00 a9 ae cc 48 00 00 00 0c | ...$..A[.....tEXtAuthor....H.... |
0060 | 74 45 58 74 44 65 73 63 72 69 70 74 69 6f 6e 00 13 09 21 23 00 00 00 0a 74 45 58 74 43 6f 70 79 | tEXtDescription...!#....tEXtCopy |
0080 | 72 69 67 68 74 00 ac 0f cc 3a 00 00 00 0e 74 45 58 74 43 72 65 61 74 69 6f 6e 20 74 69 6d 65 00 | right....:....tEXtCreation.time. |
00a0 | 35 f7 0f 09 00 00 00 09 74 45 58 74 53 6f 66 74 77 61 72 65 00 5d 70 ff 3a 00 00 00 0b 74 45 58 | 5.......tEXtSoftware.]p.:....tEX |
00c0 | 74 44 69 73 63 6c 61 69 6d 65 72 00 b7 c0 b4 8f 00 00 00 08 74 45 58 74 57 61 72 6e 69 6e 67 00 | tDisclaimer.........tEXtWarning. |
00e0 | c0 1b e6 87 00 00 00 07 74 45 58 74 53 6f 75 72 63 65 00 f5 ff 83 eb 00 00 00 08 74 45 58 74 43 | ........tEXtSource.........tEXtC |
0100 | 6f 6d 6d 65 6e 74 00 f6 cc 96 bf 00 00 00 06 74 45 58 74 54 69 74 6c 65 00 a8 ee d2 27 00 00 20 | omment.........tEXtTitle....'... |
0120 | 00 49 44 41 54 78 9c ec bd 7d 70 5b c7 7d ef fd 85 e4 f7 b8 d7 8d d3 b8 34 ac f0 32 07 e0 f5 0c | .IDATx...}p[.}..........4..2.... |
0140 | e5 3a 0a 47 d2 3c 66 01 6a c2 c8 00 aa 6b 59 93 b1 6a 01 6c 1c a2 7a 6c a8 80 67 a4 a6 93 21 4a | .:.G.<f.j....kY..j.l..zl..g...!J |
0160 | 5d d8 8a 6c c4 2a 30 9a c6 d2 4c 80 88 f2 a3 42 93 5c 02 52 e9 f1 c8 f6 55 08 58 41 42 02 c3 74 | ]..l.*0...L....B.\.R....U.XAB..t |
0180 | 44 8d aa 38 32 3b 36 5e ca 32 12 cc aa b7 6e dd 38 8e ed 44 3e cf 1f f4 ae f7 1c 9c 03 1c f0 fd | D..82;6^.2....n.8..D>........... |
01a0 | e5 f7 99 d1 88 58 ec cb 6f f7 9c b3 d8 df cb 9e 35 c9 b2 2c 83 20 08 82 20 08 82 20 08 82 20 0c | .....X..o.......5..,............ |
01c0 | b0 66 b1 05 20 08 82 20 08 82 20 08 82 20 96 0f a4 44 12 04 41 10 04 41 10 04 41 10 86 21 25 92 | .f...............D..A..A..A..!%. |
01e0 | 20 08 82 20 08 82 20 08 82 30 0c 29 91 04 41 10 04 41 10 04 41 10 84 61 48 89 24 08 82 20 08 82 | .........0.)..A..A..A..aH.$..... |
0200 | 20 08 82 20 0c 43 4a 24 41 10 04 41 10 04 41 10 04 61 18 52 22 09 82 20 08 82 20 08 82 20 08 c3 | .....CJ$A..A..A..a.R"........... |
0220 | cc bb 12 29 cb c0 af 3f bc 8e eb 1f cf 77 4b 04 b1 7c f8 dd 75 19 ef 7d 78 1d 74 4a eb e2 41 73 | ...)...?.....wK..|..u..}x.tJ..As |
0240 | 13 b1 1a a0 b9 66 f5 f0 c1 6f 3f c6 07 bf a5 09 8d 20 18 1f fe ee 63 fc 86 9e 89 79 e3 86 f9 ac | .....f...o?...........c....y.... |
0260 | fc a3 df 7d 8c 77 de ff 1d fe f7 3f fc 2b 8a d7 de c7 af 3e b8 3e 9f cd 11 c4 b2 e1 f7 6e 59 8b | ...}.w.....?.+.....>.>.......nY. |
0280 | ff fe b9 5b f0 d8 03 4d f8 83 db 6f c4 cd 37 50 50 c0 42 42 73 13 b1 5a a0 b9 66 e5 23 cb d3 8b | ...[...M...o..7PP.BBs..Z..f.#... |
02a0 | e5 53 63 d7 f0 4f 6f ff 1a 57 fe e3 c3 c5 16 89 20 96 04 eb 3e 7b 33 ee 6d ba 0d 7f ba f1 2e dc | .Sc..Oo..W..........>{3.m....... |
02c0 | 72 e3 1a dc b0 c6 b4 d8 22 ad 28 4c b2 3c 3f f6 49 59 06 fe f5 57 1f 21 f4 52 99 2c 63 04 a1 c3 | r.......".(L.<?.IY...W.!.R.,c... |
02e0 | da 35 26 84 bf 26 c1 7c c7 4d 58 4b 93 db 82 40 73 13 b1 1a 59 bb c6 84 ef 7c ed 8b b8 e7 f7 6f | .5&..&.|.MXK...@s...Y....|.....o |
0300 | 81 89 a6 9a 15 c5 07 bf fd 18 df 3c 55 20 63 18 41 e8 70 db 4d 6b f1 bc bb 15 b7 dd 44 46 b4 b9 | ...........<U.c.A.p.Mk......DF.. |
0320 | 64 de 46 f3 fd 8f ae e3 7f ff c3 bf d2 22 8d 20 6a 70 fd 63 19 ff 5f ae 82 0f 7f 47 cf c9 42 41 | d.F.........."..jp.c.._....G..BA |
0340 | 73 13 b1 1a b9 fe b1 8c 17 72 6f d3 5c b3 c2 f8 e0 b7 d3 1e 48 52 20 09 42 9f f7 3f ba 8e 93 a3 | s........ro.\.......HR..B..?.... |
0360 | 6f e3 23 9a ff e6 94 79 53 22 6f b9 71 2d 8a d7 de 9f af ea 09 62 c5 70 e5 3f 3e c4 ad 37 ae 5d | o.#....yS"o.q-.......b.p.?>..7.] |
0380 | 6c 31 56 0d 34 37 11 ab 95 2b ff f1 21 85 b3 ae 40 fe e9 ed 5f 2f b6 08 04 b1 e4 f9 a7 b7 df c7 | l1V.47...+..!...@..._/.......... |
03a0 | 1a 8a f8 9a 53 e6 ed d7 64 ed 1a 90 65 8c 20 0c f0 c1 6f 3f a6 f0 b2 05 84 e6 26 62 b5 42 73 cd | ....S...d...e.....o?......&b.Bs. |
03c0 | ca e3 96 1b d7 d0 1e 48 82 30 c0 3b bf fe 2d ed 89 9c 63 c8 24 49 10 04 41 10 04 41 10 04 41 18 | .......H.0.;..-...c.$I..A..A..A. |
03e0 | 86 94 48 82 20 08 82 20 08 82 20 08 c2 30 a4 44 12 04 41 10 04 41 10 04 41 10 86 99 d7 73 22 eb | ..H..........0.D..A..A..A....s". |
0400 | 71 f8 4f ad 68 ba e3 26 fe f9 b5 f1 77 70 72 74 ca 70 f9 9e 8e 26 fc d1 3d b7 e3 5b 7f 5f 9c 0f | q.O.h..&....wprt.p...&..=..[._.. |
0420 | f1 08 82 20 08 82 20 96 35 3f 7c bc ad 2a ed d9 57 27 f0 e6 54 fd 17 8c 7d fb e1 2f c2 7a d7 ad | ........5?|..*..W'..T...}../.z.. |
0440 | b8 f8 2f bf c2 1b 95 5f e3 b1 07 9a f0 de 87 d7 31 f5 ee 47 f8 af df fc 0e 7f fb da 2f 6b 96 bf | ../...._........1..G......../k.. |
0460 | b7 e9 36 3c f5 50 0b 8a d7 7e 83 6f bf fc cf 55 e9 17 ff e5 57 75 eb 20 08 62 69 b2 a8 4a 24 00 | ..6<.P...~.o...U....Wu...bi..J$. |
0480 | fc e0 67 53 48 bf f1 0e 9f 50 a6 de fd 08 e9 37 de 31 54 b6 11 85 93 20 08 82 20 08 62 b5 f1 f5 | ..gSH....P.....7.1T.........b... |
04a0 | 17 c6 01 00 df 7f ec 5e fc c5 0f de 6c a8 6c d3 1d 37 f1 f2 7f f5 e0 17 1a 36 f6 03 c0 7b 1f 5e | .......^....l.l..7.......6...{.^ |
04c0 | 57 38 0c 00 c0 b3 f9 0f 51 bc f6 9b 86 ea 59 ea 38 d7 df 89 07 db ee 24 c7 06 b1 6a 58 74 25 92 | W8......Q.....Y.8......$...jXt%. |
04e0 | f1 e6 d4 fb 78 6d fc 1d 3c 60 b9 03 e9 37 de c1 f7 1f bb 17 b7 df 3c 7d ec c1 b3 af 4e c0 b3 f9 | ....xm..<`...7........<}....N... |
0500 | 0f f1 cf ff f7 37 38 39 3a 85 7b 9b 6e c3 37 1f fc 02 5e ba f8 6f fc 81 ed e9 68 c2 83 6d 77 02 | .....789:.{.n.7...^..o....h..mw. |
0520 | 00 b7 78 89 d6 b7 af bf 30 ce 15 55 31 0f 41 10 04 b0 70 0b 00 31 02 83 e6 21 82 20 16 83 bf 7a | ..x.....0..U1.A...p..1...!.....z |
0540 | f0 0b 30 ff fe cd 68 ba e3 26 bc 36 fe 0e fe e8 9e db ab e6 25 b6 0e fb e1 e3 6d 98 7a f7 23 fe | ..0...h..&.6........%.....m.z.#. |
0560 | fd 17 ff e0 56 fc d7 6f 7e 07 00 f8 db d7 7e a9 b9 fe 52 f3 d6 d4 fb f8 ab 07 bf c0 bd 8e 4d 77 | ....V..o~.....~...R...........Mw |
0580 | dc 84 9f 95 de c5 e7 3e 73 23 97 a7 fd bf ff 1e 80 69 a5 93 29 bb df 7f ec 5e bc f7 c1 b4 12 2a | .......>s#.......i..)....^.....* |
05a0 | a6 8b eb 3b a6 d8 8a 6b 3c 00 98 7a f7 23 7c eb ef 8b dc 9b 2a e6 65 91 6c ac 4f af 8d bf c3 fb | ...;...k<..z.#|.....*.e.l.O..... |
05c0 | 20 7a 47 8d 96 fd 87 f2 7f e1 b1 07 9a b8 6c 46 3d bd 04 b1 9c 59 32 4a 24 30 fd c0 7f f1 0f 6e | .zG...........lF=....Y2J$0.....n |
05e0 | c5 5f 3d f8 05 bc 35 f5 3e fe f6 b5 5f c2 b9 fe 4e 3c 61 37 2b 1e f0 ff f9 47 9f c3 5b aa 87 f3 | ._=...5.>..._...N<a7+....G..[... |
0600 | c1 b6 3b b9 b5 0c 98 7e f0 c5 07 fe db 0f 7f 11 ff fc 7f 7f 43 a1 13 04 41 2c 2a a2 92 fa fd c7 | ..;....~............C...A,*..... |
0620 | ee c5 bd 4d b7 d1 62 83 20 88 45 41 5c 37 31 be ff d8 bd 00 80 bf f8 c1 9b f8 e1 e3 6d 3c 0f 5b | ...M..b...EA\71.............m<.[ |
0640 | 47 9d 1c 9d c2 5f 3d f8 05 9e 5f bd fe d2 e2 ff fc e2 df f1 cd 4f ca f4 74 34 55 ad e1 c4 75 d9 | G...._=..._..........O..t4U...u. |
0660 | b7 1f fe 22 9c eb ef e4 51 69 bf b8 fa 1e be f5 f7 53 f8 f6 c3 5f 44 4f 47 13 4e 8e 4e f1 f6 ee | ..."....Qi.......S..._DOG.N.N... |
0680 | 6d ba 0d 4f d8 cd 00 a6 d7 86 6c dd f7 ed 87 bf 88 9f 95 de 85 73 fd 9d b8 fd e6 b5 3c ff 0f 1f | m..O......l..........s......<... |
06a0 | 6f e3 9e d4 db 6f 99 4e 77 ae bf 13 8f 3d d0 84 67 5f 9d 00 00 2e a7 91 b2 cc a9 71 72 74 0a 3f | o....o.Nw....=..g_.........qrt.? |
06c0 | f8 d9 14 79 22 89 55 85 21 25 b2 77 b0 84 ca 7f 36 76 0e 91 56 0c 7e 3d 98 55 e7 bf dd 7a 03 ac | ...y".U.!%.w....6v..V.~=.U...z.. |
06e0 | 77 dd ca eb 78 ef c3 eb 48 bf f1 0e be d6 fe 79 dc db 74 1b fe 47 d3 6d f8 ee 6b bf 44 cb e7 6e | w...x...H......y..t..G.m..k.D..n |
0700 | 01 30 3d 89 4c bd fb 91 a2 ae db 6f 5e 8b 07 db ee e4 8a e7 d4 bb 1f e1 e4 e8 14 0e ff a9 15 3f | .0=.L......o^..................? |
0720 | 7c bc 8d 87 d1 12 c4 52 a1 de 8f f0 72 c6 fc fb 37 23 ba d3 32 2f 75 37 3a 3f 35 32 37 89 11 11 | |......R....r...7#..2/u7:?527... |
0740 | 17 ff e5 57 f8 f7 5f ff 16 5f fc 83 5b b9 a5 fd fb 8f dd 8b ef be f6 4b 78 36 ff 61 95 b5 5a b4 | ...W.._.._..[..........Kx6.a..Z. |
0760 | a0 eb 5d db db 6f 5e 4b 0a 24 b1 e0 ac e4 b9 66 be 99 cf b9 6c a1 11 e7 4d d1 13 d8 08 5a eb 2f | ..]..o^K.$.....f....l...M....Z./ |
0780 | 2d de 9c 7a 1f ef 7d 70 1d ce f5 77 e2 01 cb 1d f8 ee 6b bf c4 ff 23 fd 37 fe 3d 53 e4 18 3f 2b | -..z..}p...w......k...#.7.=S..?+ |
07a0 | bd cb ff fe 87 f2 7f 01 00 f7 7e 02 ca 88 0e d6 3e db b3 f9 60 db 9d 7c dd d8 d3 d1 84 a6 3b 6e | ..........~.....>...`..|......;n |
07c0 | 52 cc fb f7 36 dd a6 28 37 f1 ef 1f 60 ea dd 8f aa e6 e2 a6 3b 6e aa 5b 96 e6 6f 62 35 63 48 89 | R...6..(7...`.......;n.[..ob5cH. |
07e0 | ac fc e7 87 33 52 0a 1b e5 c1 b6 3b f1 83 9f 4d 61 bd f9 33 9a 71 f7 6f 4d bd 8f ff f9 47 9f c3 | ....3R.....;...Ma..3.q.oM....G.. |
0800 | 7b 1f 5c c7 9b 53 ef 73 25 f2 cd a9 f7 ab e2 ed df fb f0 ba a6 a2 c8 2c 44 df 7f ec 5e 52 22 89 | {.\..S.s%..............,D...^R". |
0820 | 25 c5 42 3c 63 8b c5 7c 2e 5a e7 73 7e 12 f7 0f b1 fd 44 ac 2d e7 fa 3b f1 de 07 d7 d1 f2 b9 5b | %.B<c..|.Z.s~.....D.-..;.......[ |
0840 | 74 ad d5 cc 82 2e 22 2e 96 7e f0 33 da d7 4d 2c 3c 2b 79 ae 99 6f 56 aa 02 fe 3f 9a 6e 53 ec 9d | t....."..~.3..M,<+y..oV...?.nS.. |
0860 | 34 8a d6 fa 4b 8f 5f 5c 7d 0f 5f 6b ff 3c 57 d8 44 25 f2 c1 b6 3b 79 08 e8 b7 1f fe 62 cd 7a 9c | 4...K._\}._k.<W.D%...;y.....b.z. |
0880 | eb a7 95 44 e6 09 64 9e c8 07 2c 77 54 ad fb a6 de fd 48 33 c4 56 6c 5b 8f d9 94 25 88 d5 c0 a2 | ...D..d...,wT.....H3.Vl[...%.... |
08a0 | 87 b3 3e f6 40 93 62 41 95 7e e3 1d be 27 52 1d 63 ff 7f 7e f1 ef 78 ea a1 16 bc 36 5e ad fc bd | ..>.@.bA.~...'R.c..~..x....6^... |
08c0 | 36 fe 0e ff 61 14 f7 44 b2 ba 2f fe cb af b8 87 93 7d 26 08 82 a8 85 b8 1f e6 bd 0f af 03 98 9e | 6...a..D../......}&............. |
08e0 | 5f 7a 3a 9a f0 b9 cf dc 88 5f 5c 7d af a6 b5 9a 59 d0 45 d8 1c 07 7c 6a 4d a7 97 84 11 c4 ea e3 | _z:......_\}....Y.E...|jM....... |
0900 | ee a7 7f 86 a9 5f d5 f7 e2 d5 42 fe ee 96 39 91 65 ea dd 8f 14 d1 5f 8d a0 b5 fe d2 e2 e4 e8 14 | ....._....B...9.e....._......... |
0920 | 1e b0 dc a1 f0 32 32 7e 71 f5 3d be 9f b1 5e fb 2c 32 ed 87 8f b7 e1 bd 0f af e3 bd 0f a6 f3 27 | .....22~q.=...^.,2.............' |
0940 | cf ff 2b 9e 7a a8 85 af fb 98 33 e2 01 cb 1d 8a be 19 7d b9 50 fa 8d 77 1a 2a 9b 7e e3 1d 3c f6 | ..+.z.....3.......}.P..w.*.~..<. |
0960 | 40 13 ed 89 5c e2 98 be 39 bc d8 22 2c 49 9a 7e ef 26 bc fd cc 03 0d 95 31 c9 b2 2c d7 cb f4 f5 | @...\...9..",I.~.&......1..,.... |
0980 | 17 c6 67 64 b9 5c a9 16 3b 82 98 6b 56 ba 67 60 a6 73 c8 7c d5 ad 35 37 a9 5f ac c3 2c dc 62 f4 | ..gd.\..;..kV.g`.s.|..57._..,.b. |
09a0 | c2 5f fc e0 4d 9e 7e fb 2d 6b f1 17 3f 78 93 87 67 a9 17 4e 2c d4 b5 d6 42 42 dc 63 44 10 0b c1 | ._..M.~.-k..?x..g..N,...BB.cD... |
09c0 | 4a 9f 6b e6 9b b9 9c cb 4c df 1c 9e 13 25 90 d6 5a d3 1c fe 53 2b 8e e7 2a 78 73 ea 7d dd 79 99 | J.k.....L....%..Z...S+..*xs.}.y. |
09e0 | 58 dd d0 fc a7 cf 4c e6 a3 45 f7 44 12 04 41 2c 15 44 8f 22 8b 56 60 9f d5 7b 60 d8 e7 46 ad d5 | X.....L..E.D..A,.D.".V`..{`..F.. |
0a00 | e2 3e 4b b6 57 9b 20 08 82 98 1d 95 ff fc 50 f1 76 56 f6 a2 1c 82 20 e6 07 52 22 09 82 20 a0 0c | .>K.W.........P.vV.......R"..... |
0a20 | 33 35 82 18 92 a5 65 ed d6 53 24 1b 3d a7 8d 20 08 82 a8 0f bd 79 9f 20 16 96 35 8b 2d 00 41 10 | 35....e..S$.=........y....5.-.A. |
0a40 | c4 72 e2 de a6 db 70 fb 2d 6b e9 c5 5c 04 41 10 04 41 ac 5a 48 89 24 08 82 68 80 37 a7 de 27 6f | .r....p.-k..\.A..A.ZH.$..h.7..'o |
0a60 | 22 41 10 04 41 10 ab 9a 79 53 22 7f 77 5d c6 ef dd b2 76 be aa 27 88 15 c3 8d 6b 4d 8b 2d c2 aa | "A..A...yS".w]....v..'....kM.-.. |
0a80 | 82 e6 26 62 b5 42 73 0d 41 10 04 31 57 cc 9b 12 f9 c1 ef 3e c6 ba cf de 32 5f d5 13 c4 8a 61 dd | ..&b.Bs.A..1W......>....2_....a. |
0aa0 | 67 6f c1 6f 7e fb f1 62 8b b1 6a a0 b9 89 58 ad ac fb ec 2d f8 80 e6 1a 82 20 08 62 0e 98 37 25 | go.o~..b..j...X....-.......b..7% |
0ac0 | f2 33 37 ad 85 f7 8f 9b b0 76 0d 59 3e 09 42 8f b5 6b 4c e8 e9 68 c2 0d 14 58 be 60 d0 dc 44 ac | .37......v.Y>.B..kL..h...X.`..D. |
0ae0 | 46 d6 ae 31 c1 fb c7 4d b8 99 26 9b 15 c5 87 bf fb 18 eb 3e 7b f3 62 8b 41 10 4b 9e 3b 3f 73 23 | F..1...M..&........>{.b.A.K.;?s# |
0b00 | ae 7f 5c f7 54 43 a2 01 e6 ed d7 c4 64 02 3e 7f fb 8d 08 7f 4d 82 f5 ae 5b 71 cb 8d f4 c3 45 10 | ..\.TC......d.>.....M...[q....E. |
0b20 | 8c 1b d7 9a f0 c5 3f b8 15 4f 3d d4 82 2f 7c f6 66 dc b8 96 9e 8f 85 82 e6 26 62 35 21 ce 35 eb | ......?..O=../|.f........&b5!.5. |
0b40 | 7e ff 66 98 c8 76 b2 a2 f8 58 9e 7e d9 17 41 10 b5 b9 b7 e9 56 fc f6 3a 29 91 73 c9 bc 1e f1 71 | ~.f..v...X.~..A.....V..:).s....q |
0b60 | d3 0d 6b 70 cf ef df 8c 5e 57 33 6e bd 71 2d fd 78 11 84 c0 6f 7e fb 31 6e 58 03 52 20 17 01 9a | ..kp....^W3n.q-.x...o~.1nX.R.... |
0b80 | 9b 88 d5 04 cd 35 2b 97 5b 6f 5c 83 3f dd 78 17 7e 56 fa 2f bc ff d1 f5 c5 16 87 20 96 24 b7 dc | .....5+.[o\.?.x.~V./.........$.. |
0ba0 | b8 06 8f 3d 70 37 19 8d e7 98 79 1f cd 35 26 e0 b6 9b 68 91 46 10 6a 6e bd 71 0d 2d ea 16 11 9a | ...=p7....y..5&...h.F.jn.q.-.... |
0bc0 | 9b 88 d5 02 cd 35 2b 9b 5b 6e 5c 83 e7 dd ad f8 63 eb 1d b8 f3 33 37 2e b6 38 04 b1 64 b8 f3 33 | .....5+.[n\.....c....37..8..d..3 |
0be0 | 37 e2 01 cb 7f c3 df ee 6a c5 6d a4 40 ce 39 f3 ea 89 24 08 82 20 08 82 20 e6 8f 1b d6 98 70 c3 | 7.......j.m.@.9...$...........p. |
0c00 | 4d 26 fc bf b6 bb b1 66 8d 09 37 d0 7e 6f 82 00 00 5c ff 58 c6 6f af cb e4 81 9c 27 48 89 24 08 | M&.....f..7.~o...\.X.o.....'H.$. |
0c20 | 82 20 08 82 58 e6 dc 44 2f 4d 22 08 05 6b d7 98 e8 25 7a f3 08 cd 38 04 41 10 04 41 10 04 41 10 | ....X..D/M"..k...%z...8.A..A..A. |
0c40 | 84 61 48 89 24 08 82 20 08 82 20 08 82 20 0c 43 4a 24 41 10 04 41 10 04 41 10 04 61 98 05 53 22 | .aH.$..........CJ$A..A..A..a..S" |
0c60 | ad 56 2b 4c 26 13 ff 97 cf e7 35 bf 73 b9 5c 86 ca b8 5c 2e fe 39 10 08 20 10 08 34 2c 53 3e 9f | .V+L&.....5.s.\...\..9.....4,S>. |
0c80 | af aa b7 5c 2e 2b da 2c 97 cb ba e5 d4 f2 46 a3 51 9e 9e 4a a5 74 db 35 99 4c 88 46 a3 0d cb 4b | ...\.+.,......F.Q..J.t.5.L.F...K |
0ca0 | 10 04 41 10 04 41 10 04 b1 d8 2c a8 27 b2 54 2a 41 96 65 e4 72 39 d8 ed 76 85 82 c6 be 93 24 49 | ..A..A....,.'.T*A.e.r9..v.....$I |
0cc0 | a1 80 d5 2a 03 00 a9 54 0a e5 72 19 b1 58 ac 21 59 f2 f9 3c c2 e1 30 fc 7e bf 22 fd f0 e1 c3 c8 | ...*...T..r..X.!Y..<..0.~."..... |
0ce0 | e5 72 90 65 19 91 48 04 83 83 83 55 65 ed 76 3b 97 8b c9 00 00 d9 6c 16 b2 2c a3 54 2a 21 14 0a | .r.e..H....Ue.v;......l..,.T*!.. |
0d00 | 69 b6 6b 32 99 90 4c 26 1b 92 95 20 88 f9 23 95 4a 71 23 94 68 08 d2 33 22 2d 36 d1 68 74 46 46 | i.k2..L&......#.Jq#.h..3"-6.htFF |
0d20 | 33 b1 bc 96 11 cb f4 c9 59 27 6a 43 9a 51 83 97 68 d8 9b 29 26 3a 6f 85 20 08 82 20 96 05 73 a2 | 3.......Y'jC.Q..h..)&:o.......s. |
0d40 | 44 8a 9e b9 5a 1e 38 86 cd 66 d3 55 d0 1a 29 73 e5 ca 15 84 42 21 0c 0d 0d 55 e5 17 17 34 f9 7c | D...Z.8..f.U..)s....B!...U...4.| |
0d60 | 5e e1 31 64 f5 69 95 6b 69 69 c1 c0 c0 00 80 69 a5 b0 a3 a3 43 f1 7d b9 5c 86 d3 e9 84 24 49 00 | ^.1d.i.kii.....i....C.}.\....$I. |
0d80 | 80 ae ae 2e 4c 4e 4e 02 80 66 7d 6a 98 e2 49 10 c4 d2 24 12 89 70 c3 d5 6c 94 35 23 cc 44 69 ea | ....LNN..f}j..I...$..p..l.5#.Di. |
0da0 | ed ed 6d d8 68 d6 28 16 8b 05 b2 2c 43 96 65 f4 f7 f7 2f 49 65 9a 20 08 82 20 88 c5 63 4e 94 c8 | ..m.h.(....,C.e.../Ie.......cN.. |
0dc0 | 70 38 cc ff 4e 24 12 86 ca 34 37 37 2b 3e 5b 2c 16 be a0 72 bb dd 86 ca 78 3c 1e 45 db 22 5e af | p8..N$...477+>[,...r....x<.E."^. |
0de0 | 97 2b 83 03 03 03 f0 7a bd 86 e4 ea ed ed 05 30 bd b8 eb ea ea 82 cd 66 53 7c 5f a9 54 6a ca 04 | .+.....z.......0.......fS|_.Tj.. |
0e00 | 00 83 83 83 ba 72 11 04 b1 b0 b8 5c 2e 98 4c 26 58 ad d6 19 d7 91 4a a5 aa 0c 51 a2 07 13 98 0e | .....r.....\..L&X.....J...Q..... |
0e20 | bf 2f 97 cb 48 a5 52 dc a8 26 7e 1f 08 04 14 c6 36 26 8f 68 7c 13 43 f8 59 1a 6b 9b 79 05 c5 76 | ./..H.R..&~.....6&.h|.C.Y.k.y..v |
0e40 | b5 c2 fd c5 34 86 68 e8 eb ef ef 9f f1 38 30 44 6f a5 38 ae e1 70 b8 66 db 7a e1 ff 6a 6f 67 34 | ....4.h......80Do.8..p.f.z..jog4 |
0e60 | 1a e5 79 59 df 59 9d 5a e3 ae 1e 27 36 7e 8d 7a 53 09 62 39 71 fa d4 29 dc d7 d6 86 d3 a7 4e 69 | ..yY.Y.Z...'6~.zS.b9q..)......Ni |
0e80 | a6 8f 0c 0f cf ba 0d c7 d6 ad 28 14 0a b3 ae a7 51 ee 6b 6b 5b d0 f6 bc 3d 3d b8 af ad 4d 31 9e | ..........(.....Q.kk[...==...M1. |
0ea0 | de 9e 9e 59 8f e1 42 f7 83 20 16 92 39 51 22 c5 d0 4d a3 ca 1a f3 de 31 58 78 68 2d 0b bb ba 4c | ...Y..B.....9Q"..M.....1Xxh-...L |
0ec0 | 2e 97 83 c7 e3 d1 b4 92 bb dd 6e c4 e3 71 00 40 3c 1e d7 55 4c d5 b8 5c 2e 74 76 76 72 8f 61 3d | ..........n..q.@<..UL..\.tvvr.a= |
0ee0 | 4f 84 5a a6 54 2a 85 89 89 09 c3 ed 11 04 31 7f e4 f3 79 a4 d3 69 00 d3 73 8c 91 70 cb 60 30 08 | O.Z.T*........1...y..i..s..p.`0. |
0f00 | 93 c9 04 bb dd ce a3 0b dc 6e 77 55 a4 81 38 c7 e4 f3 79 58 ad 56 48 92 04 8f c7 c3 bd 78 e5 72 | .........nwU..8...yX.VH......x.r |
0f20 | 19 f9 7c 1e f9 7c 1e e5 72 99 a7 bb dd 6e 14 8b 45 00 e0 9f 03 81 00 7c 3e 1f 0f 89 f7 78 3c bc | ..|..|..r....n..E......|>....x<. |
0f40 | ad 62 b1 08 59 96 b9 91 8b c1 f2 5a 2c 16 d8 6c 36 04 02 01 24 93 49 c8 b2 8c 64 32 c9 e7 2f af | .b..Y......Z,..l6...$.I...d2../. |
0f60 | d7 cb e7 58 87 c3 51 77 0c 4a a5 12 57 c0 c2 e1 30 8f bc 60 04 02 01 1e f6 cf fa 01 4c 47 66 b0 | ...X..Qw.J..W...0..`........LGf. |
0f80 | ad 00 4c 71 13 db 66 db 15 ca e5 32 fa fb fb f9 78 88 fd 8a 46 a3 98 98 98 e0 e3 cd fa 6e 24 8a | ..Lq..f....2....x...F........n$. |
0fa0 | 83 e5 65 bf 0d a5 52 09 a5 52 69 4e 14 67 82 58 8a 6c dc b4 09 67 cf 9e 55 a4 bd 70 fc 38 1e de | ..e...R..RiN.g.X.l...g..U..p.8.. |
0fc0 | b1 63 41 da 3f 7a e4 08 8e 1e 39 b2 20 6d cd 16 3d 85 6e 7f 5f 1f da db db 71 79 7c 1c 97 c7 c7 | .cA.?z....9..m..=.n._....qy|.... |
0fe0 | ab c6 93 20 08 6d e6 44 89 b4 d9 6c 8a c5 51 3d ca e5 32 82 c1 20 76 ee dc 69 b8 0d bd 32 b9 5c | .....m.D...l..Q=..2...v..i...2.\ |
1000 | 4e 77 51 e4 f7 fb 11 8d 46 ab f6 3d d6 a2 58 2c 62 f3 e6 cd 00 a6 bd 8c 6a 05 d5 66 b3 21 9d 4e | NwQ.....F..=..X,b.......j..f.!.N |
1020 | f3 74 31 e4 35 1a 8d 62 64 64 64 de 43 cd 08 82 30 86 cd 66 83 d3 e9 04 00 ae 68 d5 83 85 b3 1a | .t1.5..bddd.C...0..f......h..... |
1040 | 51 5a fc 7e 3f 52 a9 14 8f 76 60 f3 02 53 c0 d2 e9 34 ae 5c b9 82 2b 57 ae a0 ab ab ab 66 5d e5 | QZ.~?R...v`..S...4.\..+W.....f]. |
1060 | 72 99 cf 6f 92 24 c1 62 b1 f0 ef 6a 29 7e 0e 87 03 99 4c 86 d7 e1 f1 78 60 32 99 aa 0c 6c 4c 11 | r..o.$.b...j)~....L....x`2...lL. |
1080 | 6c 69 69 a9 db 2f 31 9c 55 6b 4e 2f 16 8b 9a 63 c9 e6 42 31 42 83 29 b9 26 93 09 f1 78 1c 93 93 | lii../1.UkN/...c..B1B.).&...x... |
10a0 | 93 a8 54 2a ba 7d 0a 06 83 e8 ee ee e6 9f 99 77 d3 48 68 31 ab d3 6c 36 f3 6d 07 6a 05 98 20 96 | ..T*.}.........w.Hh1..l6.m.j.... |
10c0 | 0b cc a3 58 cb ab 68 36 9b 01 80 7f 3f 32 3c 8c 8d 9b 36 29 f2 ec ef eb e3 f5 78 7b 7a 00 00 85 | ...X..h6....?2<...6)......x{z... |
10e0 | 42 41 e1 7d db df d7 a7 99 9f 51 28 14 78 1a 93 e7 f4 a9 53 e8 3f 76 0c fd c7 8e c1 b1 75 6b 95 | BA.}......Q(.x.....S.?v......uk. |
1100 | cc 2c 0d 98 f6 68 b2 f6 4e 9f 3a a5 68 af 96 b7 73 64 78 58 21 27 53 58 d5 e9 ac 3e 96 2e d6 2d | .,...h..N.:.h...sdxX!'SX...>...- |
1120 | fe af e5 b9 7d f9 cc 19 ec dd b7 8f 7f 4e 9c 3c c9 ff 3e 71 e2 44 d5 58 8c 0c 0f 57 8d 27 30 ad | ....}........N.<..>q.D.X...W.'0. |
1140 | 50 ab e5 14 bf 63 79 45 b9 c5 b1 25 88 e5 c6 82 be 58 87 2d 24 2c 16 0b 4a a5 92 a1 1f f7 7a 65 | P....cyE...%.....X.-$,..J.....ze |
1160 | 6c 36 1b 7c 3e 5f 55 a8 19 00 74 77 77 57 2d 48 18 2c c4 2a 1e 8f c3 6e b7 f3 f2 e1 70 98 b7 e9 | l6.|>_U...twwW-H.,.*...n....p... |
1180 | f1 78 b8 42 e8 72 b9 b8 65 3d 99 4c f2 3c 92 24 c1 66 b3 71 25 37 1e 8f 2b c2 cb 58 d8 97 b8 b8 | .x.B.r..e=.L.<.$.f.q%7..+..X.... |
11a0 | f4 78 3c dc db 41 10 c4 fc 32 34 34 54 e5 31 9b 2b ba bb bb 31 32 32 82 4c 26 03 b7 db cd 95 3f | .x<..A...244T.1.+...122.L&.....? |
11c0 | a6 80 31 25 6c dd ba 75 c8 66 b3 35 eb 92 24 09 e7 cf 9f 07 00 c3 7b 10 03 81 80 c2 53 28 49 12 | ..1%l..u.f.5..$.......{.....S(I. |
11e0 | f7 10 ca b2 ac f0 9e b2 3a 27 26 26 66 d0 53 25 56 ab d5 f0 4b 74 d4 e3 d1 db db 0b b3 d9 cc 15 | ........:'&&f.S%V...Kt.......... |
1200 | 5f 35 b2 2c c3 6e b7 f3 cf 6e b7 9b 2b f4 f9 7c 1e eb d6 ad e3 7d a1 bd 9a c4 4a e6 85 e3 c7 f9 | _5.,.n...n..+..|.....}....J..... |
1220 | df b5 de b9 b0 6d db 36 fe fd d0 d0 50 d5 7a e8 b9 43 87 b8 97 0d 00 57 d8 2e 8c 8d e1 a5 33 67 | .....m.6....P.z..C.....W......3g |
1240 | 70 79 7c 1c 17 c6 c6 50 28 14 30 32 3c 8c 4a a5 c2 f3 b3 2d 3c ad ad ad 3c 2d 16 8f 63 68 68 08 | /*
* Copyright (c) 2015 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <vlib/vlib.h>
#include <vnet/l2/feat_bitmap.h>
#include <vnet/l2/l2_rw.h>
#include <vnet/classify/vnet_classify.h>
/**
* @file
* @brief Layer 2 Rewrite.
*
* Layer 2-Rewrite node uses classify tables to match packets. Then, using
* the provisioned mask and value, modifies the packet header.
*/
#ifndef CLIB_MARCH_VARIANT
l2_rw_main_t l2_rw_main;
#endif /* CLIB_MARCH_VARIANT */
typedef struct
{
u32 sw_if_index;
u32 classify_table_index;
u32 rewrite_entry_index;
} l2_rw_trace_t;
static u8 *
format_l2_rw_entry (u8 * s, va_list * args)
{
l2_rw_entry_t *e = va_arg (*args, l2_rw_entry_t *);
l2_rw_main_t *rw = &l2_rw_main;
s = format (s, "%d - mask:%U value:%U\n",
e - rw->entries,
format_hex_bytes, e->mask,
e->rewrite_n_vectors * sizeof (u32x4), format_hex_bytes,
e->value, e->rewrite_n_vectors * sizeof (u32x4));
s =
format (s, " hits:%d skip_bytes:%d", e->hit_count,
e->skip_n_vectors * sizeof (u32x4));
return s;
}
static u8 *
format_l2_rw_config (u8 * s, va_list * args)
{
l2_rw_config_t *c = va_arg (*args, l2_rw_config_t *);
return format (s, "table-index:%d miss-index:%d",
c->table_index, c->miss_index);
}
/* packet trace format function */
static u8 *
format_l2_rw_trace (u8 * s, va_list * args)
{
CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
l2_rw_trace_t *t = va_arg (*args, l2_rw_trace_t *);
return format (s, "l2-rw: sw_if_index %d, table %d, entry %d",
t->sw_if_index, t->classify_table_index,
t->rewrite_entry_index);
}
always_inline l2_rw_config_t *
l2_rw_get_config (u32 sw_if_index)
{
l2_rw_main_t *rw = &l2_rw_main;
if (PREDICT_FALSE (!clib_bitmap_get (rw->configs_bitmap, sw_if_index)))
{
vec_validate (rw->configs, sw_if_index);
rw->configs[sw_if_index].table_index = ~0;
rw->configs[sw_if_index].miss_index = ~0;
rw->configs_bitmap =
clib_bitmap_set (rw->configs_bitmap, sw_if_index, 1);
}
return &rw->configs[sw_if_index];
}
static_always_inline void
l2_rw_rewrite (l2_rw_entry_t * rwe, u8 * h)
{
u32x4u *d = ((u32x4u *) h) + rwe->skip_n_vectors;
switch (rwe->rewrite_n_vectors)
{
case 5:
d[4] = (d[4] & ~rwe->mask[4]) | rwe->value[4];
/* FALLTHROUGH */
case 4:
d[3] = (d[3] & ~rwe->mask[3]) | rwe->value[3];
/* FALLTHROUGH */
case 3:
d[2] = (d[2] & ~rwe->mask[2]) | rwe->value[2];
/* FALLTHROUGH */
case 2:
d[1] = (d[1] & ~rwe->mask[1]) | rwe->value[1];
/* FALLTHROUGH */
case 1:
d[0] = (d[0] & ~rwe->mask[0]) | rwe->value[0];
break;
default:
abort ();
}
}
VLIB_NODE_FN (l2_rw_node) (vlib_main_t * vm,
vlib_node_runtime_t * node, vlib_frame_t * frame)
{
l2_rw_main_t *rw = &l2_rw_main;
u32 n_left_from, *from, *to_next, next_index;
vnet_classify_main_t *vcm = &vnet_classify_main;
f64 now = vlib_time_now (vlib_get_main ());
from = vlib_frame_vector_args (frame);
n_left_from = frame->n_vectors; /* number of packets to process */
next_index = node->cached_next_index;
while (n_left_from > 0)
{
u32 n_left_to_next;
/* get space to enqueue frame to graph node "next_index" */
vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
while (n_left_from >= 6 && n_left_to_next >= 2)
{
u32 bi0, next0, sw_if_index0, rwe_index0;
u32 bi1, next1, sw_if_index1, rwe_index1;
vlib_buffer_t *b0, *b1;
ethernet_header_t *h0, *h1;
l2_rw_config_t *config0, *config1;
u64 hash0, hash1;
vnet_classify_table_t *t0, *t1;
vnet_classify_entry_t *e0, *e1;
l2_rw_entry_t *rwe0, *rwe1;
{
vlib_buffer_t *p2, *p3, *p4, *p5;
p2 = vlib_get_buffer (vm, from[2]);
p3 = vlib_get_buffer (vm, from[3]);
p4 = vlib_get_buffer (vm, from[4]);
p5 = vlib_get_buffer (vm, from[5]);
vlib_prefetch_buffer_header (p4, LOAD);
vlib_prefetch_buffer_header (p5, LOAD);
vlib_prefetch_buffer_data (p2, LOAD);
vlib_prefetch_buffer_data (p3, LOAD);
}
bi0 = from[0];
bi1 = from[1];
to_next[0] = bi0;
to_next[1] = bi1;
from += 2;
to_next += 2;
n_left_from -= 2;
n_left_to_next -= 2;
b0 = vlib_get_buffer (vm, bi0);
b1 = vlib_get_buffer (vm, bi1);
h0 = vlib_buffer_get_current (b0);
h1 = vlib_buffer_get_current (b1);
sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
sw_if_index1 = vnet_buffer (b1)->sw_if_index[VLIB_RX];
config0 = l2_rw_get_config (sw_if_index0); /*TODO: check sw_if_index0 value */
config1 = l2_rw_get_config (sw_if_index1); /*TODO: check sw_if_index0 value */
t0 = pool_elt_at_index (vcm->tables, config0->table_index);
t1 = pool_elt_at_index (vcm->tables, config1->table_index);
hash0 = vnet_classify_hash_packet (t0, (u8 *) h0);
hash1 = vnet_classify_hash_packet (t1, (u8 *) h1);
e0 = vnet_classify_find_entry (t0, (u8 *) h0, hash0, now);
e1 = vnet_classify_find_entry (t1, (u8 *) h1, hash1, now);
while (!e0 && (t0->next_table_index != ~0))
{
t0 = pool_elt_at_index (vcm->tables, t0->next_table_index);
hash0 = vnet_classify_hash_packet (t0, (u8 *) h0);
e0 = vnet_classify_find_entry (t0, (u8 *) h0, hash0, now);
}
while (!e1 && (t1->next_table_index != ~0))
{
t1 = pool_elt_at_index (vcm->tables, t1->next_table_index);
hash1 = vnet_classify_hash_packet (t1, (u8 *) h1);
e1 = vnet_classify_find_entry (t1, (u8 *) h1, hash1, now);
}
rwe_index0 = e0 ? e0->opaque_index : config0->miss_index;
rwe_index1 = e1 ? e1->opaque_index : config1->miss_index;
if (rwe_index0 != ~0)
{
rwe0 = pool_elt_at_index (rw->entries, rwe_index0);
l2_rw_rewrite (rwe0, (u8 *) h0);
}
if (rwe_index1 != ~0)
{
rwe1 = pool_elt_at_index (rw->entries, rwe_index1);
l2_rw_rewrite (rwe1, (u8 *) h1);
}
if (PREDICT_FALSE ((b0->flags & VLIB_BUFFER_IS_TRACED)))
{
l2_rw_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t));
t->sw_if_index = sw_if_index0;
t->classify_table_index = config0->table_index;
t->rewrite_entry_index = rwe_index0;
}
if (PREDICT_FALSE ((b1->flags & VLIB_BUFFER_IS_TRACED)))
{
l2_rw_trace_t *t = vlib_add_trace (vm, node, b1, sizeof (*t));
t->sw_if_index = sw_if_index1;
t->classify_table_index = config1->table_index;
t->rewrite_entry_index = rwe_index1;
}
/* Update feature bitmap and get next feature index */
next0 = vnet_l2_feature_next (b0, rw->feat_next_node_index,
L2INPUT_FEAT_RW);
next1 = vnet_l2_feature_next (b1, rw->feat_next_node_index,
L2INPUT_FEAT_RW);
vlib_validate_buffer_enqueue_x2 (vm, node, next_index,
to_next, n_left_to_next,
bi0, bi1, next0, next1);
}
while (n_left_from > 0 && n_left_to_next > 0)
{
u32 bi0, next0, sw_if_index0, rwe_index0;
vlib_buffer_t *b0;
ethernet_header_t *h0;
l2_rw_config_t *config0;
u64 hash0;
vnet_classify_table_t *t0;
vnet_classify_entry_t *e0;
l2_rw_entry_t *rwe0;
bi0 = from[0];
to_next[0] = bi0;
from += 1;
to_next += 1;
n_left_from -= 1;
n_left_to_next -= 1;
b0 = vlib_get_buffer (vm, bi0);
h0 = vlib_buffer_get_current (b0);
sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
config0 = l2_rw_get_config (sw_if_index0); /*TODO: check sw_if_index0 value */
t0 = pool_elt_at_index (vcm->tables, config0->table_index);
hash0 = vnet_classify_hash_packet (t0, (u8 *) h0);
e0 = vnet_classify_find_entry (t0, (u8 *) h0, hash0, now);
while (!e0 && (t0->next_table_index != ~0))
{
t0 = pool_elt_at_index (vcm->tables, t0->next_table_index);
hash0 = vnet_classify_hash_packet (t0, (u8 *) h0);
e0 = vnet_classify_find_entry (t0, (u8 *) h0, hash0, now);
}
rwe_index0 = e0 ? e0->opaque_index : config0->miss_index;
if (rwe_index0 != ~0)
{
rwe0 = pool_elt_at_index (rw->entries, rwe_index0);
l2_rw_rewrite (rwe0, (u8 *) h0);
}
if (PREDICT_FALSE ((b0->flags & VLIB_BUFFER_IS_TRACED)))
{
l2_rw_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t));
t->sw_if_index = sw_if_index0;
t->classify_table_index = config0->table_index;
t->rewrite_entry_index = rwe_index0;
}
/* Update feature bitmap and get next feature index */
next0 = vnet_l2_feature_next (b0, rw->feat_next_node_index,
L2INPUT_FEAT_RW);
vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
to_next, n_left_to_next,
bi0, next0);
}
vlib_put_next_frame (vm, node, next_index, n_left_to_next);
}
return frame->n_vectors;
}
#ifndef CLIB_MARCH_VARIANT
int
l2_rw_mod_entry (u32 * index,
u8 * mask, u8 * value, u32 len, u32 skip, u8 is_del)
{
l2_rw_main_t *rw = &l2_rw_main;
l2_rw_entry_t *e = 0;
if (*index != ~0)
{
if (pool_is_free_index (rw->entries, *index))
{
return -1;
}
e = pool_elt_at_index (rw->entries, *index);
}
else
{
pool_get (rw->entries, e);
*index = e - rw->entries;
}
if (!e)
return -1;
if (is_del)
{
pool_put (rw->entries, e);
return 0;
}
e->skip_n_vectors = skip / sizeof (u32x4);
skip -= e->skip_n_vectors * sizeof (u32x4);
e->rewrite_n_vectors = (skip + len - 1) / sizeof (u32x4) + 1;
vec_alloc_aligned (e->mask, e->rewrite_n_vectors, sizeof (u32x4));
clib_memset (e->mask, 0, e->rewrite_n_vectors * sizeof (u32x4));
vec_alloc_aligned (e->value, e->rewrite_n_vectors, sizeof (u32x4));
clib_memset (e->value, 0, e->rewrite_n_vectors * sizeof (u32x4));
clib_memcpy (((u8 *) e->value) + skip, value, len);
clib_memcpy (((u8 *) e->mask) + skip, mask, len);
int i;
for (i = 0; i < e->rewrite_n_vectors; i++)
{
e->value[i] &= e->mask[i];
}
return 0;
}
#endif /* CLIB_MARCH_VARIANT */
static clib_error_t *
l2_rw_entry_cli_fn (vlib_main_t * vm,
unformat_input_t * input, vlib_cli_command_t * cmd)
{
u32 index = ~0;
u8 *mask = 0;
u8 *value = 0;
u32 skip = 0;
u8 del = 0;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "index %d", &index))
;
else if (unformat (input, "mask %U", unformat_hex_string, &mask))
;
else if (unformat (input, "value %U", unformat_hex_string, &value))
;
else if (unformat (input, "skip %d", &skip))
;
else if (unformat (input, "del"))
del = 1;
else
break;
}
if (!mask || !value)
return clib_error_return (0, "Unspecified mask or value");
if (vec_len (mask) != vec_len (value))
return clib_error_return (0, "Mask and value lengths must be identical");
int ret;
if ((ret =
l2_rw_mod_entry (&index, mask, value, vec_len (mask), skip, del)))
return clib_error_return (0, "Could not add entry");
return 0;
}
/*?
* Layer 2-Rewrite node uses classify tables to match packets. Then, using
* the provisioned mask and value, modifies the packet header.
*
* @cliexpar
* @todo This is incomplete. This needs a detailed description and a
* practical example.
?*/
/* *INDENT-OFF* */
VLIB_CLI_COMMAND (l2_rw_entry_cli, static) = {
.path = "l2 rewrite entry",
.short_help =
"l2 rewrite entry [index <index>] [mask <hex-mask>] [value <hex-value>] [skip <n_bytes>] [del]",
.function = l2_rw_entry_cli_fn,
};
/* *INDENT-ON* */
#ifndef CLIB_MARCH_VARIANT
int
l2_rw_interface_set_table (u32 sw_if_index, u32 table_index, u32 miss_index)
{
l2_rw_config_t *c = l2_rw_get_config (sw_if_index);
l2_rw_main_t *rw = &l2_rw_main;
c->table_index = table_index;
c->miss_index = miss_index;
u32 feature_bitmap = (table_index == ~0) ? 0 : L2INPUT_FEAT_RW;
l2input_intf_bitmap_enable (sw_if_index, L2INPUT_FEAT_RW, feature_bitmap);
if (c->table_index == ~0)
clib_bitmap_set (rw->configs_bitmap, sw_if_index, 0);
return 0;
}
#endif /* CLIB_MARCH_VARIANT */
static clib_error_t *
l2_rw_interface_cli_fn (vlib_main_t * vm,
unformat_input_t * input, vlib_cli_command_t * cmd)
{
vnet_main_t *vnm = vnet_get_main ();
u32 table_index = ~0;
u32 sw_if_index = ~0;
u32 miss_index = ~0;
if (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
unformat (input, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index);
}
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "table %d", &table_index))
;
else if (unformat (input, "miss-index %d", &miss_index))
;
else
break;
}
if (sw_if_index == ~0)
return clib_error_return (0,
"You must specify an interface 'iface <interface>'",
format_unformat_error, input);
int ret;
if ((ret =
l2_rw_interface_set_table (sw_if_index, table_index, miss_index)))
return clib_error_return (0, "l2_rw_interface_set_table returned %d",
ret);
return 0;
}
/*?
* Layer 2-Rewrite node uses classify tables to match packets. Then, using
* the provisioned mask and value, modifies the packet header.
*
* @cliexpar
* @todo This is incomplete. This needs a detailed description and a
* practical example.
?*/
/* *INDENT-OFF* */
VLIB_CLI_COMMAND (l2_rw_interface_cli, static) = {
.path = "set interface l2 rewrite",
.short_help =
"set interface l2 rewrite <interface> [table <table index>] [miss-index <entry-index>]",
.function = l2_rw_interface_cli_fn,
};
/* *INDENT-ON* */
static clib_error_t *
l2_rw_show_interfaces_cli_fn (vlib_main_t * vm,
unformat_input_t * input,
vlib_cli_command_t * cmd)
{
l2_rw_main_t *rw = &l2_rw_main;
if (clib_bitmap_count_set_bits (rw->configs_bitmap) == 0)
vlib_cli_output (vm, "No interface is currently using l2 rewrite\n");
uword i;
/* *INDENT-OFF* */
clib_bitmap_foreach (i, rw->configs_bitmap) {
vlib_cli_output (vm, "sw_if_index:%d %U\n", i, format_l2_rw_config, &rw->configs[i]);
}
/* *INDENT-ON* */
return 0;
}
/*?
* Layer 2-Rewrite node uses classify tables to match packets. Then, using
* the provisioned mask and value, modifies the packet header.
*
* @cliexpar
* @todo This is incomplete. This needs a detailed description and a
* practical example.
?*/
/* *INDENT-OFF* */
VLIB_CLI_COMMAND (l2_rw_show_interfaces_cli, static) = {
.path = "show l2 rewrite interfaces",
.short_help =
"show l2 rewrite interfaces",
.function = l2_rw_show_interfaces_cli_fn,
};
/* *INDENT-ON* */
static clib_error_t *
l2_rw_show_entries_cli_fn (vlib_main_t * vm,
unformat_input_t * input, vlib_cli_command_t * cmd)
{
l2_rw_main_t *rw = &l2_rw_main;
l2_rw_entry_t *e;
if (pool_elts (rw->entries) == 0)
vlib_cli_output (vm, "No entries\n");
/* *INDENT-OFF* */
pool_foreach (e, rw->entries) {
vlib_cli_output (vm, "%U\n", format_l2_rw_entry, e);
}
/* *INDENT-ON* */
return 0;
}
/*?
* Layer 2-Rewrite node uses classify tables to match packets. Then, using
* the provisioned mask and value, modifies the packet header.
*
* @cliexpar
* @todo This is incomplete. This needs a detailed description and a
* practical example.
?*/
/* *INDENT-OFF* */
VLIB_CLI_COMMAND (l2_rw_show_entries_cli, static) = {
.path = "show l2 rewrite entries",
.short_help =
"show l2 rewrite entries",
.function = l2_rw_show_entries_cli_fn,
};
/* *INDENT-ON* */
static int
l2_rw_enable_disable (u32 bridge_domain, u8 disable)
{
u32 mask = L2INPUT_FEAT_RW;
l2input_set_bridge_features (bridge_domain, mask, disable ? 0 : mask);
return 0;
}
static clib_error_t *
l2_rw_set_cli_fn (vlib_main_t * vm,
unformat_input_t * input, vlib_cli_command_t * cmd)
{
u32 bridge_domain;
u8 disable = 0;
if (unformat_check_input (input) == UNFORMAT_END_OF_INPUT ||
!unformat (input, "%d", &bridge_domain))
{
return clib_error_return (0, "You must specify a bridge domain");
}
if (unformat_check_input (input) != UNFORMAT_END_OF_INPUT &&
unformat (input, "disable"))
{
disable = 1;
}
if (l2_rw_enable_disable (bridge_domain, disable))
return clib_error_return (0, "Could not enable or disable rewrite");
return 0;
}
/*?
* Layer 2-Rewrite node uses classify tables to match packets. Then, using
* the provisioned mask and value, modfies the packet header.
*
* @cliexpar
* @todo This is incomplete. This needs a detailed description and a
* practical example.
?*/
/* *INDENT-OFF* */
VLIB_CLI_COMMAND (l2_rw_set_cli, static) = {
.path = "set bridge-domain rewrite",
.short_help =
"set bridge-domain rewrite <bridge-domain> [disable]",
.function = l2_rw_set_cli_fn,
};
/* *INDENT-ON* */
static clib_error_t *
l2_rw_init (vlib_main_t * vm)
{
l2_rw_main_t *rw = &l2_rw_main;
rw->configs = 0;
rw->entries = 0;
clib_bitmap_alloc (rw->configs_bitmap, 1);
feat_bitmap_init_next_nodes (vm,
l2_rw_node.index,
L2INPUT_N_FEAT,
l2input_get_feat_names (),
rw->feat_next_node_index);
return 0;
}
VLIB_INIT_FUNCTION (l2_rw_init);
enum
{
L2_RW_NEXT_DROP,
L2_RW_N_NEXT,
};
#define foreach_l2_rw_error \
_(UNKNOWN, "Unknown error")
typedef enum
{
#define _(sym,str) L2_RW_ERROR_##sym,
foreach_l2_rw_error
#undef _
L2_RW_N_ERROR,
} l2_rw_error_t;
static char *l2_rw_error_strings[] = {
#define _(sym,string) string,
foreach_l2_rw_error
#undef _
};
/* *INDENT-OFF* */
VLIB_REGISTER_NODE (l2_rw_node) = {
.name = "l2-rw",
.vector_size = sizeof (u32),
.format_trace = format_l2_rw_trace,
.type = VLIB_NODE_TYPE_INTERNAL,
.n_errors = ARRAY_LEN(l2_rw_error_strings),
.error_strings = l2_rw_error_strings,
.runtime_data_bytes = 0,
.n_next_nodes = L2_RW_N_NEXT,
.next_nodes = { [L2_RW_NEXT_DROP] = "error-drop"},
};
/* *INDENT-ON* */
/*
* fd.io coding-style-patch-verification: ON
*
* Local Variables:
* eval: (c-set-style "gnu")
* End:
*/
|