Wireshark рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪреНрдЫреЗрджрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдирд╛

рдЫрд╡рд┐ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рд╡рд╛рдпрд░рдЯреИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбрд╢рд╛рд░реНрдХ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ 1 рд╡рд┐рдШрдЯрдирдХрд░реНрддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреЛ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдкреИрдХреЗрдЬреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдиреЙрд░реНрдЯреЗрд▓ рдХреЗ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдбрд┐рд╕реЗрдХреНрдЯрд░ рдХреА рдХрдореА рдорд╣рд╕реВрд╕ рд╣реБрдИред рдФрд░ рдЙрд╕реЗ рд╣рд╡рд╛ рдХреА рддрд░рд╣ рдЬрд░реВрд░рдд рдереАред рдмрд╛рд╣рд░ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╕реНрдкрд╖реНрдЯ рдерд╛ - рдЕрдкрдирд╛ рд▓рд┐рдЦреЛред рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, Wireshark рдХреЗ рддрд╣рдд "рдПрдирд╛рдЯреЛрдорд┐рдХрд▓" рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдмрд╣реБрдд рдХрдо рдЕрдиреБрднрд╡ рд╣реЛрдиреЗ рдкрд░, рдореИрдВрдиреЗ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдФрд░ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдареАрдХ рд╣реИ, рдЕрдкрдиреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗрдВ, рдЕрдЧрд░ рдЖрдкрдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред

рд╡рд┐рдЪреНрдЫреЗрджрди - latред рд╡рд┐рджрд╛рд░рдХ, рд╡рд┐рджрд╛рд░рдХ рд╕реЗ, рд╡рд┐рдЪреНрдЫреЗрдж

рдиреЛрдЯ 1: рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдкрд╛рдардХ Wireshark рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдФрд░ рдпрд╣ рднреА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдиреЛрдЯ 2: рдЪреВрдВрдХрд┐ рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдиреЗ рдЗрд╕ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рднреА рд▓рд┐рдЦрд╛ред рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд, рдореЗрд░рд╛ рдкреНрд▓рдЧрдЗрди рднреА рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорддрднреЗрдж рдХреЗрд╡рд▓ рдореЗрдХрдлрд╛рдЗрд▓реНрд╕ рдореЗрдВ рд╣реЛрдВрдЧреЗред

рдиреЛрдЯ 3: рдЪреВрдВрдХрд┐ рдореИрдВ рдЬрд┐рд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдФрд░ рдмрдВрдж рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рд▓рд╛рдЦ рдЧреИрд░-рдкреНрд░рдХрдЯреАрдХрд░рдг рд╕рдордЭреМрддреЛрдВ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкрдирд╛, рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рд╣реБрдЖ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдорд╛рдирддрд╛ рд╣реВрдВред

рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕реЗ рдореИрдВ рд╕реАрдзрд╛ рдирд╛рдо рдлреВ рдХрд╣реВрдВрдЧрд╛ред рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ UDP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдКрдкрд░ рд╣реЛрдиреЗ рджреЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реЛ:

рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдХреБрдЫ рдбрд╛рд▓рдиреЗ, рдХреБрдЫ рдмрдирд╛рдиреЗ, рдХрд╣реАрдВ рдХреБрдЫ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣реИ рдХрд┐ Wireshark рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ:
рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рдпрд╣рд╛рдВ рд╣реИ ред

рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЙрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП Wireshark рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦреЗрдВрдЧреЗред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдерд┐рд░ рд╢рд╛рдЦрд╛ рдХреЗ рд╕реНрд░реЛрдд 1.6:
$ cd $HOME $ svn co http://buildbot.wireshark.org/trunk-1.6/ wireshark 

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдВрдХрд▓рди рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрд▓рд╛рдПрдВ:
  $ cd wireshark $ ./autogen.sh $ ./configure 

рдпрджрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, рддреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╡рд╣рд╛рдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ:
  $ cd $HOME/wireshark/plugins $ mkdir foo $ cd foo $ touch packet-foo.c 

рдврд╛рдВрдЪрд╛


рдпрд╣рд╛рдВ, рдореИрдВ рдкреНрд▓рдЧрдЗрди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ, рдЬреЛ рд╡рд┐рдВрдбрд╕рд░рдХ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХреЛ "рдкрд┐рдХ рдЕрдк" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдкреИрдХреЗрдЯ foo.c
 #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <epan/packet.h> #define FOO_PORT 35000 /*  UDP ,       FOO . */ static int proto_foo = -1; /*       . */ void proto_register_foo(void) { proto_foo = proto_register_protocol ( "FOO Protocol", /*   */ "FOO", /*   */ "foo" /*  */ ); } 

рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдо proto_register_protocol () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдореЛрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "FOO рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдФрд░ "FOO" рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ Wireshark рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо "foo" рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рд┐рд▓реНрдЯрд░ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред)

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдкрдХрдбрд╝реЗ рдЧрдП рдлреВ рдкреИрдХреЗрдЬ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ create_dissector_handle () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 void proto_reg_handoff_foo(void) { static dissector_handle_t foo_handle; foo_handle = create_dissector_handle(dissect_foo, proto_foo); dissector_add_uint("udp.port", FOO_PORT, foo_handle); } 

рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдЕрд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЧрдВрджрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрдЯреЛ_рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдмрд╛рдВрдзрддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ UDP рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдЯреНрд░реИрдлрд╝рд┐рдХ рдЬрд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬрдм рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ (35000) рдкрд░ рдХреБрдЫ рдЧрддрд┐рд╡рд┐рдзрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рддреЛ рд╡рд┐рдВрдбрд╕рд░реНрдХ рд╣рдореЗрдВ "рдХреЙрд▓" рдХрд░реЗрдЧрд╛ред

рдПрдХ рдПрдЧреНрд░реАрдореЗрдВрдЯ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрдВрдХреНрд╢рдВрд╕ proto_register_foo () рдФрд░ proto_reg_handoff_foo () рд╣рдорд╛рд░реЗ рд╕реЛрд░реНрд╕ рдлрд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред

рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдмрдиреА рд╣реБрдИ рд╣реИ - рд╡рд┐рдШрдЯрди рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред
 static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { col_set_str(pinfo->cinfo, COL_PROTOCOL, "FOO"); col_clear(pinfo->cinfo, COL_INFO); } 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕ рдкреИрдХреЗрдЬ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреИрдХреЗрдЯ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмрдлрд░ - рдЯреАрд╡реАрдмреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Pinfo рдореЗрдВ рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдФрд░ рдкреЗрдбрд╝ рдореЗрдВ , рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди рддрдм рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╡рд┐рдВрдбрд╕рд░ рдХреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЙрд▓рдо рдореЗрдВ рдорд╛рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рдореЗрдВ, рд╣рдо рдЗрдиреНрдлреЛ рдХреЙрд▓рдо рдХреЛ рдХреНрд▓рд┐рдпрд░ рдХрд░рддреЗ рд╣реИрдВред (рджреЛрдиреЛрдВ рдХреЙрд▓рдо рдЖрдорддреМрд░ рдкрд░ рдкреИрдХреЗрдЯ рдХреИрдкреНрдЪрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рджрд┐рдЦрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред)

рд╕рдм рдХреБрдЫ, рдЗрд╕ рд╕рдордп рдПрдХ рдиреНрдпреВрдирддрдо рдХреЛрдб рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдЗрд╕реЗ Wireshark рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХреЗрдВред

рдкреНрд▓рдЧрдЗрди рд╡рд┐рдзрд╛рдирд╕рднрд╛


рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП) рд╣рдореЗрдВ рдЕрдкрдиреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХреБрдЫ рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: Makefile.am, Makefile.common рдФрд░ modininfo.hред
рд╡реИрд╕реЗ, рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдореЗрдХрдлрд╛рдЗрд▓реНрд╕ рдореЗрдВ рдЦреБрдж рдХреЛ рджрдлрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдВрдбрд╢рд╛рд░реНрдХ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рд╕реАрдореЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдлрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ CMakeLists.txt рдмрдирд╛рдПрдВ:
 set(DISSECTOR_SRC packet-foo.c ) set(PLUGIN_FILES plugin.c ${DISSECTOR_SRC} ) set(CLEAN_FILES ${PLUGIN_FILES} ) if (WERROR) set_source_files_properties( ${CLEAN_FILES} PROPERTIES COMPILE_FLAGS -Werror ) endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR}) register_dissector_files(plugin.c plugin ${DISSECTOR_SRC} ) add_library(foo ${LINK_MODE_MODULE} ${PLUGIN_FILES} ) set_target_properties(foo PROPERTIES PREFIX "") set_target_properties(foo PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}") target_link_libraries(foo epan) install(TARGETS foo LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION} NAMELINK_SKIP RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION} ) 

рдиреЛрдЯ: рдЖрдк рд╣рд░ рдмрд╛рд░ рдпрд╛рдж рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ рдХрд┐ CMakeLists.txt рдлрд╛рдЗрд▓ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рдкреНрд▓рдЧрдЗрди рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдХреЙрдкреА рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯрд░рд▓рд┐рдВрдХред рдФрд░ рдлрд┐рд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдВрдЯрд░рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ foo рд╕реЗ рдмрджрд▓реЗрдВред

рдлрд┐рд░ рд╣рдореЗрдВ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧ-рдЗрди рдЯреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдВред
  $ cd $HOME/wireshark/ $ vim CMakeLists.txt 

рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рджрд┐рдП рдЧрдП рд▓рд╛рдЗрди "рдкреНрд▓рдЧ рдЗрди / рдлреВ" рдХреЛ рдЬреЛрдбрд╝реЗрдВ:
 ....... if(ENABLE_PLUGINS) set(HAVE_PLUGINS 1) set(PLUGIN_DIR="${DATAFILE_DIR}/plugins/${CPACK_PACKAGE_VERSION}") set(PLUGIN_SRC_DIRS plugins/foo plugins/asn1 plugins/docsis ....... 

рдЕрдм рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдХрд▓рди рдФрд░ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдЪрд▓рд╛рдПрдБред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрджрдо $ рдШрд░ / рд╡рд╛рдпрд░рд╢рд░реНрдХ / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ
  $ mkdir build $ cd build $ cmake .. $ make foo 

рд╕рдлрд▓ рд╕рдВрдХрд▓рди рд╣реЛрдиреЗ рдкрд░, рд╣рдо $ рд╣реЛрдо / рд╡рд╛рдпрд░рд╢рд░реНрдХ / рдмрд┐рд▓реНрдб / рд▓рд┐рдм / рдлреЛрд▓реНрдбрд░ рдореЗрдВ foo.so рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдЯреЗрд╕реНрдЯ рд░рди


рдлрд╝рд╛рдЗрд▓ foo.so рдХреЛ /usr/lib/wireshark/plugins/1.6.0/ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ Wireshark рдЪрд▓рд╛рдПрдВред "рд╕рд╣рд╛рдпрддрд╛ -> рддрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ" рдкрд░ рдЬрд╛рдПрдВ, рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╕реВрдЪреА рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдкреНрд▓рдЧрдЗрди рдЦреЛрдЬреЗрдВ - foo .so.

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкреНрд▓рдЧрдЗрди рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ, рд╣рдо рдкреИрдХреЗрдЯ рдХреИрдкреНрдЪрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЯ рднреЗрдЬрддреЗ рд╣реИрдВред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ UDP рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрдХ FOO рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╡реНрд╣рд┐рдк рдХрд┐рдпрд╛ред рдЗрд╕рдХрд╛ рдХреЛрдб рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)

рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдврдВрдЧ


рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд▓рдЧрдЗрди рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдЕрднреА рддрдХ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ "рд▓рд┐рдЦреЗрдВрдЧреЗ"ред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдмрд╛рдд рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреЗ рдкреЗрдбрд╝ ( рдкреЗрдбрд╝ ) рдкрд░ рдПрдХ рд╢рд╛рдЦрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рдбрд╛рд▓реЗрдВрдЧреЗред рд╡рд┐рдЪреНрдЫреЗрджрдХ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рд░рд╛рдВрд╢ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдкреЗрдбрд╝ рдХрд╛ рд╕реВрдЪрдХ NULL рд╣реИ, рддреЛ рд╣рдорд╕реЗ рдХреЗрд╡рд▓ рд╕рд╛рд░рд╛рдВрд╢ рдЬрд╛рдирдХрд╛рд░реА рдорд╛рдВрдЧреА рдЬрд╛рддреА рд╣реИред рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ рдкреЗрдбрд╝ рдХреЛ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ Wireshark рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╣рдорд╛рд░рд╛ рд╡рд┐рдЪреНрдЫреЗрджрдХ рд░реВрдк рд▓реЗрддрд╛ рд╣реИ:
 static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { col_set_str(pinfo->cinfo, COL_PROTOCOL, "FOO"); col_clear(pinfo->cinfo, COL_INFO); if (tree) { proto_item *ti = NULL; ti = proto_tree_add_item(tree, proto_foo, tvb, 0, -1, FALSE); } } 

рдпрд╣рд╛рдБ рд╣рдордиреЗ рдкреЗрдбрд╝ рдкрд░ рдПрдХ рд╢рд╛рдЦрд╛ рдХреЛ proto_tree_add_item () рдХрд╣рдХрд░ рдЬреЛрдбрд╝рд╛ ред рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рд╡рд┐рд╡рд░рдг рд╣реЛрдВрдЧреЗред рд╣рдо рдЙрд╕ рдкреИрдХреЗрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЛ рднреА рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдпреВрдбреАрдкреА рдкреИрдХреЗрдЯ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рд╕реЗ рдкрд░реЗ рдХрд╛ рд╕рдВрдкреВрд░реНрдг рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЙрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдПрдХ рдФрд░ рд╣реЛрддрд╛ рд╣реИред

Proto_tree_add_item () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░:
рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж, Wireshark рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рджрд╛рдпрд░рд╛ рдХрд╣рд╛рдБ рд╕реЗ рд╢реБрд░реВ рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ "FOO рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛ рдХрджрдо рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЗрд╕ рдЪрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░реЗрдВрдЧреЗред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдП рдЧрдП рдкреНрд░реЛрдЯреЛ_рдЧреНрд░реАрд╕реНрдЯрд░_рдлреВ () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред

Proto_register_foo () рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреЛ рд╕реНрдерд┐рд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВред рдлрд┐рд░ proto_register_protocol () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрди рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред
 void proto_register_foo(void) { static hf_register_info hf[] = { { &hf_foo_hdr_version, { "FOO Header Version", "foo.hdr.version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_foo_hdr_type, { "FOO Header Type", "foo.hdr.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } } }; static gint *ett[] = { &ett_foo }; proto_foo = proto_register_protocol ( "FOO Protocol", "FOO", "foo" ); proto_register_field_array(proto_foo, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); } 

рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдкреНрд░реЛрдЯреЛ_рдлреВ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдареАрдХ рдмрд╛рдж , 3 рдФрд░ рдШреЛрд╖рдгрд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ:
 static gint ett_foo = -1; static int hf_foo_hdr_version = -1; static int hf_foo_hdr_type = -1; 

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗ:
 if (tree) { proto_item *ti = NULL; proto_tree *foo_tree = NULL; ti = proto_tree_add_item(tree, proto_foo, tvb, 0, -1, FALSE); foo_tree = proto_item_add_subtree(ti, ett_foo); proto_tree_add_item(foo_tree, hf_foo_hdr_version, tvb, 0, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_hdr_type, tvb, 1, 1, FALSE); } 

рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд░реНрд╕рд╛рд░реНрдХ рдХрд╛ рдЬреНрдЮрд╛рди рдЕрдм рдФрд░ рд╡рд┐рд╕реНрддреГрдд рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЕрдм рддрдХ, рд╣рдордиреЗ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкрд╣рд▓реЗ 2 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдорд╛рдиреНрдпрддрд╛ рджреА рд╣реИ, рдЬреЛ рдХреНрд░рдорд╢рдГ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдкреИрдХреЗрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред

Proto_item_add_subtree () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдиреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд╛рдЦрд╛ ( foo_tree ) рдЬреЛрдбрд╝ рджреА рдЬрд┐рд╕рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреВрд░реЗ рдкреИрдХреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП foo рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг рд╣реИред Foo_tree рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред
Wthark рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реВрдЪрдирд╛ рдЯреНрд░реА рдХреЗ "рд╡рд┐рд╕реНрддрд╛рд░" рдХреЛ ett_foo рд╡реЗрд░рд┐рдПрдмрд▓ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЪрд░ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╕рдордп рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред
proto_tree_add_item () рдЗрд╕ рд╕рдордп рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП hf_foo_hdr_version рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред hdr_version - tvb рд╕реЗ 1 рдмрд╛рдЗрдЯ, рд╕реНрдерд┐рддрд┐ 0 рд╕реЗ рд╢реБрд░реВред hdr_type - 1 рдмрд╛рдЗрдЯ tvb рд╕реЗ , рд╕реНрдерд┐рддрд┐ 1 рд╕реЗ рд╢реБрд░реВред

рдпрджрд┐ рд╣рдо hf_foo_hdr_version рдХреЛ рд╕реНрдерд┐рд░ рд╕рд░рдгреА рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЯреНрд░реИрдХ рджреЗрдЦреЗрдВрдЧреЗ, рдЬрд╣рд╛рдБрдмрд╛рдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ - рдиреАрдЪреЗ рджреЗрдЦреЗрдВред

рдЕрдм рдЖрдк рдлрд┐рд░ рд╕реЗ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ Wireshark рдХреЗ рд╕рд╛рде рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡рд┐рдВрдбрд╢рд╛рд░реНрдХ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдЦрддреНрдо рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 ... static int hf_foo_hdr_flags = -1; static int hf_foo_hdr_bool = -1; static int hf_foo_pl_len = -1; static int hf_foo_payload = -1; ... void proto_register_foo(void) { ... { &hf_foo_hdr_flags, { "FOO Header Flags", "foo.hdr.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_foo_hdr_bool, { "FOO Header Boolean", "foo.hdr.bool", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_foo_pl_len, { "FOO Payload Length", "foo.pl_len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_foo_payload, { "FOO Payload", "foo.payload", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } } ... } static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { ... if (tree) { gint offset = 0; proto_item *ti = NULL; proto_tree *foo_tree = NULL; ti = proto_tree_add_item(tree, proto_foo, tvb, 0, -1, FALSE); foo_tree = proto_item_add_subtree(ti, ett_foo); proto_tree_add_item(foo_tree, hf_foo_hdr_version, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_hdr_type, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_hdr_flags, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_hdr_bool, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_pl_len, tvb, offset, 4, TRUE); offset += 4; proto_tree_add_item(foo_tree, hf_foo_payload, tvb, offset, -1, FALSE); } } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рднреА рдмрд┐рдЯреНрд╕ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ред
рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╣рдордиреЗ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛: FT_BOOLEAN, FT_STRING рдФрд░ FT_UINT8ред рдФрд░ рд╕рд╛рде рд╣реА, рдЧреИрд░-рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, BASE_NONE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрдм Wireshark рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдФрд░ рдЗрд╕ рдХрджрдо рдкрд░ рдХреЛрдИ рднреА рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд╡рд░рдг рд╣рдореЗрд╢рд╛ рдкрд░реНрдпрд╛рдкреНрдд рдереЗред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдЭрдВрдбреЗ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдЬрд┐рд╕реЗ рдереЛрдбрд╝рд╛-рдереЛрдбрд╝рд╛ рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣ рднреА, рдпрджрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрдЬреНрдЮрд╛рдд рд╣реИ, рддреЛ рдХреНрдпрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдЦреИрд░, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ - рдпрджрд┐ рдкреИрдХреЗрдЯ рдкреЗрд▓реЛрдб рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд┐рдирд╛ рдЖрддрд╛ рд╣реИ рдФрд░ рд╢реВрдиреНрдп рдХреЗ рдПрдХ pl_len рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рддреЛ рдбрд┐рд╕реЗрдХреНрдЯрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛ред рддреЛ, рдкреНрд▓рдЧрдЗрди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣ рд╣реИред рдЪрд▓рд┐рдП рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ ...

рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рднрд╛рдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ


рдкреВрд░реНрдгрддрд╛ рдХреА рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИ! рддреЛ рдпрд╣ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИред рдЖрдЗрдП рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╛рдо рджреЗрдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬреЛ рдкреИрдХреЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╕рдордп рд╣рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 static const value_string packetversions[] = { { 1, "Version 1" }, { 0, NULL } }; static const value_string packettypes[] = { { 1, "Ping request" }, { 2, "Ping acknowledgment" }, { 3, "Print payload" }, { 0, NULL } }; 

рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - "рдореВрд▓реНрдп, рдореВрд▓реНрдп рдХрд╛ рдирд╛рдо"ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдПрдХ рдкреИрдХреЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреИрдХреЗрдЬ рдХреЗ рдирдВрдЧреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ рдФрд░ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВред рдЗрди рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрд╡рдпрдВ Wireshark рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП VALS рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
  { &hf_foo_hdr_version, { "FOO Header Version", "foo.hdr.version", FT_UINT8, BASE_DEC, VALS(packetversions), 0x0, NULL, HFILL } }, { &hf_foo_hdr_type, { "FOO Header Type", "foo.hdr.type", FT_UINT8, BASE_DEC, VALS(packettypes), 0x0, NULL, HFILL } } 

рд╣рдордиреЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдкреИрдХреЗрдЬ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЕрдм рд╣рдо рдЭрдВрдбреЗ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред
 #define FOO_FIRST_FLAG 0x01 #define FOO_SECOND_FLAG 0x02 #define FOO_ONEMORE_FLAG 0x04 static int hf_foo_flags_first = -1; static int hf_foo_flags_second = -1; static int hf_foo_flags_onemore = -1; void proto_register_foo(void) { ... { &hf_foo_flags_first, { "FOO first flag", "foo.hdr.flags.first", FT_BOOLEAN, FT_INT8, NULL, FOO_FIRST_FLAG, NULL, HFILL } }, { &hf_foo_flags_second, { "FOO second flag", "foo.hdr.flags.second", FT_BOOLEAN, FT_INT8, NULL, FOO_SECOND_FLAG, NULL, HFILL } }, { &hf_foo_flags_onemore, { "FOO onemore flag", "foo.hdr.flags.onemore", FT_BOOLEAN, FT_INT8, NULL, FOO_ONEMORE_FLAG, NULL, HFILL } } ... } static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { ... proto_tree_add_item(foo_tree, hf_foo_hdr_flags, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_first, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_second, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_onemore, tvb, offset, 1, FALSE); offset += 1; ... } 

рдЪреВрдВрдХрд┐ рдзреНрд╡рдЬ "1" рдпрд╛ "0" рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рд╕рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо FT_BOOLEAN рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЫрдареЗ рдкреИрд░рд╛рдореАрдЯрд░ (FOO_FIRST_FLAG, FOO_SECOND_FLAG, FOO_ONEMORE_FLAG) рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреМрдЯрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдмрд╛рдЗрдЯ рд╕реЗ рдХрд┐рд╕ рдмрд┐рдЯ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рдПред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд╕рднреА рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдСрдлрд╕реЗрдЯ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖ рдЕрдм рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдирд╣реАрдВ рд░реБрдХреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдФрд░ рднреА рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдмрдирд╛ рджреЗрдВрдЧреЗред рдиреЛрдЯ: рд╡рд┐рдВрдбрд╕рд░ рдкреИрдХреЗрдЬ рдХреЛ "FOO рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджрд░реНрдЬ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдирд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред Wireshark рдЗрд╕ рдирд╛рдо рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ tvb_get_guint8 () 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХрд╛рд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдп рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╛рдо рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдХреЙрд▓рдо рдореЗрдВред
 static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint8 packet_version = tvb_get_guint8(tvb, 0); guint8 packet_type = tvb_get_guint8(tvb, 1); guint32 packet_pl_len = 0; col_set_str(pinfo->cinfo, COL_PROTOCOL, "FOO"); col_clear(pinfo->cinfo, COL_INFO); if (tree) { gint offset = 0; proto_item *ti = NULL; proto_tree *foo_tree = NULL; ti = proto_tree_add_item(tree, proto_foo, tvb, 0, -1, FALSE); foo_tree = proto_item_add_subtree(ti, ett_foo); proto_tree_add_item(foo_tree, hf_foo_hdr_version, tvb, offset, 1, FALSE); offset += 1; switch ( packet_version ) { case 1: col_add_fstr(pinfo->cinfo, COL_INFO, "Type: %s", val_to_str(packet_type, packettypes, "Unknown (0x%02x)")); proto_item_append_text(ti, ", Type: %s", val_to_str(packet_type, packettypes, "Unknown (0x%02x)")); proto_tree_add_item(foo_tree, hf_foo_hdr_type, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_hdr_flags, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_first, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_second, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_onemore, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_hdr_bool, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_pl_len, tvb, offset, 4, TRUE); packet_pl_len = tvb_get_ntohl(tvb, offset); offset += 4; if ( packet_pl_len ) proto_tree_add_item(foo_tree, hf_foo_payload, tvb, offset, -1, FALSE); break; default: col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown version of Foo protocol (0x%02x)", packet_version); } } } 

рд╣рдо рдкреНрд░рд╛рдкреНрдд рдорд╛рдиреЛрдВ рдХреЛ рдореИрдХреНрд░реЛ val_to_str () рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ , рдЬреЛ рджрд┐рдП рдЧрдП рдорд╛рди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрд╛ рд╡рд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛ рд╣рдордиреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рд╣реИ рдпрджрд┐ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред
рдЬрдм рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдерд╛ рддреЛ рд╣рдордиреЗ рдЕрдиреБрдЪрд┐рдд рдкреЗрд▓реЛрдб рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рднреА рддрдп рдХреА рдереАред
рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛


рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╡рд┐рдЪреНрдЫреЗрджрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг


tvb_get_guint8 ()
Tvb_get_guint8 () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рдЕрдиреНрдп рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рд╡рд┐рд╡рд░рдг рдлрд╛рдЗрд▓ рд╡рд╛рдпрд░рд╢рд░реНрдХ / рдИрдкрди / tvbuff.h рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкреБрд░рд╛рд▓реЗрдЦ
рдкреБрд░рд╛рд▓реЗрдЦ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рдеред рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
35000 рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреВ рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕реВрдЪреА *
 #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #define FOO_PORT 35000 #define BUFFER_SIZE 210 struct _message { unsigned char pck_version; // = argv[1] unsigned char pck_type; // = 1 | 3 unsigned char pck_flags; // = rand unsigned char pck_boolean; // = rand unsigned int pck_payload_len; // = strlen(argv[2]) }; int main(int argc, char ** argv) { if ( argc != 3 ) { printf("Usage: %s <version> <ping|\"text\">\n", argv[0]); return 1; } struct sockaddr_in cli_addr; int s, cli_len = sizeof(cli_addr); char buf[BUFFER_SIZE]; struct _message msg; msg.pck_version = atoi(argv[1]); msg.pck_payload_len = 0; unsigned int randomData = open("/dev/urandom", O_RDONLY); unsigned int myRandomInteger; read(randomData, &myRandomInteger, sizeof(myRandomInteger)); msg.pck_flags |= myRandomInteger%8; read(randomData, &myRandomInteger, sizeof(myRandomInteger)); msg.pck_boolean = myRandomInteger%2; close(randomData); if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1 ) { perror("socket"); exit(1); } memset((char*)&cli_addr, 0, sizeof(cli_addr)); cli_addr.sin_family = AF_INET; cli_addr.sin_port = htons(FOO_PORT); cli_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); memset(buf, 0, BUFFER_SIZE); if ( ! strcmp(argv[2], "ping") ) { msg.pck_type = 1; } else { msg.pck_type = 3; msg.pck_payload_len = (strlen(argv[2])<200)?strlen(argv[2]):200; strncpy(buf+sizeof(struct _message), argv[2], (strlen(argv[2])<200)?strlen(argv[2]):199); } memcpy(buf, (char*)&msg, sizeof(struct _message)); if ( sendto(s, buf, sizeof(struct _message)+msg.pck_payload_len, 0, (struct sockaddr*)&cli_addr, cli_len) == -1 ) { perror("sendto"); exit(1); } exit(0); } 
  * рдореВрд░реНрдЦ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо 

Source: https://habr.com/ru/post/In121990/


All Articles