Update 2017-01-23-DER-TEXT-ALS-AUTOR.adoc

# DER TEXT ALS AUTOR
:hp-tags: autor, forschung, originalgenie, text, wissenschaft
:published_at: 2017-01-23

WEITERER TEXT ÜBER DAS ORIGINALGENIE

____

»Mittelalterliche Textgepflogenheiten, die das Buch selbst wie einen Autor sprechen lassen, haben den Buchdruck nicht überlebt. Es wäre nicht ganz abwegig, sie wiederaufzugreifen, denn schließlich stammt, jedenfalls wo es ›wissenschaftlich‹ zugeht, nur sehr weniges, was in einem Buch zu lesen ist, von dem Autor selbst. «

—Luhmann, WdG, 11 fn. 1

____

Den konzipierenden, kritzelnden, tippenden, publizierenden menschen als ›autor‹ des folgetextes zu konzipieren mag sinn machen oder nicht. Zentral ist sie für die rechtliche behandlung von texterzeugnissen (»geistigem eigentum«) zur zu- und absprechung von publikationsrechten und der sicherung der gratifikation bestimmter (nicht-agraischer und nicht-handwerklicher) berufsgruppen. Aber die autoridentifikationstechnik schwächelt – plagiatsjäger mögen die ideologie des originalautors noch zu retten versuchen, aber die bedrohung der wissenschaftlich-künstlerischen professoralen (alles plagiatore) erzwingt eine diskussion über das plagiat, die unterscheidungen wie original/kopie/plagiat zwar zu sichern versucht, gerade dieses aber nicht mehr vermag. Das liegt vor allem an neuen schreib- und publikationstechniken, wie sie für konkrete textproduktion unerläßlich, oder doch mindestens ökonomisch profitabel geworden sind: Man denke an zitation und verweis in der wissenschaft, mash-up in der kunst – allgemein: der intertextualität.

Der anriß verdeutlicht: Die klärung kann sich längst nicht auf einen diskursbereich begrenzt. Gerade die unbedachte vermischung der diskursinteressen und -wertungsmethoden hindert die versachlichung, und es meint die literarische kunst zu verteidigen, wer die gratifikatorischen interessen eines arbeiters schützt. Nicht das letzteres verwerflich wäre: das behauptet gerade eine ideologie, die dann am originalgenie der kunst festhalten muß, die gratifikationssicherheit für den arbeiter verdeckt zu besorgen, damit dieser nicht widerspenstig wird. Solcherlei hindert die versachlichung. Das konzept des originalautors ist in keinem bereich zwingend; genauso aber in keinem zwingend ausgeschlossen.

Ich skizziere eine kurze genialogie des originalautors durch stützung des originalgenies und der einbettung bestimmter berufe in beamtentum und wissenschaft. Gerade so ausführlich, daß wir den autor als rechtskonzept von anderen trennen und gerade diesen ignorieren können. Uns interessiert dann die verbindung des autorkonzepts in bürokratie (der verbeamtete publizist) und der forschung (der originell-innovative autor) in der wissenschaft (das verbeamtete originalgenie) zu untersuchen.

Angemerkt: Daß sich die bereiche trennen lassen und ich fordere, sie sollten für die versachlichung auch getrennt werden, heißt nicht, sie wären vollkommen lösbar.

---

KURZE GENEALOGIE

Um 1800 wird die gratifikatorische absicherung bestimmter berufe notwendig, um ihre ausführung gesellschaftlich festigen zu können. Zu diesen gehören schriftsteller und journalisten, philosphen und wissenschaftler. {} Dies hat mehrere gründe: die zunehmende säkularisierung und damit die nötigung zur staatlichen institutionalisierung von wissenschaft, die … des mäzentums und einer damit einhergehenden bedrohung einer beruflichen beschäftigung. Nachdem wissenschaft, literatur, jounralismus in produktion und konsumtion wahrscheinlich geworden waren, war der verzicht recht unwahrscheinlich – viel zu viel hing davon ab.

Dort liegt auch der ursprung der originalgeniösen ideologie verborgen – sie erklärte fortschritt subjektbezogen; damit konnte einerseits der erfüllungsgeschichte der eschatologie eine fortschrittsgeschichte der aufklärung entgegengesetzt, und andererseits die genies als deren verwalter etabliert werden. Im originalgenie finden wir dabei die zentralen aspekte: die unterscheidung original/kopie, nicht nur mit der aufwertung des ersteren, sondern zugleich mit der implizit unterlegten unterscheidung innovation-originell/bezüglich-originell; andererseits der etablierung der engen verbindung des genius mit der schöpfung des originals, daß damit das originalgenie als solches etabliert, als andersherum das genie die entstehung von originalen (also die entstehung von innovation) erklärt. Die leistung der unterscheidung darf nicht unterbewertet werden, bedenkt man was zu gewährleisten war: die konzeption von innovation und originalgenie mußte recht, wissenschaft (bürokratischer forschung) und kunst genügen; sie mußte also verschiedene unterscheidungsmittel für verschiedene unterscheidungszwecke zugleich etablieren und gleichzeitig übertragbarkeit garantieren. {Übertragbarkeit meint nicht, daß sich die wissenschaft der rechtsmittel bediente, sondern daß (bspw.) einer unterscheidung im recht eine analoge unterscheidung in der wissenschaft gegenübersteht. Analog heißt, daß der gleiche ereignisbereich abgedeckt und diese ereignisse auf beiden seiten ablehnung oder zustimmung (nicht wissenschaftliche zustimmung und rechtliche ablehnung) erfahren. Der unterscheidung original/kopie interpretiert sich wissenschaftlich in der unterscheidung innovation/kopie, rechtlich als besitz/diebstahl. Diese unterscheidung ist nun aber sehr grob und genügt weder der publizistik noch der forschung. Jede weitere unterscheidung muß aber überall analoge unterscheidungen hervorrufen (oder gewinnt stabilität, wo sie dies tut und wird irritiert, wo dies nicht erfüllt ist.) So soll wissenschaftlich weder alles irgendwie neue gefördert, noch jeder gebrauch von (fremden) altem abgelehnt werden: es folgen die unterscheidungen innerhalb der unterscheidungsbereiche: 1. innovation/originalität, wobei innovation (neue neuheit: »erfindung«) gefördert, (nicht-innovative) originalität toleriert wird. Aber auch die kopie wird ein wichtigeres mittel, weshalb dann erlaubte von unerlaubter kopie (zitat/plagiat) unterschieden wird. (Es ergibt sich der zwischenbereich des reinen zitats: Wer eine arbeit von William James abtippt, sie einreicht, die gesamte arbeit aber als zitat kenntlich macht, fällt durch das seminar, ohne wissenschaftlich exkommuniziert zu werden. Der fall erscheint uns so seltsam, weil er ein leerbereich ist, mit dem wir nichts anfangen können: er ist weder vollkommen abzulehnen, noch wäre er irgendwie gefordert. Daß dieses beispiel seltsam wirkt, sollte zur verblüffung und faszinatin anregen.) Diese unterscheidungskonkretisierungen müssen sich im recht wiederfinden und tut es teils: auch das recht kennt legitimierte/nicht-legitimierte kopie (unter legitimierte kopie fällt dann nicht nur das zitat, sondern auch die von einem durch den autor vertraglich legitimierten verlag kopien). Nur auf zu innovation/originalität kennt das recht kein analogon. Das ist kein zu erklärendes problem, sondern zeigt den punkt, denn das dieses fehlt ist nicht grundlage für die behauptung der analogen unterscheidung, sondern für die irritation der unterscheidung innovation/originalität. _jedes_ original verdient rechtlichen schutz. Aber warum ist es nötig, eine originelle wiederholung schützen? Ist nicht auch das diebstahl an den innovationen anderer? (Ich darf nicht den text eines anderen als meinen ausgeben, aber wenn ich zwei in meinen worten wiederhole, ist es schützenswert.) Und wenn rechtlich keine mittel gefunden werden innovation von originalität zu unterscheiden, ließe sich die rückfrage stellen, wie dies in der wissenschaft möglich wäre, und jede antwort darauf würde die frage stellen, warum dies nicht rückübertragbar wäre. Die frage, welche art der kopie noch kunst sei und welche nur kopie trifft gerade dieses problem: wie ist nicht-innovative originalität von der kopie zu unterscheiden? Diese instabilität durch fehlende analogizität der unterscheidungen wird auch an anderen stellen deutlich: so kennt die kunst kein analogon zu zitat und kopie, sondern nur höchstens direkt kenntliche und unkenntliche kopie. Man muß nun zugleich von der kunst fordern, das plagiat abzulehnen, ohne ihr das mittel der unkenntlichen kopie zu berauben.)  Dies ermöglicht das originalgenie durch bestimmte offenheit in verbindung mit unbestimmter geschlossenheit {}. Dadurch wird die notwendige rückkopplung der verschiedenen diskursbereiche gewährleistet.

Das recht erfordert nicht nur eine unterscheidung von original/kopie, sondern zugleich eine personenbezogene unterscheidung von originalautor/kopierer. Eine unterscheidung die für die zunehmende differenzierung und komplexe strukturierung wissenschaftlicher textproduktion allerdings unhaltbar ist, allerdings übernommen werden _muß_, soll die gratifikation einzelner personen gewährleistet werden. (Die gratifikation einzelner menschen ist weder rechtlich noch wissenschaftlich nötig; selbst wenn personen häufig menschen entsprechen.) Nicht anders verhält es sich für die publizistik, die für weite verbreitung kopien benötigt. dies ist allerdings insofern kein problem, als die kopie nun weiter in legitimierte/nicht-legitimierte kopie unterscheidbar ist; dies wird in der wissenschaft als zitat/plagiat ausinterpretiert, in der publizistik als (bezahlte und vertraglich festgelegte) werkpublikation/(unbezahlte/unerlaubte) raubkopie. Während die wissenschaft die eigene reglementierung zitat/plagiat selbstständig durchsetzen kann (ich komme darauf zurück), benötigt die publizistik den rückbezug auf das recht: hier wird zur regelung von vertragsverhältnissen die konzeption des geistigen eigentums etabliert; ein genialer streich {}, der zugleich den bezug originalautor-originalgenie expliziert, während er diesen mit den bereits bestehenden mitteln der rechtlichen eigentumsregelung analogisiert. Dadurch müssen keine vollständig neuen rechtstechniken entwickelt, sondern nur alte mittel modifiziert werden.

---

BÜROKRATIE

Ich lasse sowohl das recht wie die kunst beiseite (und überlasse die beschäftigung damit gewitzteren geistern) und beschäftige mich mit der wissenschaft. Wie sich angedeutet haben mag, will ich zwischen forschung und wissenschaft unterscheiden, insofern wissenschaft bürokratische forschung meint. Letzteres wird dann in form von akademien (instiutionalisierte wissenschaft) und universitäten (lehre und forschung verbindende akademien){} Das komplexe auswirkungsverhältnis von forschung-lehre-institution scheint mir selten in angemessener weise behandelt zu werden. (Es wird dann vor allem auf einzelne unterschiede fixiert: lehrfreie forschung/lehrgebundene forschung, staatliche organistion/privatorganisation, nicht-akademische forschung/forschung. Daraus läßt sich viel lernen. Es bleiben dann allerdings blinde flecken; die werden dann häufig nicht eingestanden, sondern die erklärungslücken auf die einmal getroffene unterscheidung gezwungen.{})

Dieser umstand mag daran liegen, daß die forschung längst totalbürokratisiert es, das heißt, es kaum noch unbürokratisches forschen gibt; weder privatgelehrte spielen für die wissenschaft keine bedeutende rolle mehr {}; konzern- und firmengebundene forschung sowie populärwissenschaft haben sich längst selbst disqualifiziert, indem ihre unabhängigkeitsideologie längst zerstört wurde. Deshalb wird allenthalben gemeint, forschung sei und sei nur, was an universitäten gemacht werde.{} Selten war progression so konservativ.

Konservative progression.

Obwohl meist übersehen, gibt es progressive konservation: Der bewahrungsvorsatz paßt sich neuen gegebenheiten an und ist bereit, prioritäten offen zu ordnen und problematisieren.{} Ebenso gibt es konservative progression: Veränderungen und neuerungen erhalten etablierte strukturen.{} Dies soll nicht einem »wirklichen fortschritt« gegenübergestellt werden – ich vertrete keinen naiven ideologierealismus. Auch konservative progression ermöglicht fortschritt; und daß sie als mittel gewählt wurde, läßt mutmaßen, daß gerade sie (geordnete) progression ermöglicht hat. {} Indiz ist die zeit des 17. bis ins frühe 20. jh. Selten hätte man die konversion von organisationsstrukturen bei gleichzeitiger veränderlich- und veränderbarkeit derer methoden, techniken und ergebnisse beobachten können. Hier wird von der flexibilität durch starrheit profitiert.

Meine vermutung: dies liegt an der stärke bürokratischer organisation. Ihre formen sind starr, aber inhaltsleer; wodurch sie sowohl der judenvernichtung, als auch der demokratieerhaltung dienen können. Dafür ist die entwicklung Deutschlands beispielhaft: Denn an den verfahren zur beurteilung der gegner von nationalsozialisten und den dann folgenden zur rechtssprechung über die verbrechen der nationalsozialisten hat sich nichts, aber natürlich auch alles verändert. Die rechtsverfahren als solche mußte nicht abgelöst, sondern nur modifiziert werden, also bestimmte schritte angepaßt werden. (adresse {})

…

{Dies heißt durchaus nicht, professoren wären zwingend unfähig … Professoren sind ja nicht nur professoren, sondern auch mütter, künstlerinnen, muslima, wählerin, konsumentin und vielleicht auch etwas verrückte blogautorinnen. Das ein professor sich als professor nicht kritisch betrachten kann, hindert ja nicht, daß sie eine skeptische haltung gegen eigenes verhalten in bestimmten rollen einnimmt. Nur wird es mit den jahren handlungs… immer unwahrscheinlicher, da längere einübung von erklärungsmuster irritationen gekonnter und »innovativer« disqualifizieren läßt. Man kennt das: die wahrscheinlichkeit das ein 5 jähriger bezweifelt, daß jungens keine röcke tragen sollten ist sehr viel höher, als das ein 55 jähriger sich darüber verblüffen läßt. Aber das wunder langlebieger wunderei gibt es.

---

Daß das problem gerade in der kunst so zentral ist, liegt daran, an verarbeitungstechniken, welche die wissenschaft sich großteilig untersagt, für welche in der kunst ein freiraum geschaffen wurde: Der aneignung und verarbeitung eines themas durch variierte durchführung; die unterscheidung original/kopie probiert die kunst durch anwendung. (Gerade deshalb gibt es für Kusanowsky auch einen unterschied zwischen dem »spotler« und dem »verbrecher«. Beide nutzen die kopie für künstlerischen versuche. Jedoch deckt der sportler seine kopie als solche kenntlich macht und zugibt, während der verbrecher zugunsten seiner ökonomsichen verwertungsinteressen die kopie nicht als solche zugibt. (Deshalb ist letzteres auch keine künstlerischer verarbeitung der kopie, sondern die kopiertechnik ein mittel wirtschaftlicher profitsteigerung.)

https://differentia.wordpress.com/2016/08/10/kunst-sport-und-verbrechen/

Beltracchi konnte mit seiner Methode die Struktur der Kunst nicht beeindrucken, Landis dagegen konnte mit der selben Methode für die Beurteilung von Kunst eine Neuerung vorschlagen.

Dies war nicht immer so und mag sich wieder ändern. Vgl. Feyerabend.

Auch maler, zeichner, steinhauer, etc., ja auch komponisten. Ob in den malerischen und musischen produktionskünsten (im gegensatz zu malerischen und musischen exekutionskünsten) die autorkonzeption gleich beschrieben werden kann, weiß ich nicht. Ich vermute ja und nein. Sie lassen sich mit den gleichen strukturen beschreiben, solange vermieden wird zu behaupten, die entwicklungen wären vollständig analog.

{Was nicht das gleiche ist. Bestimmte offenheit meint hier, daß die anschließenden variativen anschlüsse immer zweckgebunden (nämlich der stützung ideal originalgenie) dient. Unbestimmte geschlossenheit meint, daß der begriff originalgenie alle variationen verwendungen zwingt eine universale einortbarkeit in allen bereichen (also einschluß/ausschluß) nach muster des originalgenies zu gewährleisten, mit welchen methoden auch immer.}

Ich bin in keiner weise sarkastisch: diese einführung diffizieler und komplizierter techniken finde ich faszinierend und bewundernswert. Ablehnungen des autorkonzepts gehen häufig mit plumper ablehnung vergangener leistungen und dem vorwurf einer gewissen »verwirrung« und »irrtümlichkeit« einher. Ein vokabular, das erstaunlich nah an der abgelehnten konzeption orientiert ist. – Auch die ablehnung einer _aufrechterhaltung_ des originalautorkonzepts erzwingt aber keinen rousseauistischen romantizismus, der zu einer rückkehrt zur natürlichen freiheit der kunst (oder was ähnlichem) aufruft. …

Meine unterscheidung akademie/universität ist nicht überflüssig. Die verbindung von wissenschaft und der lehre dieser wissenschaft bedingt und wird bedingt (durch) bestimmte organisationsformen, die sich auf die forschungstätigkeit auswirken: universitäten bilden ihr eigenes personal aus. Das gilt für akademien nicht zwingend.

Es ist gar nicht unwahrscheinlich, daß ich einfach etwas nicht gelesen habe. Ich lasse mich dann gerne aufklären und trage das hier nach. (In die kommentare unten oder an http://twitter.com/bertrandterrier[@bertrandterrier].)

Ich vermute das ändert sich. Durch das internet scheint ein neuer forschertyp ermöglicht zu werden, dem der einstige privatgelehrte am nächsten kommt. Ihn zu beschreiben und zu verfassen benötigt es aber wohl neue beobachtungs- und beschreibungsmittel, die nur unwahrscheinlicherweise von der universitären wissenschaft etabliert werden, da dieser typ ihre gratifikationssicherheiten bedroht.

Dies führt zu den schmalhirnigsten äußerungen, welche einem manches mal zweifeln lassen, ob an universitäten nicht prinzipiell die intelligenz fehle, forschung zu machen. So erzählt mir ein freund, auf die frage, wer denn ein philosoph sei, habe ihm ein dozent geantwortet: Der, der einen philosophischen abschluß hat. Das ist doof und man hofft auf höheres denkvermögen bei medizinern und pharmazeuten, von denen das eigene leben abhängt.

Interessant dazu der fall in  …, wo ein konservativer staat für die aufnahme syrischer flüchtlinge stimmt.

So paradox das klingt, sieht man’s überall: Das grundgesetz ist die neuformulierung der biblischen gebote, die aufklärung ist säkularisierte theologie, 2016 ist 1933, etc. Dies heißt nicht, jede erklärung eines (vermeintlich) neuen phänomens durch ein altes sei prinzipiell schlecht und falsch. Es läßt sich jedoch eine selbstverpflichtete blindheit gegen neues beobachten. Jedoch läßt sich eine tendenz zur ignoranz neuer phänomene beobachten:

++++

Wenn der Schreiber dafür sorgt, dass der Leser nur etwas Bekanntes wiederfindet. kann die Beobachtung von Neuem gut behindert werden.
— Klaus Kusanowsky (@kusanowsky) 20. Januar 2017

Die Verhinderung von Neuem gelingt, indem man für den Fortbestand von Nichtsneuem sorgt.
— Klaus Kusanowsky (@kusanowsky) 20. Januar 2017

++++

Dies liegt nicht an der ignoranz einer große masse von wissenschaftlern; sondern an der festgelegtheit von beobachtungstechnik, welche die eigenen probleme grundsätzlich blindsetzt. Es benötigt ja kein kurzes training, um sich die blindsetzung bestimmter probleme und die adelung anderer anzutrainieren (das hat sich bereits auf ca. 30 jahre (grundschule, schule, studium, promotion, habilitation) gesteigert.

Ich meine »fortschritt« nicht ideologisch, weshalb ich lieber von progression spreche; was nichts anderes heißt und nur einer verwirrung dient, der autor mache hier wohl auf eine verschobene implikation aufmerksam. Progression ist nicht gut oder schlecht, aber sie ist auch kein rein zeitlicher wechsel von annahmen. Sie meint, späteres bezöge sich auf früheres; das gälte aber auch für eine kultur, die plötzlich großen technologieverzicht leistet – insofern dies ja ein weiterschreiten und eben kein zurückschreiten ist. (Vergessen ist ein schweres unterfangen: ich schreibe darüber hier.)

Der wichtigkeit der subjektentlastung durch adressierbarkeit hat meines wissens nach @ReisAgainst innoviert. Zu einem recht lahmen vortrag zur geschichte des kapitalismus in einem marxistisch-kommunistischen kontext wurden da »ausnutzen« und »abhängigkeit« des arbeiters durch und von den kapitalistischen betriebsbesitzern der »selbstständigkeit« des bauern mit eigenem grundstück gegenübergestellt. @ReisAgainst machte den (sehr intelligenten) punkt, daß nur der arbeiter über eine adresse für beschwerde und forderung habe, während dem bauer bei dürre ein streik nichts helfe. Zu der bedeutung von adressierbarkeit hoffe ich auf einen text von ihm; da scheint mir fiel interessantes dran zu sein. Es ließe sich dann auch fragen, ob nicht die adressierbarkeit von allem an jeden ein problem der modernen bürokratie ist. Denn die totalität der adressierbarkeit führt doch gerade dazu, daß jeder angesprochene schlicht auf andere adressen verweis, bis man aufgibt oder mit dem verweis auf die bürokratischen verfahren selbst abserviert wird. Vgl. hierzu auch Arendt [MuG: 80]:

____
Büroktatie ist diejenige Staatsform, in welcher es niemanden mehr gibt, der Macht ausübt; und wo alle gleichermaßen ohnmächtig sind, haben wir eine Tyrannis ohne Tyrannen.
____

---

LITERATUR

Luhmann, Niklas: Wissenschaft der Gesellschaft (stw 1001), Frankfurt/M, ^7^2015 [1990]

# DER TEXT ALS AUTOR
:hp-tags: autor, forschung, originalgenie, text, wissenschaft
:published_at: 2017-01-23

WEITERER TEXT ÜBER DAS ORIGINALGENIE

____

»Mittelalterliche Textgepflogenheiten, die das Buch selbst wie einen Autor sprechen lassen, haben den Buchdruck nicht überlebt. Es wäre nicht ganz abwegig, sie wiederaufzugreifen, denn schließlich stammt, jedenfalls wo es ›wissenschaftlich‹ zugeht, nur sehr weniges, was in einem Buch zu lesen ist, von dem Autor selbst. «

—Luhmann, WdG, 11 fn. 1

____

Den konzipierenden, kritzelnden, tippenden, publizierenden menschen als ›autor‹ des folgetextes zu konzipieren mag sinn machen oder nicht. Zentral ist sie für die rechtliche behandlung von texterzeugnissen (»geistigem eigentum«) zur zu- und absprechung von publikationsrechten und der sicherung der gratifikation bestimmter (nicht-agraischer und nicht-handwerklicher) berufsgruppen. Aber die autoridentifikationstechnik schwächelt – plagiatsjäger mögen die ideologie des originalautors noch zu retten versuchen, aber die bedrohung der wissenschaftlich-künstlerischen professoralen (alles plagiatore) erzwingt eine diskussion über das plagiat, die unterscheidungen wie original/kopie/plagiat zwar zu sichern versucht, gerade dieses aber nicht mehr vermag. Das liegt vor allem an neuen schreib- und publikationstechniken, wie sie für konkrete textproduktion unerläßlich, oder doch mindestens ökonomisch profitabel geworden sind: Man denke an zitation und verweis in der wissenschaft, mash-up in der kunst – allgemein: der intertextualität.

Der anriß verdeutlicht: Die klärung kann sich längst nicht auf einen diskursbereich begrenzt. Gerade die unbedachte vermischung der diskursinteressen und -wertungsmethoden hindert die versachlichung, und es meint die literarische kunst zu verteidigen, wer die gratifikatorischen interessen eines arbeiters schützt. Nicht das letzteres verwerflich wäre: das behauptet gerade eine ideologie, die dann am originalgenie der kunst festhalten muß, die gratifikationssicherheit für den arbeiter verdeckt zu besorgen, damit dieser nicht widerspenstig wird. Solcherlei hindert die versachlichung. Das konzept des originalautors ist in keinem bereich zwingend; genauso aber in keinem zwingend ausgeschlossen.

Ich skizziere eine kurze genialogie des originalautors durch stützung des originalgenies und der einbettung bestimmter berufe in beamtentum und wissenschaft. Gerade so ausführlich, daß wir den autor als rechtskonzept von anderen trennen und gerade diesen ignorieren können. Uns interessiert dann die verbindung des autorkonzepts in bürokratie (der verbeamtete publizist) und der forschung (der originell-innovative autor) in der wissenschaft (das verbeamtete originalgenie) zu untersuchen.

Angemerkt: Daß sich die bereiche trennen lassen und ich fordere, sie sollten für die versachlichung auch getrennt werden, heißt nicht, sie wären vollkommen lösbar.

---

KURZE GENEALOGIE

Um 1800 wird die gratifikatorische absicherung bestimmter berufe notwendig, um ihre ausführung gesellschaftlich festigen zu können. Zu diesen gehören schriftsteller und journalisten, philosphen und wissenschaftler. {} Dies hat mehrere gründe: die zunehmende säkularisierung und damit die nötigung zur staatlichen institutionalisierung von wissenschaft, die … des mäzentums und einer damit einhergehenden bedrohung einer beruflichen beschäftigung. Nachdem wissenschaft, literatur, jounralismus in produktion und konsumtion wahrscheinlich geworden waren, war der verzicht recht unwahrscheinlich – viel zu viel hing davon ab.

Dort liegt auch der ursprung der originalgeniösen ideologie verborgen – sie erklärte fortschritt subjektbezogen; damit konnte einerseits der erfüllungsgeschichte der eschatologie eine fortschrittsgeschichte der aufklärung entgegengesetzt, und andererseits die genies als deren verwalter etabliert werden. Im originalgenie finden wir dabei die zentralen aspekte: die unterscheidung original/kopie, nicht nur mit der aufwertung des ersteren, sondern zugleich mit der implizit unterlegten unterscheidung innovation-originell/bezüglich-originell; andererseits der etablierung der engen verbindung des genius mit der schöpfung des originals, daß damit das originalgenie als solches etabliert, als andersherum das genie die entstehung von originalen (also die entstehung von innovation) erklärt. Die leistung der unterscheidung darf nicht unterbewertet werden, bedenkt man was zu gewährleisten war: die konzeption von innovation und originalgenie mußte recht, wissenschaft (bürokratischer forschung) und kunst genügen; sie mußte also verschiedene unterscheidungsmittel für verschiedene unterscheidungszwecke zugleich etablieren und gleichzeitig übertragbarkeit garantieren. {Übertragbarkeit meint nicht, daß sich die wissenschaft der rechtsmittel bediente, sondern daß (bspw.) einer unterscheidung im recht eine analoge unterscheidung in der wissenschaft gegenübersteht. Analog heißt, daß der gleiche ereignisbereich abgedeckt und diese ereignisse auf beiden seiten ablehnung oder zustimmung (nicht wissenschaftliche zustimmung und rechtliche ablehnung) erfahren. Der unterscheidung original/kopie interpretiert sich wissenschaftlich in der unterscheidung innovation/kopie, rechtlich als besitz/diebstahl. Diese unterscheidung ist nun aber sehr grob und genügt weder der publizistik noch der forschung. Jede weitere unterscheidung muß aber überall analoge unterscheidungen hervorrufen (oder gewinnt stabilität, wo sie dies tut und wird irritiert, wo dies nicht erfüllt ist.) So soll wissenschaftlich weder alles irgendwie neue gefördert, noch jeder gebrauch von (fremden) altem abgelehnt werden: es folgen die unterscheidungen innerhalb der unterscheidungsbereiche: 1. innovation/originalität, wobei innovation (neue neuheit: »erfindung«) gefördert, (nicht-innovative) originalität toleriert wird. Aber auch die kopie wird ein wichtigeres mittel, weshalb dann erlaubte von unerlaubter kopie (zitat/plagiat) unterschieden wird. (Es ergibt sich der zwischenbereich des reinen zitats: Wer eine arbeit von William James abtippt, sie einreicht, die gesamte arbeit aber als zitat kenntlich macht, fällt durch das seminar, ohne wissenschaftlich exkommuniziert zu werden. Der fall erscheint uns so seltsam, weil er ein leerbereich ist, mit dem wir nichts anfangen können: er ist weder vollkommen abzulehnen, noch wäre er irgendwie gefordert. Daß dieses beispiel seltsam wirkt, sollte zur verblüffung und faszinatin anregen.) Diese unterscheidungskonkretisierungen müssen sich im recht wiederfinden und tut es teils: auch das recht kennt legitimierte/nicht-legitimierte kopie (unter legitimierte kopie fällt dann nicht nur das zitat, sondern auch die von einem durch den autor vertraglich legitimierten verlag kopien). Nur auf zu innovation/originalität kennt das recht kein analogon. Das ist kein zu erklärendes problem, sondern zeigt den punkt, denn das dieses fehlt ist nicht grundlage für die behauptung der analogen unterscheidung, sondern für die irritation der unterscheidung innovation/originalität. _jedes_ original verdient rechtlichen schutz. Aber warum ist es nötig, eine originelle wiederholung schützen? Ist nicht auch das diebstahl an den innovationen anderer? (Ich darf nicht den text eines anderen als meinen ausgeben, aber wenn ich zwei in meinen worten wiederhole, ist es schützenswert.) Und wenn rechtlich keine mittel gefunden werden innovation von originalität zu unterscheiden, ließe sich die rückfrage stellen, wie dies in der wissenschaft möglich wäre, und jede antwort darauf würde die frage stellen, warum dies nicht rückübertragbar wäre. Die frage, welche art der kopie noch kunst sei und welche nur kopie trifft gerade dieses problem: wie ist nicht-innovative originalität von der kopie zu unterscheiden? Diese instabilität durch fehlende analogizität der unterscheidungen wird auch an anderen stellen deutlich: so kennt die kunst kein analogon zu zitat und kopie, sondern nur höchstens direkt kenntliche und unkenntliche kopie. Man muß nun zugleich von der kunst fordern, das plagiat abzulehnen, ohne ihr das mittel der unkenntlichen kopie zu berauben.)  Dies ermöglicht das originalgenie durch bestimmte offenheit in verbindung mit unbestimmter geschlossenheit {}. Dadurch wird die notwendige rückkopplung der verschiedenen diskursbereiche gewährleistet.

Das recht erfordert nicht nur eine unterscheidung von original/kopie, sondern zugleich eine personenbezogene unterscheidung von originalautor/kopierer. Eine unterscheidung die für die zunehmende differenzierung und komplexe strukturierung wissenschaftlicher textproduktion allerdings unhaltbar ist, allerdings übernommen werden _muß_, soll die gratifikation einzelner personen gewährleistet werden. (Die gratifikation einzelner menschen ist weder rechtlich noch wissenschaftlich nötig; selbst wenn personen häufig menschen entsprechen.) Nicht anders verhält es sich für die publizistik, die für weite verbreitung kopien benötigt. dies ist allerdings insofern kein problem, als die kopie nun weiter in legitimierte/nicht-legitimierte kopie unterscheidbar ist; dies wird in der wissenschaft als zitat/plagiat ausinterpretiert, in der publizistik als (bezahlte und vertraglich festgelegte) werkpublikation/(unbezahlte/unerlaubte) raubkopie. Während die wissenschaft die eigene reglementierung zitat/plagiat selbstständig durchsetzen kann (ich komme darauf zurück), benötigt die publizistik den rückbezug auf das recht: hier wird zur regelung von vertragsverhältnissen die konzeption des geistigen eigentums etabliert; ein genialer streich {}, der zugleich den bezug originalautor-originalgenie expliziert, während er diesen mit den bereits bestehenden mitteln der rechtlichen eigentumsregelung analogisiert. Dadurch müssen keine vollständig neuen rechtstechniken entwickelt, sondern nur alte mittel modifiziert werden.

---

BÜROKRATIE

Ich lasse sowohl das recht wie die kunst beiseite (und überlasse die beschäftigung damit gewitzteren geistern) und beschäftige mich mit der wissenschaft. Wie sich angedeutet haben mag, will ich zwischen forschung und wissenschaft unterscheiden, insofern wissenschaft bürokratische forschung meint. Letzteres wird dann in form von akademien (instiutionalisierte wissenschaft) und universitäten (lehre und forschung verbindende akademien){} Das komplexe auswirkungsverhältnis von forschung-lehre-institution scheint mir selten in angemessener weise behandelt zu werden. (Es wird dann vor allem auf einzelne unterschiede fixiert: lehrfreie forschung/lehrgebundene forschung, staatliche organistion/privatorganisation, nicht-akademische forschung/forschung. Daraus läßt sich viel lernen. Es bleiben dann allerdings blinde flecken; die werden dann häufig nicht eingestanden, sondern die erklärungslücken auf die einmal getroffene unterscheidung gezwungen.{})

Dieser umstand mag daran liegen, daß die forschung längst totalbürokratisiert es, das heißt, es kaum noch unbürokratisches forschen gibt; weder privatgelehrte spielen für die wissenschaft keine bedeutende rolle mehr {}; konzern- und firmengebundene forschung sowie populärwissenschaft haben sich längst selbst disqualifiziert, indem ihre unabhängigkeitsideologie längst zerstört wurde. Deshalb wird allenthalben gemeint, forschung sei und sei nur, was an universitäten gemacht werde.{} Selten war progression so konservativ.

Konservative progression.

Obwohl meist übersehen, gibt es progressive konservation: Der bewahrungsvorsatz paßt sich neuen gegebenheiten an und ist bereit, prioritäten offen zu ordnen und problematisieren.{} Ebenso gibt es konservative progression: Veränderungen und neuerungen erhalten etablierte strukturen.{} Dies soll nicht einem »wirklichen fortschritt« gegenübergestellt werden – ich vertrete keinen naiven ideologierealismus. Auch konservative progression ermöglicht fortschritt; und daß sie als mittel gewählt wurde, läßt mutmaßen, daß gerade sie (geordnete) progression ermöglicht hat. {} Indiz ist die zeit des 17. bis ins frühe 20. jh. Selten hätte man die konversion von organisationsstrukturen bei gleichzeitiger veränderlich- und veränderbarkeit derer methoden, techniken und ergebnisse beobachten können. Hier wird von der flexibilität durch starrheit profitiert.

Meine vermutung: dies liegt an der stärke bürokratischer organisation. Ihre formen sind starr, aber inhaltsleer; wodurch sie sowohl der judenvernichtung, als auch der demokratieerhaltung dienen können. Dafür ist die entwicklung Deutschlands beispielhaft: Denn an den verfahren zur beurteilung der gegner von nationalsozialisten und den dann folgenden zur rechtssprechung über die verbrechen der nationalsozialisten hat sich nichts, aber natürlich auch alles verändert. Die rechtsverfahren als solche mußte nicht abgelöst, sondern nur modifiziert werden, also bestimmte schritte angepaßt werden. (adresse {})

…

{Dies heißt durchaus nicht, professoren wären zwingend unfähig … Professoren sind ja nicht nur professoren, sondern auch mütter, künstlerinnen, muslima, wählerin, konsumentin und vielleicht auch etwas verrückte blogautorinnen. Das ein professor sich als professor nicht kritisch betrachten kann, hindert ja nicht, daß sie eine skeptische haltung gegen eigenes verhalten in bestimmten rollen einnimmt. Nur wird es mit den jahren handlungs… immer unwahrscheinlicher, da längere einübung von erklärungsmuster irritationen gekonnter und »innovativer« disqualifizieren läßt. Man kennt das: die wahrscheinlichkeit das ein 5 jähriger bezweifelt, daß jungens keine röcke tragen sollten ist sehr viel höher, als das ein 55 jähriger sich darüber verblüffen läßt. Aber das wunder langlebieger wunderei gibt es.

---

Daß das problem gerade in der kunst so zentral ist, liegt daran, an verarbeitungstechniken, welche die wissenschaft sich großteilig untersagt, für welche in der kunst ein freiraum geschaffen wurde: Der aneignung und verarbeitung eines themas durch variierte durchführung; die unterscheidung original/kopie probiert die kunst durch anwendung. (Gerade deshalb gibt es für Kusanowsky auch einen unterschied zwischen dem »spotler« und dem »verbrecher«. Beide nutzen die kopie für künstlerischen versuche. Jedoch deckt der sportler seine kopie als solche kenntlich macht und zugibt, während der verbrecher zugunsten seiner ökonomsichen verwertungsinteressen die kopie nicht als solche zugibt. (Deshalb ist letzteres auch keine künstlerischer verarbeitung der kopie, sondern die kopiertechnik ein mittel wirtschaftlicher profitsteigerung.)

https://differentia.wordpress.com/2016/08/10/kunst-sport-und-verbrechen/

Beltracchi konnte mit seiner Methode die Struktur der Kunst nicht beeindrucken, Landis dagegen konnte mit der selben Methode für die Beurteilung von Kunst eine Neuerung vorschlagen.

Dies war nicht immer so und mag sich wieder ändern. Vgl. Feyerabend.

Auch maler, zeichner, steinhauer, etc., ja auch komponisten. Ob in den malerischen und musischen produktionskünsten (im gegensatz zu malerischen und musischen exekutionskünsten) die autorkonzeption gleich beschrieben werden kann, weiß ich nicht. Ich vermute ja und nein. Sie lassen sich mit den gleichen strukturen beschreiben, solange vermieden wird zu behaupten, die entwicklungen wären vollständig analog.

{Was nicht das gleiche ist. Bestimmte offenheit meint hier, daß die anschließenden variativen anschlüsse immer zweckgebunden (nämlich der stützung ideal originalgenie) dient. Unbestimmte geschlossenheit meint, daß der begriff originalgenie alle variationen verwendungen zwingt eine universale einortbarkeit in allen bereichen (also einschluß/ausschluß) nach muster des originalgenies zu gewährleisten, mit welchen methoden auch immer.}

Ich bin in keiner weise sarkastisch: diese einführung diffizieler und komplizierter techniken finde ich faszinierend und bewundernswert. Ablehnungen des autorkonzepts gehen häufig mit plumper ablehnung vergangener leistungen und dem vorwurf einer gewissen »verwirrung« und »irrtümlichkeit« einher. Ein vokabular, das erstaunlich nah an der abgelehnten konzeption orientiert ist. – Auch die ablehnung einer _aufrechterhaltung_ des originalautorkonzepts erzwingt aber keinen rousseauistischen romantizismus, der zu einer rückkehrt zur natürlichen freiheit der kunst (oder was ähnlichem) aufruft. …

Meine unterscheidung akademie/universität ist nicht überflüssig. Die verbindung von wissenschaft und der lehre dieser wissenschaft bedingt und wird bedingt (durch) bestimmte organisationsformen, die sich auf die forschungstätigkeit auswirken: universitäten bilden ihr eigenes personal aus. Das gilt für akademien nicht zwingend.

Es ist gar nicht unwahrscheinlich, daß ich einfach etwas nicht gelesen habe. Ich lasse mich dann gerne aufklären und trage das hier nach. (In die kommentare unten oder an http://twitter.com/bertrandterrier[@bertrandterrier].)

Ich vermute das ändert sich. Durch das internet scheint ein neuer forschertyp ermöglicht zu werden, dem der einstige privatgelehrte am nächsten kommt. Ihn zu beschreiben und zu verfassen benötigt es aber wohl neue beobachtungs- und beschreibungsmittel, die nur unwahrscheinlicherweise von der universitären wissenschaft etabliert werden, da dieser typ ihre gratifikationssicherheiten bedroht.

Dies führt zu den schmalhirnigsten äußerungen, welche einem manches mal zweifeln lassen, ob an universitäten nicht prinzipiell die intelligenz fehle, forschung zu machen. So erzählt mir ein freund, auf die frage, wer denn ein philosoph sei, habe ihm ein dozent geantwortet: Der, der einen philosophischen abschluß hat. Das ist doof und man hofft auf höheres denkvermögen bei medizinern und pharmazeuten, von denen das eigene leben abhängt.

Interessant dazu der fall in  …, wo ein konservativer staat für die aufnahme syrischer flüchtlinge stimmt.

So paradox das klingt, sieht man’s überall: Das grundgesetz ist die neuformulierung der biblischen gebote, die aufklärung ist säkularisierte theologie, 2016 ist 1933, etc. Dies heißt nicht, jede erklärung eines (vermeintlich) neuen phänomens durch ein altes sei prinzipiell schlecht und falsch. Es läßt sich jedoch eine selbstverpflichtete blindheit gegen neues beobachten. Jedoch läßt sich eine tendenz zur ignoranz neuer phänomene beobachten:

Wenn der Schreiber dafür sorgt, dass der Leser nur etwas Bekanntes wiederfindet. kann die Beobachtung von Neuem gut behindert werden.
— Klaus Kusanowsky (@kusanowsky) 20. Januar 2017

Die Verhinderung von Neuem gelingt, indem man für den Fortbestand von Nichtsneuem sorgt.
— Klaus Kusanowsky (@kusanowsky) 20. Januar 2017

Dies liegt nicht an der ignoranz einer große masse von wissenschaftlern; sondern an der festgelegtheit von beobachtungstechnik, welche die eigenen probleme grundsätzlich blindsetzt. Es benötigt ja kein kurzes training, um sich die blindsetzung bestimmter probleme und die adelung anderer anzutrainieren (das hat sich bereits auf ca. 30 jahre (grundschule, schule, studium, promotion, habilitation) gesteigert.

Ich meine »fortschritt« nicht ideologisch, weshalb ich lieber von progression spreche; was nichts anderes heißt und nur einer verwirrung dient, der autor mache hier wohl auf eine verschobene implikation aufmerksam. Progression ist nicht gut oder schlecht, aber sie ist auch kein rein zeitlicher wechsel von annahmen. Sie meint, späteres bezöge sich auf früheres; das gälte aber auch für eine kultur, die plötzlich großen technologieverzicht leistet – insofern dies ja ein weiterschreiten und eben kein zurückschreiten ist. (Vergessen ist ein schweres unterfangen: ich schreibe darüber hier.)

Der wichtigkeit der subjektentlastung durch adressierbarkeit hat meines wissens nach @ReisAgainst innoviert. Zu einem recht lahmen vortrag zur geschichte des kapitalismus in einem marxistisch-kommunistischen kontext wurden da »ausnutzen« und »abhängigkeit« des arbeiters durch und von den kapitalistischen betriebsbesitzern der »selbstständigkeit« des bauern mit eigenem grundstück gegenübergestellt. @ReisAgainst machte den (sehr intelligenten) punkt, daß nur der arbeiter über eine adresse für beschwerde und forderung habe, während dem bauer bei dürre ein streik nichts helfe. Zu der bedeutung von adressierbarkeit hoffe ich auf einen text von ihm; da scheint mir fiel interessantes dran zu sein. Es ließe sich dann auch fragen, ob nicht die adressierbarkeit von allem an jeden ein problem der modernen bürokratie ist. Denn die totalität der adressierbarkeit führt doch gerade dazu, daß jeder angesprochene schlicht auf andere adressen verweis, bis man aufgibt oder mit dem verweis auf die bürokratischen verfahren selbst abserviert wird. Vgl. hierzu auch Arendt [MuG: 80]:

____
Büroktatie ist diejenige Staatsform, in welcher es niemanden mehr gibt, der Macht ausübt; und wo alle gleichermaßen ohnmächtig sind, haben wir eine Tyrannis ohne Tyrannen.
____

---

LITERATUR

Luhmann, Niklas: Wissenschaft der Gesellschaft (stw 1001), Frankfurt/M, ^7^2015 [1990]


added handler for every 'owned' or 'active' command changed start_traffic / stop_traffic to have array of port id

The TRex RPC Server
===================
:author: Itay Marom
:email: <imarom@cisco.com>
:revnumber: 1.70-0.0
:quotes.++:
:numbered:
:web_server_url: http://trex-tgn.cisco.com/trex
:local_web_server_url: csi-wiki-01:8181/trex

== RPC Support On TRex

TRex implements a RPC protocol in order to config, view and
in general execute remote calls on TRex

In this document we will provide information on
how a client can implement the protocol used to communicate with TRex

In general, we will describe the following:

* *Transport Layer* - The transport layer used to communicate with TRex server
* *RPC Reprensentation Protocol* - The format in which remote procedures are carried

=== Transport Layer

TRex server transport layer is implemented using ZMQ.

The default configuration is TCP on port 5555, however this is configurable.

{zwsp} +
The communication model is based on the request-reply ZMQ model:

http://zguide.zeromq.org/page:all#Ask-and-Ye-Shall-Receive

{zwsp} +

for more on ZMQ and implementation please refer to:
{zwsp} +
http://zeromq.org/intro:read-the-manual

=== RPC Reprensentation Protocol

The RPC reprensentation protocol is JSON RPC v2.0.
Every request and response will be encoded in a JSON RPC v2.0 format.

{zwsp} +

For more info on JSON RPC v2.0 spec please refer to:
{zwsp} +

http://www.jsonrpc.org/specification

{zwsp} +

Later on in the document we will describe all the supported commands.

=== TRex RPC Mock Server
Before we get into the commands, it's worth mentioning that TRex has a mock RPC server
designed to allow playing around with the server in order to understand the response
and perform adjustments to the request.

TRex also provides a Python based console that can connect to the server (mock or real) and
send various commands to the server.

==== Building The Mock Server
Building the mock server is performed like this:
[source,bash]
----
trex-core/linux>  ./b configure
trex-core/linux>  ./b --target=mock-rpc-server-64-debug
----

==== Running The Mock Server
Launching the mock server is performed like this:

[source,bash]
----

trex-core/scripts> ./mock-rpc-server-64-debug

-= Starting RPC Server Mock =-

Listening on tcp://localhost:5050 [ZMQ]

Setting Server To Full Verbose

Server Started

----

==== Using The TRex Console To Interact
When the mock server is up, you can already send commands to the server.
{zwsp} +
{zwsp} +

Let's demonstrate the operation with the Python based TRex console:

{zwsp} +

[source,bash]
----
trex-core/scripts> ./trex-console

Connecting To RPC Server On tcp://localhost:5050
[SUCCESS]

-=TRex Console V1.0=-

Type 'help' or '?' for supported actions

TRex >

----
As we will see later on, a basic RPC command supported by the server is 'ping'.
{zwsp} +
Let's issue a ping command to the server and see what happens on both sides:

{zwsp} +
{zwsp} +

On the 'client' side:

[source,bash]
----
TRex > verbose on

verbose set to on

TRex > ping

-> Pinging RPC server
[verbose] Sending Request To Server:

{
    "id": "l0tog11a",
    "jsonrpc": "2.0",
    "method": "ping",
    "params": null
}

[verbose] Server Response:

{
    "id": "l0tog11a",
    "jsonrpc": "2.0",
    "result": "ACK"
}

[SUCCESS]

----
On the 'server' side:

[source,bash]
----

trex-core/scripts> ./mock-rpc-server-64-debug

-= Starting RPC Server Mock =-

Listening on tcp://localhost:5050 [ZMQ]

Setting Server To Full Verbose

Server Started

[verbose][req resp] Server Received:

{
   "id" : "maa5a3g1",
   "jsonrpc" : "2.0",
   "method" : "ping",
   "params" : null
}

[verbose][req resp] Server Replied:

{
   "id" : "maa5a3g1",
   "jsonrpc" : "2.0",
   "result" : "ACK"
}

----

== RPC Server State Machine
The RPC server can be in numbered of states, each state provides other subset of the commands
that are allowed to be executed.

We define the following possible states:

* *unowned* - The server is either unowned or another user is owning the device
* *owned* - The server has been acquired by the client
* *active* - The server is in the middle of injecting traffic - currently active

Each command will specify on which states it is possible to execute it.

For commands valid only on 'owned' or 'active', a field called ''handler'' 'MUST' be passed
along with the rest of the parameters.

This will identify the connection.

image::images/rpc_states.png[title="RPC Server States",align="left",width=200, link="images/rpc_states.png"]

== RPC Commands
The following RPC commands are supported

=== Ping
* *Name* - 'ping'
* *Valid States* - 'all'
* *Description* - Pings the TRex server
* *Paramters* - None
* *Result* ['string'] - "ACK" On Sucess

Example:

[source,bash]
----
'Request':

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "ping",
    "params": null
}

'Response':

{
   "jsonrpc" : "2.0",
   "id" : 1,
   "result" : "ACK"
}

----

=== Get Registered Commands
* *Name* - 'get_reg_cmds'
* *Valid States* - 'all'
* *Description* - Queries the server for all the registered commands
* *Paramters* - None
* *Result* ['array'] - A list of all the supported commands by the server

Example:

[source,bash]
----
'Request':

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "get_reg_cmds",
    "params": null
}

'Response':

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": [
        "remove_all_streams",
        "remove_stream",
        "add_stream",
        "get_reg_cmds",
        "ping",
        "test_sub",
        "get_version",
        "test_add"
    ]
}

----

=== Get Version
* *Name* - 'get_version'
* *Valid States* - 'all'
* *Description* - Queries the server for version information
* *Paramters* - None
* *Result* ['object'] - See table below

.Object type 'return values for get_version'
[options="header",cols="1,1,3"]
|=================
| Field         | Type     | Description
| version       | string   | TRex version
| build_date    | string   | build date
| build_time    | string   | build time
| built_by      | string   | who built this version
|=================

=== Get System Info
* *Name* - 'get_system_info'
* *Description* - Queries the server for system properties
* *Paramters* - None
* *Result* ['object'] - See table below

.return value: 'get_system_info'
[options="header",cols="1,1,3"]
|=================
| Field          | Type     | Description
| dp_core_count  | int      | DP core count
| core_type      | string   | DP core type
| hostname       | string   | machine host name
| ip             | string   | machine IP
| uptime         | string   | uptime of the server
| port_count     | int      | number of ports on the machine
| ports          | array    | arary of object ''port'' - see below
|=================

.return value: 'get_system_info'.'port'
[options="header",cols="1,1,3"]
|=================
| Field          | Type     | Description
| driver         | string   | driver type
| speed          | string   | speed of the port (1g, 10g, 40g, 100g)
| status         | string   | up / down
|=================

=== Get Owner
* *Name* - 'get_owner'
* *Valid States* - 'all'
* *Description* - Queries the server for current owner
* *Paramters* - None
* *Result* ['string'] - owner name if exists, otherwise 'none'

[source,bash]
----

'Request':

{
    "id": "hxjkuwj9",
    "jsonrpc": "2.0",
    "method": "get_owner",
    "params": null
}

'Response':

{
    "id": "hxjkuwj9",
    "jsonrpc": "2.0",
    "result": {
        "owner": "itay"
    }
}

----

=== Acquire
* *Name* - 'Acquire'
* *Valid States* - 'all'
* *Description* - Takes ownership on the device.
* *Paramters* -
** *user* ['string'] - User name aquiring the system
** *force* ['boolean'] - force action even if another user is holding the device
* *Result* ['string'] - 'unique' connection handler for future requests

[source,bash]
----

'Request':

{
    "id": "b1tr56yz",
    "jsonrpc": "2.0",
    "method": "Acquire",
    "params": {
        "force": false,
        "user": "itay"
    }
}

'Response':

{
    "id": "b1tr56yz",
    "jsonrpc": "2.0",
    "result": "4cBWDxS2"
}
----

=== Release
* *Name* - 'release'
* *Valid States* - 'owned'
* *Description* - Release owernship over the device
* *Paramters* -
** *handler* ['string'] - unique connection handler
* *Result* ['string'] - "ACK" on success

[source,bash]
----

'Request':

{
    "id": "m785dxwd",
    "jsonrpc": "2.0",
    "method": "release",
    "params": {
        "handler": "37JncCHr"
    }
}

'Response':

{
    "id": "m785dxwd",
    "jsonrpc": "2.0",
    "result": "ACK"
}
----

=== Add Stream
* *Name* - 'add_stream'
* *Valid States* - 'owned'
* *Description* - Adds a stream to a port
* *Paramters*
** *handler* ['string'] - unique connection handler
** *port_id* ['int'] - port id associated with this stream
** *stream_id* ['int'] - stream id associated with the stream object
** *stream* - object of type xref:stream_obj['stream']
* *Result* ['string'] - "ACK" in case of success

==== Object type 'stream' anchor:stream_obj[]

Add_stream gets a single parameter of type object.

The format of that object is as follows:

.Object type 'stream'
[options="header",cols="1,1,3"]
|=================
| Field       | Type    | Description
| enabled     | boolean | is this stream enabled
| self_start  | boolean | is this stream triggered by starting injection or triggered by another stream
| isg         | double  | ['usec'] inter stream gap - delay time in usec until the stream is started
| next_stream | int     | next stream to start after this stream. -1 means stop after this stream
| packet      | object  | object of type xref:packet_obj['packet']
| mode        | object  | object of type xref:mode_obj['mode']
| vm          | array   | array of objects of type xref:vm_obj['vm']
| rx_stats    | object  | object of type xref:rx_stats_obj['rx_stats']
|=================

===== Object type 'packet' anchor:packet_obj[]
packet contains binary and meta data

.Object type 'packet'
[options="header",cols="1,1,3"]
|=================
| Field       | Type        | Description
| binary      | byte array  | binary dump of the packet to be used in the stream as array of bytes
| meta        | string      | meta data object. opaque to the RPC server. will be passed on queries
|=================

===== Object type 'mode' anchor:mode_obj[]
mode object can be 'one' of the following objects:

.Object type 'mode - continuous'
[options="header",cols="1,1,3"]
|=================
| Field       | Type        | Description
| type        | string      | ''continuous''
| pps         | double      | rate in packets per second
|=================

.Object type 'mode - single_burst'
[options="header",cols="1,1,3"]
|=================
| Field         | Type        | Description
| type          | string      | ''single_burst''
| pps           | double      | rate in packets per second
| total pkts    | int         | total packets in the burst
|=================

.Object type 'mode - multi_burst'
[options="header",cols="1,1,3"]
|=================
| Field          | Type        | Description
| type           | string      | ''multi_burst''
| pps            | int         | rate in packets per second
| pkts_per_burst | int         | packets in a single burst
| ibg            | double      | ['usec'] inter burst gap. delay between bursts in usec
| count          | int         | number of bursts. ''0'' means loop forever, ''1'' will fall back to single burst
|=================

===== Object type 'vm' anchor:vm_obj[]
Array of VM instruction objects to be used with this stream

Any element in the array can be one of the following object types:

.Object type 'vm - fix_checksum_ipv4'
[options="header",cols="1,1,3"]
|=================
| Field       | Type        | Description
| type        | string      | ''fix_checksum_ipv4''
| pkt_offset  | uint16      | offset of the field to fix
|=================

.Object type 'vm - flow_var'
[options="header",cols="1,1,3"]
|=================
| Field       | Type                        | Description
| type        | string                      | ''flow_var'''
| name        | string                      | flow var name - this should be a unique identifier
| size        | [1,2,4,8]                   | size of the flow var in bytes
| op          | ['inc', 'dec', 'random']    | operation type to perform on the field
| init value  | uint64_t as string          | init value for the field
| min value   | uint64_t as string          | minimum value for the field
| max value   | uint64_t as string          | maximum value for the field
|=================

.Object type 'vm - write_flow_var'
[options="header",cols="1,1,3"]
|=================
| Field         | Type        | Description
| type          | string      | ''write_flow_var''
| name          | string      | flow var name to write
| pkt_offset    | uint16      | offset at the packet to perform the write
| add_value     | int         | delta to add to the field prior to writing - can be negative
| is_big_endian | boolean     | should write as big endian or little
|=================

===== Object type 'rx_stats' anchor:rx_stats_obj[]
Describes rx stats for the stream

{zwsp} +

'IMPORTANT':

In case rx_stats is enabled, meta data will be written in the end of the packet.

please consider the following:

==== Constrains
* *performance* - this will have performance impact as rx packets will be examined
* *override* - up to 10 bytes at the end of the packet will be overidden by the meta data required

==== The bytes needed for activating 'rx_stats':

* *rx_stream_id* consumes 2 bytes
* *seq_enabled* consumes 4 bytes
* *latency_enabled* consumes 4 bytes

so if no seq or latency are enabled 2 bytes will be used.

if seq or latency alone are enabled, 6 bytes will be used.

if both are enabled then 10 bytes will be used.

.Object type 'rx_stats'
[options="header",cols="1,1,3"]
|=================
| Field            | Type        | Description
| enabled          | boolean     | is rx_stats enabled for this stream
| seq_enabled      | boolean     | should write 32 bit sequence
| latency_enabled  | boolean     | should write 32 bit latency
|=================

[source,bash]
----

'Request':

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "add_stream",
    "params": {
        "handler": "37JncCHr",
        "port_id": 1,
	"stream_id": 502
        "stream": {
            "enabled": true,
            "isg": 4.3,
            "mode": {
                "pps": 3,
                "total_pkts": 5000,
                "type": "single_burst"
            },
            "next_stream_id": -1,
            "packet": {
                "binary": [
                    4,
                    1,
                    255
                ],
                "meta": ""
            },
            "rx_stats": {
                "enabled": false
            },
            "self_start": true,
        }
    }
}

'Response':

{
    "id": 1,
    "jsonrpc": "2.0",
    "result": "ACK"
}

----

=== Remove Stream
* *Name* - 'remove_stream'
* *Valid States* - 'owned'
* *Description* - Removes a stream from a port
* *Paramters*
** *handler* ['string'] - unique connection handler
** *port_id* ['int'] - port assosicated with the stream.
** *stream_id* ['int'] - stream to remove

* *Result* ['string'] - "ACK" in case of success

[source,bash]
----

'Request':

{
    "id": 1
    "jsonrpc": "2.0",
    "method": "remove_stream",
    "params": {
        "handler": "37JncCHr",
        "port_id": 1,
        "stream_id": 502
    }
}

'Response':

{
    "id": 1
    "jsonrpc": "2.0",
    "result": "ACK"
}

----

=== Get Stream ID List
* *Name* - 'get_stream_list'
* *Valid States* - 'owned', 'active'
* *Description* - fetch all the assoicated streams for a port
* *Paramters*
** *handler* ['string'] - unique connection handler
** *port_id* ['int'] - port to query for registered streams

* *Result* ['array'] - array of 'stream_id'

[source,bash]
----

'Request':

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "get_stream_list",
    "params": {
        "handler": "37JncCHr",
        "port_id": 1
    }
}

'Response':

{
    "id": 1,
    "jsonrpc": "2.0",
    "result": [
        502,
        18
    ]
}

----

=== Get Stream
* *Name* - 'get_stream'
* *Valid States* - 'owned', 'active'
* *Description* - get a specific stream object
* *Paramters*
** *handler* ['string'] - unique connection handler
** *port_id* ['int'] - port for the associated stream
** *stream_id* ['int'] - the requested stream id

* *Result* ['object'] - object xref:stream_obj['stream']

[source,bash]
----

'Request':

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "get_stream",
    "params": {
        "handler": "37JncCHr",
        "port_id": 1,
        "stream_id": 7
    }
}

'Response':

{
    "id": 1,
    "jsonrpc": "2.0",
    "result": {
        "stream": {
            "enabled": true,
            "isg": 4.3,
            "mode": {
                "pps": 3,
                "type": "continuous"
            },
            "next_stream_id": -1,
            "packet": {
                "binary": [
                    4,
                    1,
                    255
                ],
                "meta": ""
            },
            "self_start": true
        }
    }
}

----

=== Remove All Streams
* *Name* - 'remove_all_streams'
* *Valid States* - 'owned'
* *Description* - remove all streams from a port
* *Paramters*
** *handler* ['string'] - unique connection handler
** *port_id* ['int'] - port for the associated stream

* *Result* ['string'] - "ACK" on success

[source,bash]
----

'Request':

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "remove_all_streams",
    "params": {
        "handler": "37JncCHr",
        "port_id": 2
    }
}

'Response':

{
    "id": 1,
    "jsonrpc": "2.0",
    "result": "ACK"
}

----

=== Start Traffic
* *Name* - 'start_traffic'
* *Valid States* - 'owned'
* *Description* - Starts the traffic on a specific port. if traffic has already started an error will be returned
* *Paramters*
** *handler* ['string'] - unique connection handler
** *port_id* ['array'] - array of port id on which to start traffic

* *Result* ['string'] - "ACK" on success

[source,bash]
----

'Request':

{
    "id": "b3llt8hs",
    "jsonrpc": "2.0",
    "method": "start_traffic",
    "params": {
        "handler": "37JncCHr",
        "port_id": [3, 4]
    }

'Response':

{
    "id": "b3llt8hs",
    "jsonrpc": "2.0",
    "result": "ACK"
}

----

=== Stop Traffic
* *Name* - 'stop_traffic'
* *Valid States* - 'active'
* *Description* - Stops the traffic on a specific port. if the port has already started nothing will happen
* *Paramters*
** *handler* ['string'] - unique connection handler
** *port_id* ['array'] - array of port id on which to stop traffic

* *Result* ['string'] - "ACK" on success

[source,bash]
----

'Request':

{
    "id": "h2fyhni7",
    "jsonrpc": "2.0",
    "method": "stop_traffic",
    "params": {
        "handler": "37JncCHr",
        "port_id": [3, 4]
    }
}

'Response':

{
    "id": "h2fyhni7",
    "jsonrpc": "2.0",
    "result": "ACK"
}

----

The TRex RPC Server
===================
:author: Itay Marom
:email: <imarom@cisco.com>
:revnumber: 1.70-0.0
:quotes.++:
:numbered:
:web_server_url: http://trex-tgn.cisco.com/trex
:local_web_server_url: csi-wiki-01:8181/trex

== RPC Support On TRex

TRex implements a RPC protocol in order to config, view and
in general execute remote calls on TRex

In this document we will provide information on
how a client can implement the protocol used to communicate with TRex

In general, we will describe the following:

* *Transport Layer* - The transport layer used to communicate with TRex server
* *RPC Reprensentation Protocol* - The format in which remote procedures are carried

=== Transport Layer

TRex server transport layer is implemented using ZMQ.

The default configuration is TCP on port 5555, however this is configurable.

{zwsp} +
The communication model is based on the request-reply ZMQ model:

http://zguide.zeromq.org/page:all#Ask-and-Ye-Shall-Receive

{zwsp} +

for more on ZMQ and implementation please refer to:
{zwsp} +
http://zeromq.org/intro:read-the-manual

=== RPC Reprensentation Protocol

The RPC reprensentation protocol is JSON RPC v2.0.
Every request and response will be encoded in a JSON RPC v2.0 format.

{zwsp} +

For more info on JSON RPC v2.0 spec please refer to:
{zwsp} +

http://www.jsonrpc.org/specification

{zwsp} +

Later on in the document we will describe all the supported commands.

=== TRex RPC Mock Server
Before we get into the commands, it's worth mentioning that TRex has a mock RPC server
designed to allow playing around with the server in order to understand the response
and perform adjustments to the request.

TRex also provides a Python based console that can connect to the server (mock or real) and
send various commands to the server.

==== Building The Mock Server
Building the mock server is performed like this:
[source,bash]
----
trex-core/linux>  ./b configure
trex-core/linux>  ./b --target=mock-rpc-server-64-debug
----

==== Running The Mock Server
Launching the mock server is performed like this:

[source,bash]
----

trex-core/scripts> ./mock-rpc-server-64-debug

-= Starting RPC Server Mock =-

Listening on tcp://localhost:5050 [ZMQ]

Setting Server To Full Verbose

Server Started

----

==== Using The TRex Console To Interact
When the mock server is up, you can already send commands to the server.
{zwsp} +
{zwsp} +

Let's demonstrate the operation with the Python based TRex console:

{zwsp} +

[source,bash]
----
trex-core/scripts> ./trex-console

Connecting To RPC Server On tcp://localhost:5050
[SUCCESS]

-=TRex Console V1.0=-

Type 'help' or '?' for supported actions

TRex >

----
As we will see later on, a basic RPC command supported by the server is 'ping'.
{zwsp} +
Let's issue a ping command to the server and see what happens on both sides:

{zwsp} +
{zwsp} +

On the 'client' side:

[source,bash]
----
TRex > verbose on

verbose set to on

TRex > ping

-> Pinging RPC server
[verbose] Sending Request To Server:

{
    "id": "l0tog11a",
    "jsonrpc": "2.0",
    "method": "ping",
    "params": {}
}

[verbose] Server Response:

{
    "id": "l0tog11a",
    "jsonrpc": "2.0",
    "result": "ACK"
}

[SUCCESS]

----
On the 'server' side:

[source,bash]
----

trex-core/scripts> ./mock-rpc-server-64-debug

-= Starting RPC Server Mock =-

Listening on tcp://localhost:5050 [ZMQ]

Setting Server To Full Verbose

Server Started

[verbose][req resp] Server Received:

{
   "id" : "maa5a3g1",
   "jsonrpc" : "2.0",
   "method" : "ping",
   "params" : {}
}

[verbose][req resp] Server Replied:

{
   "id" : "maa5a3g1",
   "jsonrpc" : "2.0",
   "result" : "ACK"
}

----

== RPC Server State Machine
The RPC server can be in numbered of states, each state provides other subset of the commands
that are allowed to be executed.

We define the following possible states:

* *unowned* - The server is either unowned or another user is owning the device
* *owned* - The server has been acquired by the client
* *active* - The server is in the middle of injecting traffic - currently active

Each command will specify on which states it is possible to execute it.

For commands valid only on 'owned' or 'active', a field called ''handler'' 'MUST' be passed
along with the rest of the parameters.

This will identify the connection.

image::images/rpc_states.png[title="RPC Server States",align="left",width=200, link="images/rpc_states.png"]

== RPC Commands
The following RPC commands are supported

=== Ping
* *Name* - 'ping'
* *Valid States* - 'all'
* *Description* - Pings the TRex server
* *Paramters* - None
* *Result* - "ACK" On Sucess

Example:

[source,bash]
----
'Request':

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "ping",
    "params": null
}

'Response':

{
   "jsonrpc" : "2.0",
   "id" : 1,
   "result" : "ACK"
}

----

=== Get Registered Commands
* *Name* - 'get_reg_cmds'
* *Valid States* - 'all'
* *Description* - Queries the server for all the registered commands
* *Paramters* - None
* *Result* - A list of all the supported commands by the server

Example:

[source,bash]
----
'Request':

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "get_reg_cmds",
    "params": null
}

'Response':

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": [
        "remove_all_streams",
        "remove_stream",
        "add_stream",
        "get_reg_cmds",
        "ping",
        "test_sub",
        "get_version",
        "test_add"
    ]
}

----

=== Get Version
* *Name* - 'get_version'
* *Valid States* - 'all'
* *Description* - Queries the server for version information
* *Paramters* - None
* *Result* - See table below

.Object type 'return values for get_version'
[options="header",cols="1,1,3"]
|=================
| Field         | Type     | Description
| version       | string   | TRex version
| build_date    | string   | build date
| build_time    | string   | build time
| built_by      | string   | who built this version
|=================

=== Get System Info
* *Name* - 'get_system_info'
* *Description* - Queries the server for system properties
* *Paramters* - None
* *Result* - See table below

.return value: 'get_system_info'
[options="header",cols="1,1,3"]
|=================
| Field          | Type     | Description
| dp_core_count  | int      | DP core count
| core_type      | string   | DP core type
| hostname       | string   | machine host name
| ip             | string   | machine IP
| uptime         | string   | uptime of the server
| port_count     | int      | number of ports on the machine
| ports          | array    | arary of object ''port'' - see below
|=================

.return value: 'get_system_info'.'port'
[options="header",cols="1,1,3"]
|=================
| Field          | Type     | Description
| driver         | string   | driver type
| speed          | string   | speed of the port (1g, 10g, 40g, 100g)
| status         | string   | up / down
|=================

=== Get Owner
* *Name* - 'get_owner'
* *Valid States* - 'all'
* *Description* - Queries the server for current owner
* *Paramters* - None
* *Result* ['string'] - owner name if exists, otherwise 'none'

[source,bash]
----

'Request':

{
    "id": "hxjkuwj9",
    "jsonrpc": "2.0",
    "method": "get_owner",
    "params": null
}

'Response':

{
    "id": "hxjkuwj9",
    "jsonrpc": "2.0",
    "result": {
        "owner": "itay"
    }
}

----

=== Acquire
* *Name* - 'Acquire'
* *Valid States* - 'all'
* *Description* - Takes ownership on the device.
* *Paramters* -
** *user* ['string'] - User name aquiring the system
** *force* ['boolean'] - force action even if another user is holding the device
* *Result* ['string'] - 'unique' identifier for future requests

[source,bash]
----

'Request':

{
    "id": "b1tr56yz",
    "jsonrpc": "2.0",
    "method": "Acquire",
    "params": {
        "force": false,
        "user": "itay"
    }
}

'Response':

{
    "id": "b1tr56yz",
    "jsonrpc": "2.0",
    "result": "4cBWDxS2"
}
----

=== Release
* *Name* - 'release'
* *Valid States* - 'owned'
* *Description* - Release owernship over the device
* *Paramters* -
** *handler* ['string'] - unique identifier for the message
* *Result* ['string'] - "ACK" on success

[source,bash]
----

'Request':

{
    "id": "m785dxwd",
    "jsonrpc": "2.0",
    "method": "release",
    "params": {
        "handler": "37JncCHr"
    }
}

'Response':

{
    "id": "m785dxwd",
    "jsonrpc": "2.0",
    "result": "ACK"
}
----

=== Add Stream
* *Name* - 'add_stream'
* *Valid States* - 'owned'
* *Description* - Adds a stream to a port
* *Paramters*
** *port_id* - port id associated with this stream
** *stream_id* - stream id associated with the stream object
** *stream* - object of type xref:stream_obj['stream']
* *Result* - ACK in case of success

==== Object type 'stream' anchor:stream_obj[]

Add_stream gets a single parameter of type object.

The format of that object is as follows:

.Object type 'stream'
[options="header",cols="1,1,3"]
|=================
| Field       | Type    | Description
| enabled     | boolean | is this stream enabled
| self_start  | boolean | is this stream triggered by starting injection or triggered by another stream
| isg         | double  | ['usec'] inter stream gap - delay time in usec until the stream is started
| next_stream | int     | next stream to start after this stream. -1 means stop after this stream
| packet      | object  | object of type xref:packet_obj['packet']
| mode        | object  | object of type xref:mode_obj['mode']
| vm          | array   | array of objects of type xref:vm_obj['vm']
| rx_stats    | object  | object of type xref:rx_stats_obj['rx_stats']
|=================

===== Object type 'packet' anchor:packet_obj[]
packet contains binary and meta data

.Object type 'packet'
[options="header",cols="1,1,3"]
|=================
| Field       | Type        | Description
| binary      | byte array  | binary dump of the packet to be used in the stream as array of bytes
| meta        | string      | meta data object. opaque to the RPC server. will be passed on queries
|=================

===== Object type 'mode' anchor:mode_obj[]
mode object can be 'one' of the following objects:

.Object type 'mode - continuous'
[options="header",cols="1,1,3"]
|=================
| Field       | Type        | Description
| type        | string      | ''continuous''
| pps         | double      | rate in packets per second
|=================

.Object type 'mode - single_burst'
[options="header",cols="1,1,3"]
|=================
| Field         | Type        | Description
| type          | string      | ''single_burst''
| pps           | double      | rate in packets per second
| total pkts    | int         | total packets in the burst
|=================

.Object type 'mode - multi_burst'
[options="header",cols="1,1,3"]
|=================
| Field          | Type        | Description
| type           | string      | ''multi_burst''
| pps            | int         | rate in packets per second
| pkts_per_burst | int         | packets in a single burst
| ibg            | double      | ['usec'] inter burst gap. delay between bursts in usec
| count          | int         | number of bursts. ''0'' means loop forever, ''1'' will fall back to single burst
|=================

===== Object type 'vm' anchor:vm_obj[]
Array of VM instruction objects to be used with this stream

Any element in the array can be one of the following object types:

.Object type 'vm - fix_checksum_ipv4'
[options="header",cols="1,1,3"]
|=================
| Field       | Type        | Description
| type        | string      | ''fix_checksum_ipv4''
| pkt_offset  | uint16      | offset of the field to fix
|=================

.Object type 'vm - flow_var'
[options="header",cols="1,1,3"]
|=================
| Field       | Type                        | Description
| type        | string                      | ''flow_var'''
| name        | string                      | flow var name - this should be a unique identifier
| size        | [1,2,4,8]                   | size of the flow var in bytes
| op          | ['inc', 'dec', 'random']    | operation type to perform on the field
| init value  | uint64_t as string          | init value for the field
| min value   | uint64_t as string          | minimum value for the field
| max value   | uint64_t as string          | maximum value for the field
|=================

.Object type 'vm - write_flow_var'
[options="header",cols="1,1,3"]
|=================
| Field         | Type        | Description
| type          | string      | ''write_flow_var''
| name          | string      | flow var name to write
| pkt_offset    | uint16      | offset at the packet to perform the write
| add_value     | int         | delta to add to the field prior to writing - can be negative
| is_big_endian | boolean     | should write as big endian or little
|=================

===== Object type 'rx_stats' anchor:rx_stats_obj[]
Describes rx stats for the stream

{zwsp} +

'IMPORTANT':

In case rx_stats is enabled, meta data will be written in the end of the packet.

please consider the following:

==== Constrains
* *performance* - this will have performance impact as rx packets will be examined
* *override* - up to 10 bytes at the end of the packet will be overidden by the meta data required

==== The bytes needed for activating 'rx_stats':

* *rx_stream_id* consumes 2 bytes
* *seq_enabled* consumes 4 bytes
* *latency_enabled* consumes 4 bytes

so if no seq or latency are enabled 2 bytes will be used.

if seq or latency alone are enabled, 6 bytes will be used.

if both are enabled then 10 bytes will be used.

.Object type 'rx_stats'
[options="header",cols="1,1,3"]
|=================
| Field            | Type        | Description
| enabled          | boolean     | is rx_stats enabled for this stream
| seq_enabled      | boolean     | should write 32 bit sequence
| latency_enabled  | boolean     | should write 32 bit latency
|=================

[source,bash]
----

'Request':

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "add_stream",
    "params": {
        "port_id": 1,
	"stream_id": 502
        "stream": {
            "enabled": true,
            "isg": 4.3,
            "mode": {
                "pps": 3,
                "total_pkts": 5000,
                "type": "single_burst"
            },
            "next_stream_id": -1,
            "packet": {
                "binary": [
                    4,
                    1,
                    255
                ],
                "meta": ""
            },
            "rx_stats": {
                "enabled": false
            },
            "self_start": true,
        }
    }
}

'Response':

{
    "id": 1,
    "jsonrpc": "2.0",
    "result": "ACK"
}

----

=== Remove Stream
* *Name* - 'remove_stream'
* *Valid States* - 'owned'
* *Description* - Removes a stream from a port
* *Paramters*
** *port_id* - port assosicated with the stream.
** *stream_id* - stream to remove

* *Result* - ACK in case of success

[source,bash]
----

'Request':

{
    "id": 1
    "jsonrpc": "2.0",
    "method": "remove_stream",
    "params": {
        "port_id": 1,
        "stream_id": 502
    }
}

'Response':

{
    "id": 1
    "jsonrpc": "2.0",
    "result": "ACK"
}

----

=== Get Stream ID List
* *Name* - 'get_stream_list'
* *Valid States* - 'owned', 'active'
* *Description* - fetch all the assoicated streams for a port
* *Paramters*
** *port_id* - port to query for registered streams

* *Result* - array of 'stream_id'

[source,bash]
----

'Request':

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "get_stream_list",
    "params": {
        "port_id": 1
    }
}

'Response':

{
    "id": 1,
    "jsonrpc": "2.0",
    "result": [
        502,
        18
    ]
}

----

=== Get Stream
* *Name* - 'get_stream'
* *Valid States* - 'owned', 'active'
* *Description* - get a specific stream object
* *Paramters*
** *port_id* - port for the associated stream
** *stream_id* - the requested stream id

* *Result* - object xref:stream_obj['stream']

[source,bash]
----

'Request':

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "get_stream",
    "params": {
        "port_id": 1,
        "stream_id": 7
    }
}

'Response':

{
    "id": 1,
    "jsonrpc": "2.0",
    "result": {
        "stream": {
            "enabled": true,
            "isg": 4.3,
            "mode": {
                "pps": 3,
                "type": "continuous"
            },
            "next_stream_id": -1,
            "packet": {
                "binary": [
                    4,
                    1,
                    255
                ],
                "meta": ""
            },
            "self_start": true
        }
    }
}

----

=== Remove All Streams
* *Name* - 'remove_all_streams'
* *Valid States* - 'owned'
* *Description* - remove all streams from a port
* *Paramters*
** *port_id* - port for the associated stream

* *Result* - "ACK" on success

[source,bash]
----

'Request':

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "remove_all_streams",
    "params": {
        "port_id": 2
    }
}

'Response':

{
    "id": 1,
    "jsonrpc": "2.0",
    "result": "ACK"
}

----

=== Start Traffic
* *Name* - 'start_traffic'
* *Valid States* - 'owned'
* *Description* - Starts the traffic on a specific port. if traffic has already started an error will be returned
* *Paramters*
** *port_id* - port for starting the traffic, -1 for starting all the ports

* *Result* - "ACK" on success

[source,bash]
----

'Request':

{
    "id": "b3llt8hs",
    "jsonrpc": "2.0",
    "method": "start_traffic",
    "params": {
        "port_id": 3
    }

'Response':

{
    "id": "b3llt8hs",
    "jsonrpc": "2.0",
    "result": "ACK"
}

----

=== Stop Traffic
* *Name* - 'stop_traffic'
* *Valid States* - 'active'
* *Description* - Stops the traffic on a specific port. if the port has already started nothing will happen
* *Paramters*
** *port_id* - port for stopping the traffic, -1 for stopping all the ports

* *Result* - "ACK" on success

[source,bash]
----

'Request':

{
    "id": "h2fyhni7",
    "jsonrpc": "2.0",
    "method": "stop_traffic",
    "params": {
        "port_id": 3
    }
}

'Response':

{
    "id": "h2fyhni7",
    "jsonrpc": "2.0",
    "result": "ACK"
}

----