⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 samp01_examples.mp

📁 Click is a modular router toolkit. To use it you ll need to know how to compile and install the sof
💻 MP
字号:
% samp01_examples.mp -- MetaPost graph examples: configuration fragments% Eddie Kohler%% Copyright (c) 2002-2003 International Computer Science Institute%% Permission is hereby granted, free of charge, to any person obtaining a% copy of this software and associated documentation files (the "Software"),% to deal in the Software without restriction, subject to the conditions% listed in the Click LICENSE file. These conditions include: you must% preserve this copyright notice, and you cannot mention the copyright% holders in advertising related to the Software without their permission.% The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This% notice is a summary of the Click LICENSE file; the license in that file is% legally binding.input elements;verbatimtex %&latex\documentclass[12pt]{article}\usepackage{elemfig}\begin{document}etex;picture emptyqueue; emptyqueue := btex \phantom{\elementlabel{Queue}} etex;picture vemptyqueue; vemptyqueue := emptyqueue rotated 90 xscaled .4;%% 1%% A sample element.beginfig(1);  elementit.samp(btex \element{Tee(2)} etex, 1, 2, push);  drawelement(samp);endfig;%% 2%% A sample element, with labels.beginfig(2);  elementit.samp(btex \element{Tee(2)} etex, 1, 2, push);  samp.c = (0,0);  drawelement(samp);    z.in = (-50,ypart samp.in[0]);  drawarrow z.in -- 0.9[z.in,samp.in[0]] dashed evenly scaled .5;  label.lft(btex input port etex scaled 0.8, z.in);    z.out = (50,ypart 0.5[samp.out[0],samp.out[1]]);  drawarrow z.out -- 0.9[z.out,samp.out[0]] dashed evenly scaled .5;  drawarrow z.out -- 0.9[z.out,samp.out[1]] dashed evenly scaled .5;  label.rt(btex output ports etex scaled 0.8, z.out);    z.type = (-4.5, 24);  drawarrow z.type -- (x.type,5.1) dashed evenly scaled .5;  label.top(btex element class etex scaled 0.8, z.type);    z.config = (6.5, -22);  drawarrow z.config -- (x.config,-5.8) dashed evenly scaled .5;  label.bot(btex conf{}iguration string etex scaled 0.8, z.config);endfig;%% 3%% A very simple router.beginfig(3);  boxjoin(a.se + (15,0) = b.sw);  elementit.src(btex \element{FromDevice(eth0)} etex, 0, 1, push);  elementit.strip(btex \element{Counter} etex, 1, 1, agnostic_push);  elementit.sink(btex \element{Discard} etex, 1, 0, push);  drawelement(src,strip,sink);  drawconnect(src,0,0,strip);  drawconnect(strip,0,0,sink);endfig;%% 4%% A more complex router fragment.beginfig(4);  % Left SFQ  velementit.hashl(btex \element{HashSwitch(...)} etex, 1, 2, push);  vqueueit.q1l(vemptyqueue);  vqueueit.q2l(vemptyqueue);  velementit.rrl(btex \element{RoundRobinSched} etex, 2, 1, pull);  rrl.in[0] - q1l.out[0] = rrl.in[1] - q2l.out[0] = (0,-10);  .5[q1l.n,q2l.n] - hashl.s = (0,-10);  % Right SFQ  velementit.hashr(btex \element{HashSwitch(...)} etex, 1, 2, push);  vqueueit.q1r(vemptyqueue);  vqueueit.q2r(vemptyqueue);  velementit.rrr(btex \element{RoundRobinSched} etex, 2, 1, pull);  rrr.in[0] - q1r.out[0] = rrr.in[1] - q2r.out[0] = (0,-10);  .5[q1r.n,q2r.n] - hashr.s = (0,-10);    %z.fairlabel = .5[hash.ne,rr.se] + (8,0);  %label(btex \element{StochasticFairQueue} etex rotated 90, z.fairlabel);  %picture fairq; fairq := currentpicture; currentpicture := nullpicture;  % Rest of system  velementit.arpq(btex \element{ARPQuerier} etex, 2, 1, push);  velementit.red(btex \element{RED} etex, 1, 1, agnostic_push);  velementit.filt(btex \quad\element{Classif{}ier(...)}\quad\lower2.3ex\null etex, 1, 2, push);  velementit.prio(btex \element{PrioSched} etex, 2, 1, pull);  velementit.t1(btex \element{ToDevice} etex, 1, 0, pull);  velementit.t2(btex \element{ToDevice} etex, 1, 0, pull);    red.s - filt.n = arpq.s - red.n = (0,10);  filt.s - .5[hashl.n,hashr.n] = .5[rrl.s,rrr.s] - prio.n = (0,18);  rrr.w - rrl.e = (10,0);    prio.s - .5[t1.n,t2.n] = (0,18);  t2.w - t1.e = (16,0);    drawelement(arpq,red,filt,rrl,rrr,hashl,q1l,q2l,hashr,q1r,q2r,prio,t1,t2);  drawconnarrow arpq.in[0]+(0,10) .. arpq.in[0];  drawconnarrow arpq.in[1]+(0,10) .. arpq.in[1];  drawconnect(arpq,0,0,red);  drawconnect(red,0,0,filt);  drawconnect(filt,0,0,hashl);  drawconnect(filt,1,0,hashr);  drawconnect(rrl,0,0,prio);  drawconnect(rrr,0,1,prio);    drawconnect(hashl,0,0,q1l);  drawconnect(hashl,1,0,q2l);  drawconnect(q1l,0,0,rrl);  drawconnect(q2l,0,1,rrl);  drawconnect(hashr,0,0,q1r);  drawconnect(hashr,1,0,q2r);  drawconnect(q1r,0,0,rrr);  drawconnect(q2r,0,1,rrr);  drawarrow prio.out[0]-(1,0){down} .. {down}t1.in[0] withpen connectionpen;  drawarrow prio.out[0]+(1,0){down} .. {down}t2.in[0] withpen connectionpen;  label.top(btex \portlabel{high priority} etex scaled 1.22, filt.out[0]+(0,2));  label.top(btex \portlabel{low priority} etex scaled 1.22, filt.out[1]+(0,2));endfig;%% 5%% A simple configuration with some RED elements.beginfig(5);  picture p; p := btex \element{Classif{}ier(...)\quad~~~~~~~~~~~~~~} etex;  elementit.f(p, 1, 3, push);    elementit.red0(btex \element{RED(p1, ...)} etex, 1, 1, agnostic_push);  elementit.red1(btex \element{RED(p2, ...)} etex, 1, 1, agnostic_push);  elementit.red2(btex \element{RED(p3, ...)} etex, 1, 1, agnostic_push);    queueit.q(emptyqueue);    f.e - red1.w = (-15,0);  red1.n = 0.5[red0.n,red2.n];  red1.n - red0.s = red2.n - red1.s = (0,-4);  red1.e - q.w = (-15,0);    drawelement(red0,red1,red2,f,q);    drawconnect(f,0,0,red0);  drawconnect(f,1,0,red1);  drawconnect(f,2,0,red2);  drawconnectna(red0,0,0,q);  drawconnectna(red2,0,0,q);  drawarrow f.in[0]-(12,0) .. f.in[0] withpen connectionpen;  drawarrow q.out[0] .. q.out[0]+(12,0) withpen connectionpen;    interim ahangle := 70;  drawconnect(red1,0,0,q);    label.lft(btex \portlabel{high priority~} etex scaled 1.2, f.out[0]-(3,0));  label.lft(btex \portlabel{medium priority~} etex scaled 1.2, f.out[1]-(3,0));  label.lft(btex \portlabel{low priority~} etex scaled 1.2, f.out[2]-(3,0));endfig;%% 6%% Another RED router fragment, showing painted elements.beginfig(6);  elementit.red(btex \element{RED} etex, 1, 1, agnostic_push);  elementit.filt(btex \element{Classif{}ier} etex, 1, 3, push);  queueit.q1(emptyqueue);  elementit.trash(btex \element{Discard} etex, 1, 0, push);  elementit.null(btex \element{Strip} etex, 1, 1, agnostic_push);  queueit.q2(emptyqueue);  elementit.shape(btex $\cdots$ etex, 1, 1, pull_to_push);  queueit.q3(emptyqueue);    q1.sw - trash.nw = trash.sw - null.nw = (0,10);  shape.w - q1.e = q3.w - shape.e = q2.w - null.e = (10,0);  .5[q1.w,null.w] - filt.e = (10,0);  filt.w - red.e = (10,0);  y.last = ypart q2.out[0];    fixelement(red,filt,trash,shape,null,q1,q2,q3);  fill bpath.filt withcolor 0.8white;  fill bpath.q1 withcolor 0.8white;  fill bpath.q2 withcolor 0.8white;  fill bpath.null withcolor 0.8white;  fill bpath.trash withcolor 0.8white;  drawelement(red,filt,trash,shape,null,q1,q2,q3);    drawconnect(red,0,0,filt);  drawconnect(filt,0,0,q1);  drawconnect(filt,1,0,trash);  drawconnect(filt,2,0,null);  drawconnect(null,0,0,q2);  drawconnect(q1,0,0,shape);  drawconnect(shape,0,0,q3);  drawconnarrow red.in[0]-(15,0) .. red.in[0];  drawconnarrow q2.out[0]{right} .. {right}q2.out[0]+(15,0);  drawconnarrow q3.out[0]{right} .. {right}q3.out[0]+(15,0);endfig;%% 7%% A diffserv configuration fragment.beginfig(7);  elementit.cl(btex \element{~Classif{}ier(...)~}\lower1.8ex\null etex rotated 90, 1, 4, push);  elementit.m0(btex \element{RatedSplitter(7500)} etex, 1, 2, push);  elementit.disc(btex \element{Discard} etex, 1, 0, push);  elementit.sh(btex \element{Shaper(10000)} etex, 1, 1, pull);  elementit.m2(btex \element{RatedSplitter(12500)} etex, 1, 2, push);  elementit.set(btex \element{SetIPDSCP(D)} etex, 1, 1, push);  queueit.qa(emptyqueue);  queueit.qb(emptyqueue);  queueit.qc(emptyqueue);  queueit.qd(emptyqueue xscaled 1.6);  elementit.rr(btex \element{RoundRobinSched} etex rotated 90, 3, 1, pull);  elementit.prio(btex \element{PrioSched} etex rotated 90, 2, 1, pull);  ypart .5[disc.w,qa.w] = ypart m0.e; ypart (qa.sw - disc.nw) = 6;  sh.w = qb.e + (12,0);  ypart .5[set.w,qc.w] = ypart m2.e; ypart (qc.sw - set.nw) = 6;  xpart (disc.w - m0.e) = xpart (set.w - m2.e) = 12;  ypart (disc.s - qb.n) = 8;  ypart (qb.s - qc.n) = 6;  ypart (set.s - qd.n) = 8;  xpart qa.w = xpart qc.w = xpart qd.w = xpart set.e + 20;  xpart m0.w = xpart qb.w = xpart m2.w = xpart cl.e + 24;  ypart cl.out[1] = ypart qb.in[0];  rr.w = (xpart qc.e,ypart .5[qa.n,qc.s]) + (15,0);  prio.w = (xpart rr.e,ypart .5[qd.s,qa.n]) + (18,0);  fixelement(cl,m2,m0,disc,sh,qa,qb,qc,qd,rr,prio,set);      drawconnarrow m0.out[0]{right} .. {right}(xpart disc.in[0],ypart qa.in[0]) .. qa.in[0];  drawconnarrow m2.out[0]{right} .. {right}(xpart set.in[0],ypart qc.in[0]) .. qc.in[0];  drawconnarrow cl.out[3]{right} .. tension 1.5 .. {right}(xpart m2.in[0],ypart qd.in[0]) .. qd.in[0];  drawconnect(set,0,0,qd);    drawelement(cl,m0,disc,sh,m2,qa,qb,qc,qd,rr,prio,set);  drawconnarrow cl.in[0]-(18,0) .. cl.in[0];  drawconnarrow prio.out[0] .. prio.out[0]+(18,0);    drawconnect(cl,0,0,m0);  drawconnect(m0,1,0,disc);    drawconnect(cl,1,0,qb);  drawconnect(qb,0,0,sh);  drawconnect(sh,0,1,rr);  drawconnect(cl,2,0,m2);  drawconnect(qc,0,2,rr);  drawconnect(m2,1,0,set);    drawconnect(qa,0,0,rr);  drawconnect(qc,0,2,rr);  drawconnect(rr,0,0,prio);  drawconnect(qd,0,1,prio);  label.lft(btex \portlabel{{A}} etex, cl.out[0]-(4,0));  label.lft(btex \portlabel{{B}} etex, cl.out[1]-(4,0));  label.lft(btex \portlabel{{C}} etex, cl.out[2]-(4,0));  label.lft(btex \portlabel{{D}} etex, cl.out[3]-(4,0));endfig;%% 8%% A simple compound element.vardef drawemptyqueued(suffix $) =  save i; interim linecap := squared; i := .052*$.width;  forever:    draw ($.ne -- $.se) shifted (-i,0) withpen currentpen scaled 0.25 withcolor 0.8white;    i := i + .052*$.width; exitunless i < .94*$.width;  endfor;  draw ($.nw -- $.ne -- $.se -- $.sw);enddef;vardef emptyqueueit@#(expr s) =  _elementit.@#(s, 1, 1, push_to_pull, false, false);  elemdraw_@# := "drawemptyqueued";enddef;beginfig(8);  % define components of compound  elementit.hash(btex \elementlabel{HashSwitch(...)} etex, 1, 2, push);  queueit.q1(emptyqueue);  queueit.q2(emptyqueue);  elementit.rr(btex \elementlabel{RoundRobinSched} etex, 2, 1, pull);  % arrange components relative to one another  0.5[q1.w,q2.w] - hash.e = (15,0);  rr.w - .5[q1.e,q2.e] = (15,0);  q1.se - q2.ne = q1.sw - q2.nw = (0,8);  % define compound itself, using the bounding box of the component elements  emptyqueueit.c(elementbbox(hash,q1,q2,rr));  % ports & border are bigger, add a bit of space around components  c.portscale := c.borderscale := 1.8; c.dx = 20; c.dy = 10;  % link to position of component elements  compoundelementlink.c(hash,q1,q2,rr);  % draw it all  drawelement(c);  fillelement(hash,q1,q2,rr)(white);  drawelement(hash,q1,q2,rr);  drawconnect(hash,0,0,q1);  drawconnect(q1,0,0,rr);  drawconnect(hash,1,0,q2);  drawconnect(q2,0,1,rr);  drawconnarrow portinteriorin(c,0) .. hash.in[0];  drawconnarrow rr.out[0] .. portinteriorout(c,0);  drawconnarrow c.in[0]-(20,0) .. c.in[0] withpen connectionpen scaled 1.5;  drawconnarrow c.out[0] .. c.out[0]+(20,0) withpen connectionpen scaled 1.5;endfig;end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -