From d7f239a75bc51eece8fccf1fdcb1708157c2190a Mon Sep 17 00:00:00 2001 From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net> Date: Sun, 3 May 2020 17:26:51 +0700 Subject: [PATCH] [!!!] Big massive rename, refactoring and regroup --- .../net/client => 3rdparty}/libev/.travis.yml | 0 .../client => 3rdparty}/libev/CMakeLists.txt | 0 .../net/client => 3rdparty}/libev/Changes | 0 .../net/client => 3rdparty}/libev/LICENSE | 0 .../net/client => 3rdparty}/libev/Makefile.am | 0 .../net/client => 3rdparty}/libev/Makefile.in | 0 {dap-sdk/net/client => 3rdparty}/libev/README | 0 .../net/client => 3rdparty}/libev/Symbols.ev | 0 .../client => 3rdparty}/libev/Symbols.event | 0 .../net/client => 3rdparty}/libev/aclocal.m4 | 0 .../net/client => 3rdparty}/libev/autogen.sh | 0 .../libev/cmake/configure.cmake | 0 .../libev/cmake/dist.cmake | 0 .../libev/config.guess.cdbs-orig | 0 .../client => 3rdparty}/libev/config.h.cmake | 0 .../net/client => 3rdparty}/libev/config.h.in | 0 .../libev/config.sub.cdbs-orig | 0 .../net/client => 3rdparty}/libev/configure | 0 .../client => 3rdparty}/libev/configure.ac | 0 .../net/client => 3rdparty}/libev/depcomp | 0 .../net/client => 3rdparty}/libev/dist.info | 0 {dap-sdk/net/client => 3rdparty}/libev/ev++.h | 0 {dap-sdk/net/client => 3rdparty}/libev/ev.3 | 0 {dap-sdk/net/client => 3rdparty}/libev/ev.c | 0 {dap-sdk/net/client => 3rdparty}/libev/ev.h | 0 {dap-sdk/net/client => 3rdparty}/libev/ev.pod | 0 .../net/client => 3rdparty}/libev/ev_epoll.c | 0 .../net/client => 3rdparty}/libev/ev_kqueue.c | 0 .../net/client => 3rdparty}/libev/ev_poll.c | 0 .../net/client => 3rdparty}/libev/ev_port.c | 0 .../net/client => 3rdparty}/libev/ev_select.c | 0 .../net/client => 3rdparty}/libev/ev_vars.h | 0 .../net/client => 3rdparty}/libev/ev_win32.c | 0 .../net/client => 3rdparty}/libev/ev_wrap.h | 0 .../net/client => 3rdparty}/libev/event.c | 0 .../net/client => 3rdparty}/libev/event.h | 0 .../net/client => 3rdparty}/libev/install-sh | 0 .../net/client => 3rdparty}/libev/libev.m4 | 0 .../net/client => 3rdparty}/libev/ltmain.sh | 0 .../net/client => 3rdparty}/libev/missing | 0 .../client => 3rdparty}/libev/mkinstalldirs | 0 .../client => 3rdparty}/libev/tmp/config.h | 0 CMakeLists.txt | 6 +- dap-sdk/CMakeLists.txt | 41 +- dap-sdk/core/.gitignore | 60 - dap-sdk/core/.travis.yml | 26 - dap-sdk/core/LICENSE | 165 -- dap-sdk/core/README.md | 14 - dap-sdk/crypto/.gitignore | 52 - dap-sdk/crypto/.travis.yml | 26 - dap-sdk/crypto/CMakeLists.txt.user | 424 ---- dap-sdk/crypto/LICENSE | 165 -- ...-Quantum Key Exchange for the Internet.pdf | Bin 415950 -> 0 bytes dap-sdk/crypto/README.md | 14 - dap-sdk/net/client/.gitignore | 55 - dap-sdk/net/client/.travis.yml | 27 - dap-sdk/net/client/CMakeLists.txt | 44 +- dap-sdk/net/client/LICENSE | 165 -- dap-sdk/net/client/README.md | 5 - dap-sdk/net/client/{src => }/dap_client.c | 0 .../net/client/{src => }/dap_client_http.c | 0 .../net/client/{src => }/dap_client_pool.c | 0 dap-sdk/net/client/{src => }/dap_client_pvt.c | 0 .../net/client/{src => }/dap_client_pvt_hh.c | 0 dap-sdk/net/client/include/dap_client.h | 0 dap-sdk/net/client/include/dap_client_http.h | 0 dap-sdk/net/client/include/dap_client_pool.h | 0 dap-sdk/net/client/include/dap_client_pvt.h | 0 dap-sdk/net/core/.gitignore | 3 - dap-sdk/net/core/.travis.yml | 24 - dap-sdk/net/core/CMakeLists.txt | 24 +- dap-sdk/net/core/README.md | 3 - .../net/core/{src => }/dap_client_remote.c | 0 dap-sdk/net/core/{src => }/dap_events.c | 0 .../net/core/{src => }/dap_events_socket.c | 0 dap-sdk/net/core/{src => }/dap_server.c | 0 .../net/core/{src => }/dap_traffic_track.c | 0 dap-sdk/net/core/include/dap_client_remote.h | 0 dap-sdk/net/core/include/dap_events.h | 0 dap-sdk/net/core/include/dap_events_socket.h | 0 dap-sdk/net/core/include/dap_server.h | 0 dap-sdk/net/core/include/dap_traffic_track.h | 0 dap-sdk/net/server-udp/.gitignore | 2 - dap-sdk/net/server-udp/.travis.yml | 25 - dap-sdk/net/server-udp/CMakeLists.txt | 26 +- dap-sdk/net/server-udp/README.md | 3 - dap-sdk/net/server-udp/dap_dns_server.c | 0 dap-sdk/net/server-udp/dap_udp_client.c | 0 .../server-udp/{ => include}/dap_dns_server.h | 0 .../server-udp/{ => include}/dap_udp_client.h | 0 .../server-udp/{ => include}/dap_udp_server.h | 0 dap-sdk/net/server-udp/test/CMakeLists.txt | 0 dap-sdk/net/server-udp/test/main.c | 0 dap-sdk/net/server/CMakeLists.txt | 22 +- dap-sdk/net/server/enc_server/CMakeLists.txt | 12 +- dap-sdk/net/server/enc_server/dap_enc_http.c | 10 +- dap-sdk/net/server/enc_server/dap_enc_ks.c | 6 +- .../enc_server/{ => include}/dap_enc_http.h | 0 .../enc_server/{ => include}/dap_enc_ks.h | 0 dap-sdk/net/server/http_server/CMakeLists.txt | 22 +- dap-sdk/net/server/http_server/dap_http.c | 342 ++-- .../net/server/http_server/dap_http_folder.c | 0 .../net/server/http_server/dap_http_simple.c | 4 +- .../http_server/http_client/CMakeLists.txt | 17 +- .../http_server/http_client/dap_http_client.c | 4 +- .../http_server/http_client/dap_http_header.c | 0 .../http_client/dap_http_user_agent.c | 0 .../server/http_server/http_client/http.pri | 9 +- .../{ => include}/dap_http_client.h | 0 .../{ => include}/dap_http_header.h | 0 .../{ => include}/dap_http_user_agent.h | 0 .../http_server/{ => include}/dap_http.h | 158 +- .../{ => include}/dap_http_folder.h | 62 +- .../{ => include}/dap_http_simple.h | 0 .../{ => include}/http_status_code.h | 0 dap-sdk/net/server/test/CMakeLists.txt | 0 .../net/server/test/enc_server/CMakeLists.txt | 0 dap-sdk/net/server/test/enc_server/main.c | 0 .../server/test/http_server/CMakeLists.txt | 0 .../test/http_server/dap_http_simple_test.c | 0 .../test/http_server/dap_http_simple_test.h | 0 .../http_server/dap_http_user_agent_test.c | 0 .../http_server/dap_http_user_agent_test.h | 0 dap-sdk/net/server/test/http_server/main.c | 0 dap-sdk/net/server/test/main.c | 0 dap-sdk/net/stream/.gitignore | 54 - dap-sdk/net/stream/.travis.yml | 25 - dap-sdk/net/stream/CMakeLists.txt | 31 +- dap-sdk/net/stream/LICENSE | 165 -- dap-sdk/net/stream/README.md | 4 - dap-sdk/net/stream/ch/.gitignore | 52 - dap-sdk/net/stream/ch/CMakeLists.txt | 7 +- dap-sdk/net/stream/ch/LICENSE | 674 ------- dap-sdk/net/stream/ch/README.md | 2 - dap-sdk/net/stream/ch/dap_stream_ch.c | 0 dap-sdk/net/stream/ch/dap_stream_ch_pkt.c | 0 dap-sdk/net/stream/ch/dap_stream_ch_proc.c | 0 .../stream/ch/{ => include}/dap_stream_ch.h | 0 .../ch/{ => include}/dap_stream_ch_pkt.h | 0 .../ch/{ => include}/dap_stream_ch_proc.h | 0 dap-sdk/net/stream/session/CMakeLists.txt | 10 +- .../{ => include}/dap_stream_session.h | 0 dap-sdk/net/stream/stream/CMakeLists.txt | 13 +- .../stream/stream/{ => include}/dap_stream.h | 0 .../stream/{ => include}/dap_stream_ctl.h | 0 .../stream/{ => include}/dap_stream_pkt.h | 0 dap-sdk/net/stream/test/CMakeLists.txt | 0 dap-sdk/net/stream/test/main.c | 0 modules/CMakeLists.txt | 17 +- modules/app-cli/CMakeLists.txt | 17 +- modules/chain/CMakeLists.txt | 7 +- modules/channel/chain-net-srv/CMakeLists.txt | 5 +- modules/channel/chain-net/CMakeLists.txt | 5 +- modules/channel/chain/CMakeLists.txt | 6 +- modules/common/CMakeLists.txt | 4 +- modules/consensus/block-poa/CMakeLists.txt | 4 +- modules/consensus/block-pow/CMakeLists.txt | 4 +- modules/consensus/dag-poa/CMakeLists.txt | 5 +- modules/consensus/dag-pos/CMakeLists.txt | 5 +- modules/consensus/none/CMakeLists.txt | 7 +- modules/global-db/CMakeLists.txt | 11 +- modules/mempool/CMakeLists.txt | 1 + modules/mining/CMakeLists.txt | 7 +- modules/net/CMakeLists.txt | 5 +- modules/net/iputils/iputils.c | 49 + modules/net/iputils/iputils.h | 189 ++ modules/net/iputils/ping.c | 1694 ++++++++++++++++ modules/net/iputils/ping.h | 436 ++++ modules/net/iputils/ping6_common.c | 1398 +++++++++++++ modules/net/iputils/ping_common.c | 1030 ++++++++++ modules/net/iputils/tracepath.c | 783 ++++++++ modules/net/iputils/traceroute/as_lookups.c | 128 ++ modules/net/iputils/traceroute/clif.c | 1284 ++++++++++++ modules/net/iputils/traceroute/clif.h | 121 ++ modules/net/iputils/traceroute/csum.c | 34 + modules/net/iputils/traceroute/extension.c | 132 ++ modules/net/iputils/traceroute/flowlabel.h | 40 + modules/net/iputils/traceroute/mod-dccp.c | 295 +++ modules/net/iputils/traceroute/mod-icmp.c | 240 +++ modules/net/iputils/traceroute/mod-raw.c | 172 ++ modules/net/iputils/traceroute/mod-tcp.c | 515 +++++ modules/net/iputils/traceroute/mod-tcpconn.c | 237 +++ modules/net/iputils/traceroute/mod-udp.c | 241 +++ modules/net/iputils/traceroute/module.c | 51 + modules/net/iputils/traceroute/poll.c | 93 + modules/net/iputils/traceroute/random.c | 28 + modules/net/iputils/traceroute/time.c | 27 + modules/net/iputils/traceroute/traceroute.c | 1758 +++++++++++++++++ modules/net/iputils/traceroute/traceroute.h | 107 + modules/net/srv/CMakeLists.txt | 5 +- modules/net/win32/ip.h | 301 +++ modules/net/win32/iphdr.h | 112 ++ modules/service/app-db/CMakeLists.txt | 5 +- modules/service/app/CMakeLists.txt | 6 +- modules/service/datum/CMakeLists.txt | 5 +- modules/service/mining-pool/CMakeLists.txt | 5 +- modules/service/vpn/CMakeLists.txt | 7 +- modules/type/block/CMakeLists.txt | 6 +- modules/type/dag/CMakeLists.txt | 6 +- modules/wallet/CMakeLists.txt | 5 +- 200 files changed, 11940 insertions(+), 2819 deletions(-) rename {dap-sdk/net/client => 3rdparty}/libev/.travis.yml (100%) rename {dap-sdk/net/client => 3rdparty}/libev/CMakeLists.txt (100%) rename {dap-sdk/net/client => 3rdparty}/libev/Changes (100%) rename {dap-sdk/net/client => 3rdparty}/libev/LICENSE (100%) rename {dap-sdk/net/client => 3rdparty}/libev/Makefile.am (100%) rename {dap-sdk/net/client => 3rdparty}/libev/Makefile.in (100%) rename {dap-sdk/net/client => 3rdparty}/libev/README (100%) rename {dap-sdk/net/client => 3rdparty}/libev/Symbols.ev (100%) rename {dap-sdk/net/client => 3rdparty}/libev/Symbols.event (100%) rename {dap-sdk/net/client => 3rdparty}/libev/aclocal.m4 (100%) rename {dap-sdk/net/client => 3rdparty}/libev/autogen.sh (100%) rename {dap-sdk/net/client => 3rdparty}/libev/cmake/configure.cmake (100%) rename {dap-sdk/net/client => 3rdparty}/libev/cmake/dist.cmake (100%) rename {dap-sdk/net/client => 3rdparty}/libev/config.guess.cdbs-orig (100%) rename {dap-sdk/net/client => 3rdparty}/libev/config.h.cmake (100%) rename {dap-sdk/net/client => 3rdparty}/libev/config.h.in (100%) rename {dap-sdk/net/client => 3rdparty}/libev/config.sub.cdbs-orig (100%) rename {dap-sdk/net/client => 3rdparty}/libev/configure (100%) rename {dap-sdk/net/client => 3rdparty}/libev/configure.ac (100%) rename {dap-sdk/net/client => 3rdparty}/libev/depcomp (100%) rename {dap-sdk/net/client => 3rdparty}/libev/dist.info (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev++.h (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev.3 (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev.c (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev.h (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev.pod (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev_epoll.c (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev_kqueue.c (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev_poll.c (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev_port.c (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev_select.c (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev_vars.h (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev_win32.c (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ev_wrap.h (100%) rename {dap-sdk/net/client => 3rdparty}/libev/event.c (100%) rename {dap-sdk/net/client => 3rdparty}/libev/event.h (100%) rename {dap-sdk/net/client => 3rdparty}/libev/install-sh (100%) rename {dap-sdk/net/client => 3rdparty}/libev/libev.m4 (100%) rename {dap-sdk/net/client => 3rdparty}/libev/ltmain.sh (100%) rename {dap-sdk/net/client => 3rdparty}/libev/missing (100%) rename {dap-sdk/net/client => 3rdparty}/libev/mkinstalldirs (100%) rename {dap-sdk/net/client => 3rdparty}/libev/tmp/config.h (100%) delete mode 100755 dap-sdk/core/.gitignore delete mode 100755 dap-sdk/core/.travis.yml delete mode 100755 dap-sdk/core/LICENSE delete mode 100755 dap-sdk/core/README.md delete mode 100755 dap-sdk/crypto/.gitignore delete mode 100755 dap-sdk/crypto/.travis.yml delete mode 100644 dap-sdk/crypto/CMakeLists.txt.user delete mode 100755 dap-sdk/crypto/LICENSE delete mode 100755 dap-sdk/crypto/Post-Quantum Key Exchange for the Internet.pdf delete mode 100755 dap-sdk/crypto/README.md delete mode 100755 dap-sdk/net/client/.gitignore delete mode 100755 dap-sdk/net/client/.travis.yml mode change 100755 => 100644 dap-sdk/net/client/CMakeLists.txt delete mode 100755 dap-sdk/net/client/LICENSE delete mode 100755 dap-sdk/net/client/README.md rename dap-sdk/net/client/{src => }/dap_client.c (100%) rename dap-sdk/net/client/{src => }/dap_client_http.c (100%) rename dap-sdk/net/client/{src => }/dap_client_pool.c (100%) rename dap-sdk/net/client/{src => }/dap_client_pvt.c (100%) rename dap-sdk/net/client/{src => }/dap_client_pvt_hh.c (100%) mode change 100755 => 100644 dap-sdk/net/client/include/dap_client.h mode change 100755 => 100644 dap-sdk/net/client/include/dap_client_http.h mode change 100755 => 100644 dap-sdk/net/client/include/dap_client_pool.h mode change 100755 => 100644 dap-sdk/net/client/include/dap_client_pvt.h delete mode 100755 dap-sdk/net/core/.gitignore delete mode 100755 dap-sdk/net/core/.travis.yml mode change 100755 => 100644 dap-sdk/net/core/CMakeLists.txt delete mode 100755 dap-sdk/net/core/README.md rename dap-sdk/net/core/{src => }/dap_client_remote.c (100%) mode change 100755 => 100644 rename dap-sdk/net/core/{src => }/dap_events.c (100%) mode change 100755 => 100644 rename dap-sdk/net/core/{src => }/dap_events_socket.c (100%) mode change 100755 => 100644 rename dap-sdk/net/core/{src => }/dap_server.c (100%) mode change 100755 => 100644 rename dap-sdk/net/core/{src => }/dap_traffic_track.c (100%) mode change 100755 => 100644 mode change 100755 => 100644 dap-sdk/net/core/include/dap_client_remote.h mode change 100755 => 100644 dap-sdk/net/core/include/dap_events.h mode change 100755 => 100644 dap-sdk/net/core/include/dap_events_socket.h mode change 100755 => 100644 dap-sdk/net/core/include/dap_server.h mode change 100755 => 100644 dap-sdk/net/core/include/dap_traffic_track.h delete mode 100755 dap-sdk/net/server-udp/.gitignore delete mode 100755 dap-sdk/net/server-udp/.travis.yml mode change 100755 => 100644 dap-sdk/net/server-udp/CMakeLists.txt delete mode 100755 dap-sdk/net/server-udp/README.md mode change 100755 => 100644 dap-sdk/net/server-udp/dap_dns_server.c mode change 100755 => 100644 dap-sdk/net/server-udp/dap_udp_client.c rename dap-sdk/net/server-udp/{ => include}/dap_dns_server.h (100%) mode change 100755 => 100644 rename dap-sdk/net/server-udp/{ => include}/dap_udp_client.h (100%) mode change 100755 => 100644 rename dap-sdk/net/server-udp/{ => include}/dap_udp_server.h (100%) mode change 100755 => 100644 mode change 100755 => 100644 dap-sdk/net/server-udp/test/CMakeLists.txt mode change 100755 => 100644 dap-sdk/net/server-udp/test/main.c mode change 100755 => 100644 dap-sdk/net/server/CMakeLists.txt mode change 100755 => 100644 dap-sdk/net/server/enc_server/CMakeLists.txt mode change 100755 => 100644 dap-sdk/net/server/enc_server/dap_enc_http.c mode change 100755 => 100644 dap-sdk/net/server/enc_server/dap_enc_ks.c rename dap-sdk/net/server/enc_server/{ => include}/dap_enc_http.h (100%) mode change 100755 => 100644 rename dap-sdk/net/server/enc_server/{ => include}/dap_enc_ks.h (100%) mode change 100755 => 100644 mode change 100755 => 100644 dap-sdk/net/server/http_server/CMakeLists.txt mode change 100755 => 100644 dap-sdk/net/server/http_server/dap_http.c mode change 100755 => 100644 dap-sdk/net/server/http_server/dap_http_folder.c mode change 100755 => 100644 dap-sdk/net/server/http_server/dap_http_simple.c mode change 100755 => 100644 dap-sdk/net/server/http_server/http_client/CMakeLists.txt mode change 100755 => 100644 dap-sdk/net/server/http_server/http_client/dap_http_client.c mode change 100755 => 100644 dap-sdk/net/server/http_server/http_client/dap_http_header.c mode change 100755 => 100644 dap-sdk/net/server/http_server/http_client/dap_http_user_agent.c mode change 100755 => 100644 dap-sdk/net/server/http_server/http_client/http.pri rename dap-sdk/net/server/http_server/http_client/{ => include}/dap_http_client.h (100%) mode change 100755 => 100644 rename dap-sdk/net/server/http_server/http_client/{ => include}/dap_http_header.h (100%) mode change 100755 => 100644 rename dap-sdk/net/server/http_server/http_client/{ => include}/dap_http_user_agent.h (100%) mode change 100755 => 100644 rename dap-sdk/net/server/http_server/{ => include}/dap_http.h (94%) mode change 100755 => 100644 rename dap-sdk/net/server/http_server/{ => include}/dap_http_folder.h (97%) mode change 100755 => 100644 rename dap-sdk/net/server/http_server/{ => include}/dap_http_simple.h (100%) mode change 100755 => 100644 rename dap-sdk/net/server/http_server/{ => include}/http_status_code.h (100%) mode change 100755 => 100644 mode change 100755 => 100644 dap-sdk/net/server/test/CMakeLists.txt mode change 100755 => 100644 dap-sdk/net/server/test/enc_server/CMakeLists.txt mode change 100755 => 100644 dap-sdk/net/server/test/enc_server/main.c mode change 100755 => 100644 dap-sdk/net/server/test/http_server/CMakeLists.txt mode change 100755 => 100644 dap-sdk/net/server/test/http_server/dap_http_simple_test.c mode change 100755 => 100644 dap-sdk/net/server/test/http_server/dap_http_simple_test.h mode change 100755 => 100644 dap-sdk/net/server/test/http_server/dap_http_user_agent_test.c mode change 100755 => 100644 dap-sdk/net/server/test/http_server/dap_http_user_agent_test.h mode change 100755 => 100644 dap-sdk/net/server/test/http_server/main.c mode change 100755 => 100644 dap-sdk/net/server/test/main.c delete mode 100755 dap-sdk/net/stream/.gitignore delete mode 100755 dap-sdk/net/stream/.travis.yml mode change 100755 => 100644 dap-sdk/net/stream/CMakeLists.txt delete mode 100755 dap-sdk/net/stream/LICENSE delete mode 100755 dap-sdk/net/stream/README.md delete mode 100755 dap-sdk/net/stream/ch/.gitignore mode change 100755 => 100644 dap-sdk/net/stream/ch/CMakeLists.txt delete mode 100755 dap-sdk/net/stream/ch/LICENSE delete mode 100755 dap-sdk/net/stream/ch/README.md mode change 100755 => 100644 dap-sdk/net/stream/ch/dap_stream_ch.c mode change 100755 => 100644 dap-sdk/net/stream/ch/dap_stream_ch_pkt.c mode change 100755 => 100644 dap-sdk/net/stream/ch/dap_stream_ch_proc.c rename dap-sdk/net/stream/ch/{ => include}/dap_stream_ch.h (100%) mode change 100755 => 100644 rename dap-sdk/net/stream/ch/{ => include}/dap_stream_ch_pkt.h (100%) mode change 100755 => 100644 rename dap-sdk/net/stream/ch/{ => include}/dap_stream_ch_proc.h (100%) mode change 100755 => 100644 mode change 100755 => 100644 dap-sdk/net/stream/session/CMakeLists.txt rename dap-sdk/net/stream/session/{ => include}/dap_stream_session.h (100%) mode change 100755 => 100644 rename dap-sdk/net/stream/stream/{ => include}/dap_stream.h (100%) rename dap-sdk/net/stream/stream/{ => include}/dap_stream_ctl.h (100%) rename dap-sdk/net/stream/stream/{ => include}/dap_stream_pkt.h (100%) mode change 100755 => 100644 dap-sdk/net/stream/test/CMakeLists.txt mode change 100755 => 100644 dap-sdk/net/stream/test/main.c create mode 100755 modules/net/iputils/iputils.c create mode 100644 modules/net/iputils/iputils.h create mode 100644 modules/net/iputils/ping.c create mode 100644 modules/net/iputils/ping.h create mode 100644 modules/net/iputils/ping6_common.c create mode 100644 modules/net/iputils/ping_common.c create mode 100755 modules/net/iputils/tracepath.c create mode 100644 modules/net/iputils/traceroute/as_lookups.c create mode 100644 modules/net/iputils/traceroute/clif.c create mode 100644 modules/net/iputils/traceroute/clif.h create mode 100644 modules/net/iputils/traceroute/csum.c create mode 100644 modules/net/iputils/traceroute/extension.c create mode 100755 modules/net/iputils/traceroute/flowlabel.h create mode 100644 modules/net/iputils/traceroute/mod-dccp.c create mode 100644 modules/net/iputils/traceroute/mod-icmp.c create mode 100644 modules/net/iputils/traceroute/mod-raw.c create mode 100644 modules/net/iputils/traceroute/mod-tcp.c create mode 100644 modules/net/iputils/traceroute/mod-tcpconn.c create mode 100644 modules/net/iputils/traceroute/mod-udp.c create mode 100644 modules/net/iputils/traceroute/module.c create mode 100644 modules/net/iputils/traceroute/poll.c create mode 100644 modules/net/iputils/traceroute/random.c create mode 100644 modules/net/iputils/traceroute/time.c create mode 100755 modules/net/iputils/traceroute/traceroute.c create mode 100644 modules/net/iputils/traceroute/traceroute.h create mode 100644 modules/net/win32/ip.h create mode 100644 modules/net/win32/iphdr.h diff --git a/dap-sdk/net/client/libev/.travis.yml b/3rdparty/libev/.travis.yml similarity index 100% rename from dap-sdk/net/client/libev/.travis.yml rename to 3rdparty/libev/.travis.yml diff --git a/dap-sdk/net/client/libev/CMakeLists.txt b/3rdparty/libev/CMakeLists.txt similarity index 100% rename from dap-sdk/net/client/libev/CMakeLists.txt rename to 3rdparty/libev/CMakeLists.txt diff --git a/dap-sdk/net/client/libev/Changes b/3rdparty/libev/Changes similarity index 100% rename from dap-sdk/net/client/libev/Changes rename to 3rdparty/libev/Changes diff --git a/dap-sdk/net/client/libev/LICENSE b/3rdparty/libev/LICENSE similarity index 100% rename from dap-sdk/net/client/libev/LICENSE rename to 3rdparty/libev/LICENSE diff --git a/dap-sdk/net/client/libev/Makefile.am b/3rdparty/libev/Makefile.am similarity index 100% rename from dap-sdk/net/client/libev/Makefile.am rename to 3rdparty/libev/Makefile.am diff --git a/dap-sdk/net/client/libev/Makefile.in b/3rdparty/libev/Makefile.in similarity index 100% rename from dap-sdk/net/client/libev/Makefile.in rename to 3rdparty/libev/Makefile.in diff --git a/dap-sdk/net/client/libev/README b/3rdparty/libev/README similarity index 100% rename from dap-sdk/net/client/libev/README rename to 3rdparty/libev/README diff --git a/dap-sdk/net/client/libev/Symbols.ev b/3rdparty/libev/Symbols.ev similarity index 100% rename from dap-sdk/net/client/libev/Symbols.ev rename to 3rdparty/libev/Symbols.ev diff --git a/dap-sdk/net/client/libev/Symbols.event b/3rdparty/libev/Symbols.event similarity index 100% rename from dap-sdk/net/client/libev/Symbols.event rename to 3rdparty/libev/Symbols.event diff --git a/dap-sdk/net/client/libev/aclocal.m4 b/3rdparty/libev/aclocal.m4 similarity index 100% rename from dap-sdk/net/client/libev/aclocal.m4 rename to 3rdparty/libev/aclocal.m4 diff --git a/dap-sdk/net/client/libev/autogen.sh b/3rdparty/libev/autogen.sh similarity index 100% rename from dap-sdk/net/client/libev/autogen.sh rename to 3rdparty/libev/autogen.sh diff --git a/dap-sdk/net/client/libev/cmake/configure.cmake b/3rdparty/libev/cmake/configure.cmake similarity index 100% rename from dap-sdk/net/client/libev/cmake/configure.cmake rename to 3rdparty/libev/cmake/configure.cmake diff --git a/dap-sdk/net/client/libev/cmake/dist.cmake b/3rdparty/libev/cmake/dist.cmake similarity index 100% rename from dap-sdk/net/client/libev/cmake/dist.cmake rename to 3rdparty/libev/cmake/dist.cmake diff --git a/dap-sdk/net/client/libev/config.guess.cdbs-orig b/3rdparty/libev/config.guess.cdbs-orig similarity index 100% rename from dap-sdk/net/client/libev/config.guess.cdbs-orig rename to 3rdparty/libev/config.guess.cdbs-orig diff --git a/dap-sdk/net/client/libev/config.h.cmake b/3rdparty/libev/config.h.cmake similarity index 100% rename from dap-sdk/net/client/libev/config.h.cmake rename to 3rdparty/libev/config.h.cmake diff --git a/dap-sdk/net/client/libev/config.h.in b/3rdparty/libev/config.h.in similarity index 100% rename from dap-sdk/net/client/libev/config.h.in rename to 3rdparty/libev/config.h.in diff --git a/dap-sdk/net/client/libev/config.sub.cdbs-orig b/3rdparty/libev/config.sub.cdbs-orig similarity index 100% rename from dap-sdk/net/client/libev/config.sub.cdbs-orig rename to 3rdparty/libev/config.sub.cdbs-orig diff --git a/dap-sdk/net/client/libev/configure b/3rdparty/libev/configure similarity index 100% rename from dap-sdk/net/client/libev/configure rename to 3rdparty/libev/configure diff --git a/dap-sdk/net/client/libev/configure.ac b/3rdparty/libev/configure.ac similarity index 100% rename from dap-sdk/net/client/libev/configure.ac rename to 3rdparty/libev/configure.ac diff --git a/dap-sdk/net/client/libev/depcomp b/3rdparty/libev/depcomp similarity index 100% rename from dap-sdk/net/client/libev/depcomp rename to 3rdparty/libev/depcomp diff --git a/dap-sdk/net/client/libev/dist.info b/3rdparty/libev/dist.info similarity index 100% rename from dap-sdk/net/client/libev/dist.info rename to 3rdparty/libev/dist.info diff --git a/dap-sdk/net/client/libev/ev++.h b/3rdparty/libev/ev++.h similarity index 100% rename from dap-sdk/net/client/libev/ev++.h rename to 3rdparty/libev/ev++.h diff --git a/dap-sdk/net/client/libev/ev.3 b/3rdparty/libev/ev.3 similarity index 100% rename from dap-sdk/net/client/libev/ev.3 rename to 3rdparty/libev/ev.3 diff --git a/dap-sdk/net/client/libev/ev.c b/3rdparty/libev/ev.c similarity index 100% rename from dap-sdk/net/client/libev/ev.c rename to 3rdparty/libev/ev.c diff --git a/dap-sdk/net/client/libev/ev.h b/3rdparty/libev/ev.h similarity index 100% rename from dap-sdk/net/client/libev/ev.h rename to 3rdparty/libev/ev.h diff --git a/dap-sdk/net/client/libev/ev.pod b/3rdparty/libev/ev.pod similarity index 100% rename from dap-sdk/net/client/libev/ev.pod rename to 3rdparty/libev/ev.pod diff --git a/dap-sdk/net/client/libev/ev_epoll.c b/3rdparty/libev/ev_epoll.c similarity index 100% rename from dap-sdk/net/client/libev/ev_epoll.c rename to 3rdparty/libev/ev_epoll.c diff --git a/dap-sdk/net/client/libev/ev_kqueue.c b/3rdparty/libev/ev_kqueue.c similarity index 100% rename from dap-sdk/net/client/libev/ev_kqueue.c rename to 3rdparty/libev/ev_kqueue.c diff --git a/dap-sdk/net/client/libev/ev_poll.c b/3rdparty/libev/ev_poll.c similarity index 100% rename from dap-sdk/net/client/libev/ev_poll.c rename to 3rdparty/libev/ev_poll.c diff --git a/dap-sdk/net/client/libev/ev_port.c b/3rdparty/libev/ev_port.c similarity index 100% rename from dap-sdk/net/client/libev/ev_port.c rename to 3rdparty/libev/ev_port.c diff --git a/dap-sdk/net/client/libev/ev_select.c b/3rdparty/libev/ev_select.c similarity index 100% rename from dap-sdk/net/client/libev/ev_select.c rename to 3rdparty/libev/ev_select.c diff --git a/dap-sdk/net/client/libev/ev_vars.h b/3rdparty/libev/ev_vars.h similarity index 100% rename from dap-sdk/net/client/libev/ev_vars.h rename to 3rdparty/libev/ev_vars.h diff --git a/dap-sdk/net/client/libev/ev_win32.c b/3rdparty/libev/ev_win32.c similarity index 100% rename from dap-sdk/net/client/libev/ev_win32.c rename to 3rdparty/libev/ev_win32.c diff --git a/dap-sdk/net/client/libev/ev_wrap.h b/3rdparty/libev/ev_wrap.h similarity index 100% rename from dap-sdk/net/client/libev/ev_wrap.h rename to 3rdparty/libev/ev_wrap.h diff --git a/dap-sdk/net/client/libev/event.c b/3rdparty/libev/event.c similarity index 100% rename from dap-sdk/net/client/libev/event.c rename to 3rdparty/libev/event.c diff --git a/dap-sdk/net/client/libev/event.h b/3rdparty/libev/event.h similarity index 100% rename from dap-sdk/net/client/libev/event.h rename to 3rdparty/libev/event.h diff --git a/dap-sdk/net/client/libev/install-sh b/3rdparty/libev/install-sh similarity index 100% rename from dap-sdk/net/client/libev/install-sh rename to 3rdparty/libev/install-sh diff --git a/dap-sdk/net/client/libev/libev.m4 b/3rdparty/libev/libev.m4 similarity index 100% rename from dap-sdk/net/client/libev/libev.m4 rename to 3rdparty/libev/libev.m4 diff --git a/dap-sdk/net/client/libev/ltmain.sh b/3rdparty/libev/ltmain.sh similarity index 100% rename from dap-sdk/net/client/libev/ltmain.sh rename to 3rdparty/libev/ltmain.sh diff --git a/dap-sdk/net/client/libev/missing b/3rdparty/libev/missing similarity index 100% rename from dap-sdk/net/client/libev/missing rename to 3rdparty/libev/missing diff --git a/dap-sdk/net/client/libev/mkinstalldirs b/3rdparty/libev/mkinstalldirs similarity index 100% rename from dap-sdk/net/client/libev/mkinstalldirs rename to 3rdparty/libev/mkinstalldirs diff --git a/dap-sdk/net/client/libev/tmp/config.h b/3rdparty/libev/tmp/config.h similarity index 100% rename from dap-sdk/net/client/libev/tmp/config.h rename to 3rdparty/libev/tmp/config.h diff --git a/CMakeLists.txt b/CMakeLists.txt index bd08eb0f36..bbe7fb7e21 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,8 @@ include(cmake/OS_Detection.cmake) add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") add_subdirectory(dap-sdk) +add_subdirectory(3rdparty/monero_crypto) +add_subdirectory(3rdparty/cuttdb) add_subdirectory(modules/) add_library(${PROJECT_NAME} STATIC cellframe-sdk.c) @@ -19,7 +21,7 @@ if(NOT (WIN32)) dap_chain_net dap_chain_net_srv dap_chain_net_srv_vpn dap_chain_net_srv_app dap_chain_net_srv_app_db dap_chain_net_srv_datum dap_chain_net_srv_datum_pool - dap_chain_wallet dap_chain_global_db dap_chain_mempool dap_chain_gdb m magic + dap_chain_wallet dap_chain_global_db dap_chain_mempool dap_chain_cs_none m magic ) else() target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_crypto dap_server_core dap_enc_server dap_udp_server dap_session @@ -29,7 +31,7 @@ else() dap_chain_net dap_chain_net_srv dap_chain_net_srv_app dap_chain_net_srv_app_db dap_chain_net_srv_datum dap_chain_net_srv_datum_pool - dap_chain_wallet dap_chain_global_db dap_chain_mempool dap_chain_gdb + dap_chain_wallet dap_chain_global_db dap_chain_mempool dap_chain_cs_none ) endif() #target_link_libraries(${PROJECT_NAME} dap_core dap_crypto) diff --git a/dap-sdk/CMakeLists.txt b/dap-sdk/CMakeLists.txt index 390da539f5..c8f8276289 100644 --- a/dap-sdk/CMakeLists.txt +++ b/dap-sdk/CMakeLists.txt @@ -1,33 +1,12 @@ -add_subdirectory(libdap) -add_subdirectory(libdap-app-cli) -add_subdirectory(libdap-crypto) -add_subdirectory(libdap-chain) -add_subdirectory(libdap-chain-common) -add_subdirectory(libdap-chain-crypto) -add_subdirectory(libdap-chain-wallet) -add_subdirectory(libdap-chain-mempool) -add_subdirectory(libdap-chain-net) -add_subdirectory(libdap-server-core) -add_subdirectory(libdap-chain-global-db) -add_subdirectory(libdap-client) -add_subdirectory(libdap-server) -add_subdirectory(libdap-stream) -add_subdirectory(libdap-stream-ch) -add_subdirectory(libdap-stream-ch-chain-net) -add_subdirectory(libdap-stream-ch-chain) -add_subdirectory(libdap-server-udp) -add_subdirectory(libdap-chain-net-srv) -add_subdirectory(libdap-chain-net-srv-app) -add_subdirectory(libdap-chain-net-srv-app-db) -add_subdirectory(libdap-chain-net-srv-datum) -add_subdirectory(libdap-chain-net-srv-datum-pool) -if(NOT (WIN32)) - add_subdirectory(libdap-chain-net-srv-vpn) -endif() +# Core +add_subdirectory(core) -add_subdirectory(libdap-chain-gdb) -add_subdirectory(libdap-stream-ch-chain-net-srv) -add_subdirectory(libdap-chain-cs-dag) -add_subdirectory(libdap-chain-cs-dag-poa) -add_subdirectory(libdap-chain-cs-dag-pos) +# Cryptography +add_subdirectory(crypto) +# Networking +add_subdirectory(net/core) +add_subdirectory(net/client) +add_subdirectory(net/server) +add_subdirectory(net/server-udp) +add_subdirectory(net/stream) diff --git a/dap-sdk/core/.gitignore b/dap-sdk/core/.gitignore deleted file mode 100755 index ef34ab1636..0000000000 --- a/dap-sdk/core/.gitignore +++ /dev/null @@ -1,60 +0,0 @@ -# Prerequisites -build/* -test/build -*.d -*.txt.user -*.txt.user.* -*.autosave -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf -/.project -/.cproject -/kelvin-node_logs.txt -/build/ diff --git a/dap-sdk/core/.travis.yml b/dap-sdk/core/.travis.yml deleted file mode 100755 index d09034d2bf..0000000000 --- a/dap-sdk/core/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -sudo: required -language: cpp -compiler: gcc -dist: xenial -notifications: - email: false - -before_install: - - git submodule init - - git submodule update --recursive - -script: - - sudo service network-manager start - - mkdir build - - cd build - - cmake -DBUILD_DAP_TESTS=ON ../ - - make - - ctest --verbose - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - network-manager - diff --git a/dap-sdk/core/LICENSE b/dap-sdk/core/LICENSE deleted file mode 100755 index 65c5ca88a6..0000000000 --- a/dap-sdk/core/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/dap-sdk/core/README.md b/dap-sdk/core/README.md deleted file mode 100755 index c25194558d..0000000000 --- a/dap-sdk/core/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# libdap -Deus Applications Prototypes: core library - -[](https://travis-ci.com/kelvinblockchain/libdap) - -## Build and Run tests: -``` -mkdir build -cd build -cmake -DBUILD_DAP_TESTS=ON ../ -make -ctest --verbose -``` - diff --git a/dap-sdk/crypto/.gitignore b/dap-sdk/crypto/.gitignore deleted file mode 100755 index c6127b38c1..0000000000 --- a/dap-sdk/crypto/.gitignore +++ /dev/null @@ -1,52 +0,0 @@ -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf diff --git a/dap-sdk/crypto/.travis.yml b/dap-sdk/crypto/.travis.yml deleted file mode 100755 index a79b9f067d..0000000000 --- a/dap-sdk/crypto/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -sudo: required -language: cpp -compiler: gcc -dist: xenial -notifications: - email: false - -before_install: - - git submodule init - - git submodule update --recursive - -script: - - sudo service network-manager start - - mkdir build - - cd build - - cmake -DBUILD_CRYPTO_TESTS=ON ../ - - make - - ctest --verbose - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - network-manager - diff --git a/dap-sdk/crypto/CMakeLists.txt.user b/dap-sdk/crypto/CMakeLists.txt.user deleted file mode 100644 index 82fe0bb117..0000000000 --- a/dap-sdk/crypto/CMakeLists.txt.user +++ /dev/null @@ -1,424 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 4.11.2, 2020-04-29T10:52:27. --> -<qtcreator> - <data> - <variable>EnvironmentId</variable> - <value type="QByteArray">{11b3ace2-edb6-4ae7-8e1b-fce9fa91893f}</value> - </data> - <data> - <variable>ProjectExplorer.Project.ActiveTarget</variable> - <value type="int">0</value> - </data> - <data> - <variable>ProjectExplorer.Project.EditorSettings</variable> - <valuemap type="QVariantMap"> - <value type="bool" key="EditorConfiguration.AutoIndent">true</value> - <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value> - <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value> - <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0"> - <value type="QString" key="language">Cpp</value> - <valuemap type="QVariantMap" key="value"> - <value type="QByteArray" key="CurrentPreferences">CppGlobal</value> - </valuemap> - </valuemap> - <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1"> - <value type="QString" key="language">QmlJS</value> - <valuemap type="QVariantMap" key="value"> - <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value> - </valuemap> - </valuemap> - <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value> - <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> - <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> - <value type="int" key="EditorConfiguration.IndentSize">4</value> - <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value> - <value type="int" key="EditorConfiguration.MarginColumn">80</value> - <value type="bool" key="EditorConfiguration.MouseHiding">true</value> - <value type="bool" key="EditorConfiguration.MouseNavigation">true</value> - <value type="int" key="EditorConfiguration.PaddingMode">1</value> - <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> - <value type="bool" key="EditorConfiguration.ShowMargin">false</value> - <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> - <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value> - <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value> - <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> - <value type="int" key="EditorConfiguration.TabSize">8</value> - <value type="bool" key="EditorConfiguration.UseGlobal">true</value> - <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value> - <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> - <value type="bool" key="EditorConfiguration.cleanIndentation">true</value> - <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value> - <value type="bool" key="EditorConfiguration.inEntireDocument">false</value> - </valuemap> - </data> - <data> - <variable>ProjectExplorer.Project.PluginSettings</variable> - <valuemap type="QVariantMap"> - <valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"> - <value type="QString">-fno-delayed-template-parsing</value> - </valuelist> - <value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value> - </valuemap> - </data> - <data> - <variable>ProjectExplorer.Project.Target.0</variable> - <valuemap type="QVariantMap"> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.14.2 MinGW 32-bit</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.14.2 MinGW 32-bit</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5142.win32_mingw73_kit</value> - <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> - <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> - <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> - <valuelist type="QVariantList" key="CMake.Configuration"> - <value type="QString">BUILD_CRYPTO_TESTS:BOOL=ON</value> - <value type="QString">CMAKE_BUILD_TYPE:STRING=Debug</value> - <value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value> - <value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value> - <value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value> - <value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value> - </valuelist> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:/qt_proj/build-libdap-crypto_new-Desktop_Qt_5_14_2_MinGW_32_bit-Debug</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"> - <value type="QString">all</value> - </valuelist> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"> - <value type="QString">clean</value> - </valuelist> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1"> - <valuelist type="QVariantList" key="CMake.Configuration"> - <value type="QString">CMAKE_BUILD_TYPE:STRING=Release</value> - <value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value> - <value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value> - <value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value> - <value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value> - </valuelist> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:/qt_proj/build-libdap-crypto_new-Desktop_Qt_5_14_2_MinGW_32_bit-Release</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"> - <value type="QString">all</value> - </valuelist> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"> - <value type="QString">clean</value> - </valuelist> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2"> - <valuelist type="QVariantList" key="CMake.Configuration"> - <value type="QString">CMAKE_BUILD_TYPE:STRING=RelWithDebInfo</value> - <value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value> - <value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value> - <value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value> - <value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value> - </valuelist> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:/qt_proj/build-libdap-crypto_new-Desktop_Qt_5_14_2_MinGW_32_bit-RelWithDebInfo</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"> - <value type="QString">all</value> - </valuelist> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"> - <value type="QString">clean</value> - </valuelist> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release with Debug Information</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3"> - <valuelist type="QVariantList" key="CMake.Configuration"> - <value type="QString">CMAKE_BUILD_TYPE:STRING=MinSizeRel</value> - <value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value> - <value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value> - <value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value> - <value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value> - </valuelist> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:/qt_proj/build-libdap-crypto_new-Desktop_Qt_5_14_2_MinGW_32_bit-MinSizeRel</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"> - <value type="QString">all</value> - </valuelist> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"> - <value type="QString">clean</value> - </valuelist> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Minimum Size Release</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value> - </valuemap> - <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">4</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> - </valuemap> - <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> - <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value> - <valuelist type="QVariantList" key="Analyzer.Perf.Events"> - <value type="QString">cpu-cycles</value> - </valuelist> - <valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/> - <value type="int" key="Analyzer.Perf.Frequency">250</value> - <valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments"> - <value type="QString">-e</value> - <value type="QString">cpu-cycles</value> - <value type="QString">--call-graph</value> - <value type="QString">dwarf,4096</value> - <value type="QString">-F</value> - <value type="QString">250</value> - </valuelist> - <value type="QString" key="Analyzer.Perf.SampleMode">-F</value> - <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value> - <value type="int" key="Analyzer.Perf.StackSize">4096</value> - <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value> - <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value> - <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value> - <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value> - <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value> - <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/> - <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value> - <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value> - <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value> - <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value> - <value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value> - <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value> - <value type="int" key="Analyzer.Valgrind.NumCallers">25</value> - <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/> - <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value> - <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value> - <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value> - <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value> - <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value> - <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds"> - <value type="int">0</value> - <value type="int">1</value> - <value type="int">2</value> - <value type="int">3</value> - <value type="int">4</value> - <value type="int">5</value> - <value type="int">6</value> - <value type="int">7</value> - <value type="int">8</value> - <value type="int">9</value> - <value type="int">10</value> - <value type="int">11</value> - <value type="int">12</value> - <value type="int">13</value> - <value type="int">14</value> - </valuelist> - <value type="int" key="PE.EnvironmentAspect.Base">2</value> - <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">crypto-test</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.crypto-test</value> - <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">crypto-test</value> - <value type="QString" key="RunConfiguration.Arguments"></value> - <value type="bool" key="RunConfiguration.Arguments.multi">false</value> - <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value> - <value type="bool" key="RunConfiguration.UseCppDebugger">false</value> - <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> - <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value> - <value type="bool" key="RunConfiguration.UseMultiProcess">false</value> - <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> - <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> - <value type="QString" key="RunConfiguration.WorkingDirectory"></value> - <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1"> - <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value> - <valuelist type="QVariantList" key="Analyzer.Perf.Events"> - <value type="QString">cpu-cycles</value> - </valuelist> - <valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/> - <value type="int" key="Analyzer.Perf.Frequency">250</value> - <valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments"> - <value type="QString">-e</value> - <value type="QString">cpu-cycles</value> - <value type="QString">--call-graph</value> - <value type="QString">dwarf,4096</value> - <value type="QString">-F</value> - <value type="QString">250</value> - </valuelist> - <value type="QString" key="Analyzer.Perf.SampleMode">-F</value> - <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value> - <value type="int" key="Analyzer.Perf.StackSize">4096</value> - <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value> - <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value> - <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value> - <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value> - <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value> - <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/> - <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value> - <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value> - <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value> - <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value> - <value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value> - <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value> - <value type="int" key="Analyzer.Valgrind.NumCallers">25</value> - <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/> - <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value> - <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value> - <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value> - <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value> - <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value> - <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds"> - <value type="int">0</value> - <value type="int">1</value> - <value type="int">2</value> - <value type="int">3</value> - <value type="int">4</value> - <value type="int">5</value> - <value type="int">6</value> - <value type="int">7</value> - <value type="int">8</value> - <value type="int">9</value> - <value type="int">10</value> - <value type="int">11</value> - <value type="int">12</value> - <value type="int">13</value> - <value type="int">14</value> - </valuelist> - <value type="int" key="PE.EnvironmentAspect.Base">2</value> - <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">crypto_cert_test</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.crypto_cert_test</value> - <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">crypto_cert_test</value> - <value type="QString" key="RunConfiguration.Arguments"></value> - <value type="bool" key="RunConfiguration.Arguments.multi">false</value> - <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value> - <value type="bool" key="RunConfiguration.UseCppDebugger">false</value> - <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> - <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value> - <value type="bool" key="RunConfiguration.UseMultiProcess">false</value> - <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> - <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> - <value type="QString" key="RunConfiguration.WorkingDirectory"></value> - <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value> - </valuemap> - <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">2</value> - </valuemap> - </data> - <data> - <variable>ProjectExplorer.Project.TargetCount</variable> - <value type="int">1</value> - </data> - <data> - <variable>ProjectExplorer.Project.Updater.FileVersion</variable> - <value type="int">22</value> - </data> - <data> - <variable>Version</variable> - <value type="int">22</value> - </data> -</qtcreator> diff --git a/dap-sdk/crypto/LICENSE b/dap-sdk/crypto/LICENSE deleted file mode 100755 index 0a041280bd..0000000000 --- a/dap-sdk/crypto/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/dap-sdk/crypto/Post-Quantum Key Exchange for the Internet.pdf b/dap-sdk/crypto/Post-Quantum Key Exchange for the Internet.pdf deleted file mode 100755 index a77225afa8a781d0df5e21bbaf4bf32c314299a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415950 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%0A%fc6b+ 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�Hgsn9P<zs7zm);n>!qT3L2i8=F*`|g?A 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ξ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�jeY4mASpr1~6xsaPrj=yEsS>I3f{8D{S-MYYZ< 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	_}X}@7FAN2 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 diff --git a/dap-sdk/crypto/README.md b/dap-sdk/crypto/README.md deleted file mode 100755 index 8f6b07c146..0000000000 --- a/dap-sdk/crypto/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# libdap -Deus Applications Prototypes: core library - -[](https://travis-ci.com/cellframe/libdap) - -## Build and Run tests: -``` -mkdir build -cd build -cmake -DBUILD_DAP_TESTS=ON ../ -make -ctest --verbose -``` - diff --git a/dap-sdk/net/client/.gitignore b/dap-sdk/net/client/.gitignore deleted file mode 100755 index 682ea68a9b..0000000000 --- a/dap-sdk/net/client/.gitignore +++ /dev/null @@ -1,55 +0,0 @@ -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf -/build/ -/.cproject -/.project diff --git a/dap-sdk/net/client/.travis.yml b/dap-sdk/net/client/.travis.yml deleted file mode 100755 index e7bbd5baf1..0000000000 --- a/dap-sdk/net/client/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -sudo: required -language: c -compiler: gcc -dist: xenial -notifications: - email: false - -before_install: - - git submodule init - - git submodule update - -script: - - mkdir build - - cd build - - cmake -DBUILD_DAP_CLIENT_TESTS=ON ../ - - make - - ctest --verbose - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - libjson-c-dev - - libev-dev - - libmagic-dev - diff --git a/dap-sdk/net/client/CMakeLists.txt b/dap-sdk/net/client/CMakeLists.txt old mode 100755 new mode 100644 index b6b49e7b8f..82df978c49 --- a/dap-sdk/net/client/CMakeLists.txt +++ b/dap-sdk/net/client/CMakeLists.txt @@ -2,46 +2,12 @@ cmake_minimum_required(VERSION 3.0) project(dap_client) add_definitions ("-D_GNU_SOURCE") -if(NOT SUBMODULES_NO_BUILD) - if ( NOT ( TARGET dap_core ) ) - add_subdirectory(libdap) - endif() - - if ( NOT ( TARGET dap_crypto ) ) - add_subdirectory(libdap-crypto) - endif() - - if ( NOT ( TARGET dap_server_core ) ) - add_subdirectory(libdap-server-core) - endif() - - if ( NOT ( TARGET dap_server ) ) - add_subdirectory(libdap-server) - endif() - - if ( NOT ( TARGET dap_udp_server ) ) - add_subdirectory(libdap-server-udp) - endif() - - if ( NOT ( TARGET libdap-stream ) ) - add_subdirectory(libdap-stream) - endif() - - if ( NOT ( TARGET dap_stream_ch ) ) - add_subdirectory(libdap-stream-ch) - endif() - - -endif() - -file(GLOB DAP_CLIENT_SOURCES src/*.c) -file(GLOB DAP_CLIENT_HEADERS include/*.h) +file(GLOB DAP_CLIENT_SOURCES FILES *.c) +file(GLOB DAP_CLIENT_HEADERS FILES include/*.h) if(WIN32) - include_directories(../3rdparty/wepoll/) - include_directories(../3rdparty/uthash/src/) - #include_directories(../3rdparty/curl/include/) - #add_subdirectory(libev) + include_directories(../../../3rdparty/wepoll/) + include_directories(../../../3rdparty/uthash/src/) endif() add_library(${PROJECT_NAME} STATIC ${DAP_CLIENT_HEADERS} ${DAP_CLIENT_SOURCES}) @@ -54,7 +20,7 @@ endif() target_include_directories(${PROJECT_NAME} PUBLIC include) -target_include_directories(${PROJECT_NAME} PRIVATE src) +target_include_directories(${PROJECT_NAME} PRIVATE .) if (${BUILD_DAP_CLIENT_TESTS} MATCHES ON) diff --git a/dap-sdk/net/client/LICENSE b/dap-sdk/net/client/LICENSE deleted file mode 100755 index 0a041280bd..0000000000 --- a/dap-sdk/net/client/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/dap-sdk/net/client/README.md b/dap-sdk/net/client/README.md deleted file mode 100755 index a177e1fdd0..0000000000 --- a/dap-sdk/net/client/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# libdap-client - -[](https://travis-ci.com/kelvinblockchain/libdap-client) - -DAP client diff --git a/dap-sdk/net/client/src/dap_client.c b/dap-sdk/net/client/dap_client.c similarity index 100% rename from dap-sdk/net/client/src/dap_client.c rename to dap-sdk/net/client/dap_client.c diff --git a/dap-sdk/net/client/src/dap_client_http.c b/dap-sdk/net/client/dap_client_http.c similarity index 100% rename from dap-sdk/net/client/src/dap_client_http.c rename to dap-sdk/net/client/dap_client_http.c diff --git a/dap-sdk/net/client/src/dap_client_pool.c b/dap-sdk/net/client/dap_client_pool.c similarity index 100% rename from dap-sdk/net/client/src/dap_client_pool.c rename to dap-sdk/net/client/dap_client_pool.c diff --git a/dap-sdk/net/client/src/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c similarity index 100% rename from dap-sdk/net/client/src/dap_client_pvt.c rename to dap-sdk/net/client/dap_client_pvt.c diff --git a/dap-sdk/net/client/src/dap_client_pvt_hh.c b/dap-sdk/net/client/dap_client_pvt_hh.c similarity index 100% rename from dap-sdk/net/client/src/dap_client_pvt_hh.c rename to dap-sdk/net/client/dap_client_pvt_hh.c diff --git a/dap-sdk/net/client/include/dap_client.h b/dap-sdk/net/client/include/dap_client.h old mode 100755 new mode 100644 diff --git a/dap-sdk/net/client/include/dap_client_http.h b/dap-sdk/net/client/include/dap_client_http.h old mode 100755 new mode 100644 diff --git a/dap-sdk/net/client/include/dap_client_pool.h b/dap-sdk/net/client/include/dap_client_pool.h old mode 100755 new mode 100644 diff --git a/dap-sdk/net/client/include/dap_client_pvt.h b/dap-sdk/net/client/include/dap_client_pvt.h old mode 100755 new mode 100644 diff --git a/dap-sdk/net/core/.gitignore b/dap-sdk/net/core/.gitignore deleted file mode 100755 index ea462b27ee..0000000000 --- a/dap-sdk/net/core/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -build -*.txt.user - diff --git a/dap-sdk/net/core/.travis.yml b/dap-sdk/net/core/.travis.yml deleted file mode 100755 index c5aba3c2c6..0000000000 --- a/dap-sdk/net/core/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -language: c -compiler: gcc -dist: xenial -notifications: - email: false - -before_install: - - git submodule init - - git submodule update - -script: - - mkdir build - - cd build - - cmake -DBUILD_DAP_SERVER_CORE_TESTS=ON ../ - - make - - ctest --verbose - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - libev-dev - - libmemcached-dev diff --git a/dap-sdk/net/core/CMakeLists.txt b/dap-sdk/net/core/CMakeLists.txt old mode 100755 new mode 100644 index fa70477e07..3fee161227 --- a/dap-sdk/net/core/CMakeLists.txt +++ b/dap-sdk/net/core/CMakeLists.txt @@ -5,36 +5,24 @@ set(CMAKE_C_STANDARD 11) add_definitions ("-D_GNU_SOURCE") -if(NOT SUBMODULES_NO_BUILD) - if ( NOT ( TARGET dap_core ) ) - add_subdirectory(libdap) - endif() - - if ( NOT ( TARGET dap_crypto ) ) - add_subdirectory(libdap-crypto) - endif() - -endif() - if(WIN32) - file(GLOB DAP_SERVER_CORE_SOURCES src/*.c ../3rdparty/wepoll/*.c) - file(GLOB DAP_SERVER_CORE_HEADERS include/*.h ../3rdparty/wepoll/*.h) + file(GLOB DAP_SERVER_CORE_SOURCES *.c ../../../3rdparty/wepoll/*.c) + file(GLOB DAP_SERVER_CORE_HEADERS include/*.h ../../../3rdparty/wepoll/*.h) else() - file(GLOB DAP_SERVER_CORE_SOURCES src/*.c) + file(GLOB DAP_SERVER_CORE_SOURCES *.c) file(GLOB DAP_SERVER_CORE_HEADERS include/*.h) endif() if(WIN32) - include_directories(../3rdparty/uthash/src/) - #include_directories(../3rdparty/curl/include/) - include_directories(../3rdparty/wepoll/) + include_directories(../../../3rdparty/uthash/src/) + include_directories(../../../3rdparty/wepoll/) endif() add_library(${PROJECT_NAME} STATIC ${DAP_SERVER_CORE_HEADERS} ${DAP_SERVER_CORE_SOURCES}) if(WIN32) target_link_libraries(${PROJECT_NAME} dap_core dap_crypto) - target_include_directories(${PROJECT_NAME} INTERFACE ../3rdparty/wepoll) + target_include_directories(${PROJECT_NAME} INTERFACE ../../../3rdparty/wepoll) endif() if(UNIX) diff --git a/dap-sdk/net/core/README.md b/dap-sdk/net/core/README.md deleted file mode 100755 index 6195103d43..0000000000 --- a/dap-sdk/net/core/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# libdap-server-core - -[](https://travis-ci.com/kelvinblockchain/libdap-server-core) diff --git a/dap-sdk/net/core/src/dap_client_remote.c b/dap-sdk/net/core/dap_client_remote.c old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/core/src/dap_client_remote.c rename to dap-sdk/net/core/dap_client_remote.c diff --git a/dap-sdk/net/core/src/dap_events.c b/dap-sdk/net/core/dap_events.c old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/core/src/dap_events.c rename to dap-sdk/net/core/dap_events.c diff --git a/dap-sdk/net/core/src/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/core/src/dap_events_socket.c rename to dap-sdk/net/core/dap_events_socket.c diff --git a/dap-sdk/net/core/src/dap_server.c b/dap-sdk/net/core/dap_server.c old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/core/src/dap_server.c rename to dap-sdk/net/core/dap_server.c diff --git a/dap-sdk/net/core/src/dap_traffic_track.c b/dap-sdk/net/core/dap_traffic_track.c old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/core/src/dap_traffic_track.c rename to dap-sdk/net/core/dap_traffic_track.c diff --git a/dap-sdk/net/core/include/dap_client_remote.h b/dap-sdk/net/core/include/dap_client_remote.h old mode 100755 new mode 100644 diff --git a/dap-sdk/net/core/include/dap_events.h b/dap-sdk/net/core/include/dap_events.h old mode 100755 new mode 100644 diff --git a/dap-sdk/net/core/include/dap_events_socket.h b/dap-sdk/net/core/include/dap_events_socket.h old mode 100755 new mode 100644 diff --git a/dap-sdk/net/core/include/dap_server.h b/dap-sdk/net/core/include/dap_server.h old mode 100755 new mode 100644 diff --git a/dap-sdk/net/core/include/dap_traffic_track.h b/dap-sdk/net/core/include/dap_traffic_track.h old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server-udp/.gitignore b/dap-sdk/net/server-udp/.gitignore deleted file mode 100755 index e8451f4157..0000000000 --- a/dap-sdk/net/server-udp/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -CMakeLists.txt.user -test/build diff --git a/dap-sdk/net/server-udp/.travis.yml b/dap-sdk/net/server-udp/.travis.yml deleted file mode 100755 index 256452d22b..0000000000 --- a/dap-sdk/net/server-udp/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -sudo: required -language: cpp -compiler: c -dist: xenial -notifications: - email: false - -before_install: - - git submodule init - - git submodule update --recursive - -script: - - mkdir build - - cd build - - cmake -DBUILD_DAP_UDP_SERVER_TESTS=ON ../ - - make - - ctest --verbose - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - libev-dev - diff --git a/dap-sdk/net/server-udp/CMakeLists.txt b/dap-sdk/net/server-udp/CMakeLists.txt old mode 100755 new mode 100644 index 6e1e123bf7..94dda44efb --- a/dap-sdk/net/server-udp/CMakeLists.txt +++ b/dap-sdk/net/server-udp/CMakeLists.txt @@ -1,30 +1,13 @@ cmake_minimum_required(VERSION 3.1) project (dap_udp_server C) -if(NOT SUBMODULES_NO_BUILD) -# if ( NOT ( TARGET dap_server_core ) ) -# add_subdirectory(libdap-server-core) -# endif() - - if ( NOT ( TARGET dap_core ) ) - add_subdirectory(libdap) - endif() - - if ( NOT ( TARGET dap_server_core ) ) - add_subdirectory(libdap-server-core) - endif() - - enable_testing() - add_subdirectory(test) -endif() - -set(DAP_UDP_SERVER_SRCS dap_udp_server.c dap_udp_client.c dap_dns_server.c) -set(DAP_UDP_SERVER_HEADERS dap_udp_server.h dap_udp_client.h dap_dns_server.h) +file(GLOB DAP_UDP_SERVER_SRCS *.c) +file(GLOB DAP_UDP_SERVER_HEADERS include/*.h) if(WIN32) - include_directories(../3rdparty/wepoll/) - include_directories(../3rdparty/uthash/src/) + include_directories(../../../3rdparty/wepoll/) + include_directories(../../../3rdparty/uthash/src/) #include_directories(../3rdparty/curl/include/) endif() @@ -33,3 +16,4 @@ add_library(${PROJECT_NAME} STATIC ${DAP_UDP_SERVER_SRCS}) target_link_libraries(${PROJECT_NAME} dap_core dap_server_core dap_chain_net) target_include_directories(${PROJECT_NAME} INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/dap-sdk/net/server-udp/README.md b/dap-sdk/net/server-udp/README.md deleted file mode 100755 index fd721b1b52..0000000000 --- a/dap-sdk/net/server-udp/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# libdap-server-udp - -[](https://travis-ci.com/kelvinblockchain/libdap-server-udp) diff --git a/dap-sdk/net/server-udp/dap_dns_server.c b/dap-sdk/net/server-udp/dap_dns_server.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server-udp/dap_udp_client.c b/dap-sdk/net/server-udp/dap_udp_client.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server-udp/dap_dns_server.h b/dap-sdk/net/server-udp/include/dap_dns_server.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/server-udp/dap_dns_server.h rename to dap-sdk/net/server-udp/include/dap_dns_server.h diff --git a/dap-sdk/net/server-udp/dap_udp_client.h b/dap-sdk/net/server-udp/include/dap_udp_client.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/server-udp/dap_udp_client.h rename to dap-sdk/net/server-udp/include/dap_udp_client.h diff --git a/dap-sdk/net/server-udp/dap_udp_server.h b/dap-sdk/net/server-udp/include/dap_udp_server.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/server-udp/dap_udp_server.h rename to dap-sdk/net/server-udp/include/dap_udp_server.h diff --git a/dap-sdk/net/server-udp/test/CMakeLists.txt b/dap-sdk/net/server-udp/test/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server-udp/test/main.c b/dap-sdk/net/server-udp/test/main.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/CMakeLists.txt b/dap-sdk/net/server/CMakeLists.txt old mode 100755 new mode 100644 index 47bfd5431c..dfc4ed963b --- a/dap-sdk/net/server/CMakeLists.txt +++ b/dap-sdk/net/server/CMakeLists.txt @@ -1,28 +1,8 @@ project(libdap-server C) cmake_minimum_required(VERSION 3.0) -if(NOT SUBMODULES_NO_BUILD) - if ( NOT ( TARGET dap_core ) ) - add_subdirectory(libdap) - endif() - - if ( NOT ( TARGET dap_crypto ) ) - add_subdirectory(libdap-crypto) - endif() - - if ( NOT ( TARGET dap_server_core ) ) - add_subdirectory(libdap-server-core) - endif() - -# if ( NOT ( TARGET dap_server_udp ) ) -# add_subdirectory(libdap-server-udp) -# endif() - -endif() - if (ANDROID) - add_subdirectory(libmagic) - add_subdirectory(curl) + add_subdirectory(../../../3rdparty/libmagic) endif() add_subdirectory(http_server) diff --git a/dap-sdk/net/server/enc_server/CMakeLists.txt b/dap-sdk/net/server/enc_server/CMakeLists.txt old mode 100755 new mode 100644 index 56365e5fe8..5269d02b73 --- a/dap-sdk/net/server/enc_server/CMakeLists.txt +++ b/dap-sdk/net/server/enc_server/CMakeLists.txt @@ -1,7 +1,8 @@ cmake_minimum_required(VERSION 3.0) project(dap_enc_server C) -set(DAP_ENC_SERVER_SRCS dap_enc_http.c dap_enc_ks.c) +file(GLOB DAP_ENC_SERVER_SRCS FILES *.c) +file(GLOB DAP_ENC_SERVER_HDRS FILES include/*.h) if(WIN32) add_definitions ("-DUNDEBUG") @@ -12,11 +13,13 @@ if(WIN32) add_definitions ("-D_CRT_SECURE_NO_WARNINGS") add_definitions ("-DCURL_STATICLIB") - include_directories(../../3rdparty/wepoll/) - include_directories(../../3rdparty/uthash/src/) + include_directories(../../../../3rdparty/wepoll/) + include_directories(../../../../3rdparty/uthash/src/) endif() -add_library(${PROJECT_NAME} STATIC ${DAP_ENC_SERVER_SRCS}) +add_library(${PROJECT_NAME} STATIC ${DAP_ENC_SERVER_SRCS} ${DAP_ENC_SERVER_HDRS}) +target_include_directories(${PROJECT_NAME} INTERFACE . include/) +target_include_directories(${PROJECT_NAME} PUBLIC include) if(WIN32) target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_http_server json-c @@ -44,4 +47,3 @@ if(UNIX) target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_http_server json-c ) endif() -target_include_directories(${PROJECT_NAME} INTERFACE .) diff --git a/dap-sdk/net/server/enc_server/dap_enc_http.c b/dap-sdk/net/server/enc_server/dap_enc_http.c old mode 100755 new mode 100644 index 9c91111e3b..e5513c1216 --- a/dap-sdk/net/server/enc_server/dap_enc_http.c +++ b/dap-sdk/net/server/enc_server/dap_enc_http.c @@ -38,18 +38,18 @@ #include "dap_common.h" -#include "dap_http.h" +#include "include/dap_http.h" #include "dap_http_client.h" -#include "dap_http_simple.h" +#include "include/dap_http_simple.h" #include "dap_enc.h" -#include "dap_enc_ks.h" +#include "include/dap_enc_ks.h" #include "dap_enc_key.h" #include "dap_enc_iaes.h" -#include "dap_enc_http.h" +#include "include/dap_enc_http.h" #include "dap_enc_base64.h" #include "dap_enc_msrln.h" -#include "http_status_code.h" +#include "include/http_status_code.h" #include <json-c/json.h> diff --git a/dap-sdk/net/server/enc_server/dap_enc_ks.c b/dap-sdk/net/server/enc_server/dap_enc_ks.c old mode 100755 new mode 100644 index fe0d329af4..4b8efc5bf3 --- a/dap-sdk/net/server/enc_server/dap_enc_ks.c +++ b/dap-sdk/net/server/enc_server/dap_enc_ks.c @@ -32,11 +32,11 @@ #include "uthash.h" #include "dap_common.h" -#include "../http_server/http_client/dap_http_client.h" -#include "../http_server/http_client/dap_http_header.h" +#include "../http_server/http_client/include/dap_http_client.h" +#include "../http_server/http_client/include/dap_http_header.h" #include "dap_enc.h" -#include "dap_enc_ks.h" +#include "include/dap_enc_ks.h" #include "dap_enc_key.h" #define LOG_TAG "dap_enc_ks" diff --git a/dap-sdk/net/server/enc_server/dap_enc_http.h b/dap-sdk/net/server/enc_server/include/dap_enc_http.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/server/enc_server/dap_enc_http.h rename to dap-sdk/net/server/enc_server/include/dap_enc_http.h diff --git a/dap-sdk/net/server/enc_server/dap_enc_ks.h b/dap-sdk/net/server/enc_server/include/dap_enc_ks.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/server/enc_server/dap_enc_ks.h rename to dap-sdk/net/server/enc_server/include/dap_enc_ks.h diff --git a/dap-sdk/net/server/http_server/CMakeLists.txt b/dap-sdk/net/server/http_server/CMakeLists.txt old mode 100755 new mode 100644 index ed5267eeaf..48700be821 --- a/dap-sdk/net/server/http_server/CMakeLists.txt +++ b/dap-sdk/net/server/http_server/CMakeLists.txt @@ -1,15 +1,10 @@ cmake_minimum_required(VERSION 3.0) project (dap_http_server C) -include_directories(http_client) +include_directories(http_client/include) -set(HTTP_SERVER_SRCS - dap_http.c - dap_http_folder.c - dap_http_simple.c - http_client/dap_http_client.c - http_client/dap_http_header.c - http_client/dap_http_user_agent.c) +file(GLOB HTTP_SERVER_SRCS FILES *.c http_client/*.c) +file(GLOB HTTP_SERVER_HDRS FILES include/*.h http_client/include/*.h) if(WIN32) add_definitions ("-DUNDEBUG") @@ -20,14 +15,15 @@ if(WIN32) add_definitions ("-D_CRT_SECURE_NO_WARNINGS") add_definitions ("-DCURL_STATICLIB") - include_directories(../../3rdparty/wepoll/) - include_directories(../../3rdparty/uthash/src/) + include_directories(../../../../3rdparty/wepoll/) + include_directories(../../../../3rdparty/uthash/src/) #include_directories(../../3rdparty/curl/include/) endif() -add_library(${PROJECT_NAME} STATIC ${HTTP_SERVER_SRCS}) - -target_include_directories(dap_http_server INTERFACE . http_client) +include_directories(${PROJECT_NAME} include/) +add_library(${PROJECT_NAME} STATIC ${HTTP_SERVER_SRCS} ${HTTP_SERVER_HDRS}) +target_include_directories(${PROJECT_NAME} INTERFACE . http_client/include/) +target_include_directories(${PROJECT_NAME} PUBLIC include) if(WIN32) target_link_libraries(dap_http_server dap_core dap_crypto dap_server_core magic regex tre intl iconv diff --git a/dap-sdk/net/server/http_server/dap_http.c b/dap-sdk/net/server/http_server/dap_http.c old mode 100755 new mode 100644 index 72b52ef92d..51fe57a57e --- a/dap-sdk/net/server/http_server/dap_http.c +++ b/dap-sdk/net/server/http_server/dap_http.c @@ -1,171 +1,171 @@ -/* - Copyright (c) 2017-2018 (c) Project "DeM Labs Inc" https://github.com/demlabsinc - All rights reserved. - - This file is part of DAP (Deus Applications Prototypes) the open source project - - DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DAP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <stddef.h> -#include <string.h> -#include <unistd.h> -#include <fcntl.h> -#include <errno.h> -#include <dirent.h> - -#ifndef _WIN32 -#include <netinet/in.h> -#include <sys/socket.h> -#include <sys/time.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <netdb.h> -#else -#include <winsock2.h> -#include <windows.h> -#include <mswsock.h> -#include <ws2tcpip.h> -#include <io.h> -#include <time.h> -#endif - -#include <pthread.h> - -#include "dap_common.h" -#include "dap_server.h" -#include "dap_client_remote.h" -#include "dap_http.h" -#include "dap_http_header.h" -#include "dap_http_client.h" - -#define LOG_TAG "dap_http" - - -/** - * @brief dap_http_init // Init HTTP module - * @return Zero if ok others if not - */ -int dap_http_init( ) -{ - if ( dap_http_header_init() != 0 ) { // Init submodule for headers manipulations - log_it(L_CRITICAL,"Can't init HTTP headers processing submodule"); - return -1; - } - - if ( dap_http_client_init() !=0 ) { // Init submodule for HTTP client event processing - log_it(L_CRITICAL,"Can't init HTTP client submodule"); - return -2; - } - - log_it( L_NOTICE, "Initialized HTTP server module" ); - return 0; -} - -/** - * @brief dap_http_deinit Deinit HTTP module - */ -void dap_http_deinit() -{ - dap_http_header_deinit( ); - dap_http_client_deinit( ); -} - - -/** - * @brief dap_server_http_init Init HTTP server - * @param sh Server instance - * @return 0 if ok lesser number if error - */ -int dap_http_new( dap_server_t *sh, const char * server_name ) -{ - sh->_inheritor = calloc( 1, sizeof(dap_http_t) ); - - dap_http_t *shttp = DAP_HTTP( sh ); - - shttp->server = sh; - strncpy( shttp->server_name, server_name, sizeof(shttp->server_name)-1 ); - - sh->client_new_callback = dap_http_client_new; - sh->client_delete_callback = dap_http_client_delete; - sh->client_read_callback = dap_http_client_read; - sh->client_write_callback = dap_http_client_write; - sh->client_error_callback = dap_http_client_error; - - return 0; -} - -/** - * @brief dap_http_delete Clear dap_http structure in the internal data field of dap_server_t instance - * @param sh Server's instance - * @param arg Non-used argument - */ -void dap_http_delete( dap_server_t *sh, void * arg ) -{ - (void) arg; - (void) sh; - dap_http_t *shttp = DAP_HTTP( sh ); - dap_http_url_proc_t *up, *tmp; - - HASH_ITER( hh, shttp->url_proc ,up, tmp ) { - HASH_DEL(shttp->url_proc, up); - if( up->_inheritor ) - free( up->_inheritor ); - free( up ); - } -} - - -/** - * @brief dap_http_add_proc Add custom procesor for the HTTP server - * @param sh Server's instance - * @param url_path Part of URL to be processed - * @param read_callback Callback for read in DATA state - * @param write_callback Callback for write in DATA state - * @param error_callback Callback for error processing - */ -void dap_http_add_proc(dap_http_t *sh, const char *url_path, void *internal - ,dap_http_client_callback_t new_callback - ,dap_http_client_callback_t delete_callback - ,dap_http_client_callback_t headers_read_callback - ,dap_http_client_callback_t headers_write_callback - ,dap_http_client_callback_t data_read_callback - ,dap_http_client_callback_t data_write_callback - ,dap_http_client_callback_t error_callback - - ) -{ - dap_http_url_proc_t *up = (dap_http_url_proc_t *) calloc( 1, sizeof(dap_http_url_proc_t) ); - - strncpy( up->url, url_path, sizeof(up->url)-1 ); - - up->new_callback = new_callback; - up->delete_callback = delete_callback; - - up->data_read_callback = data_read_callback; - up->data_write_callback = data_write_callback; - up->headers_read_callback = headers_read_callback; - up->headers_write_callback = headers_write_callback; - up->error_callback = error_callback; - - up->_inheritor = internal; - - HASH_ADD_STR( sh->url_proc, url, up ); - - log_it( L_DEBUG, "Added URL processor for '%s' path", up->url ); -} - - +/* + Copyright (c) 2017-2018 (c) Project "DeM Labs Inc" https://github.com/demlabsinc + All rights reserved. + + This file is part of DAP (Deus Applications Prototypes) the open source project + + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <dirent.h> + +#ifndef _WIN32 +#include <netinet/in.h> +#include <sys/socket.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <netdb.h> +#else +#include <winsock2.h> +#include <windows.h> +#include <mswsock.h> +#include <ws2tcpip.h> +#include <io.h> +#include <time.h> +#endif + +#include <pthread.h> + +#include "dap_common.h" +#include "dap_server.h" +#include "dap_client_remote.h" +#include "dap_http.h" +#include "dap_http_header.h" +#include "dap_http_client.h" + +#define LOG_TAG "dap_http" + + +/** + * @brief dap_http_init // Init HTTP module + * @return Zero if ok others if not + */ +int dap_http_init( ) +{ + if ( dap_http_header_init() != 0 ) { // Init submodule for headers manipulations + log_it(L_CRITICAL,"Can't init HTTP headers processing submodule"); + return -1; + } + + if ( dap_http_client_init() !=0 ) { // Init submodule for HTTP client event processing + log_it(L_CRITICAL,"Can't init HTTP client submodule"); + return -2; + } + + log_it( L_NOTICE, "Initialized HTTP server module" ); + return 0; +} + +/** + * @brief dap_http_deinit Deinit HTTP module + */ +void dap_http_deinit() +{ + dap_http_header_deinit( ); + dap_http_client_deinit( ); +} + + +/** + * @brief dap_server_http_init Init HTTP server + * @param sh Server instance + * @return 0 if ok lesser number if error + */ +int dap_http_new( dap_server_t *sh, const char * server_name ) +{ + sh->_inheritor = calloc( 1, sizeof(dap_http_t) ); + + dap_http_t *shttp = DAP_HTTP( sh ); + + shttp->server = sh; + strncpy( shttp->server_name, server_name, sizeof(shttp->server_name)-1 ); + + sh->client_new_callback = dap_http_client_new; + sh->client_delete_callback = dap_http_client_delete; + sh->client_read_callback = dap_http_client_read; + sh->client_write_callback = dap_http_client_write; + sh->client_error_callback = dap_http_client_error; + + return 0; +} + +/** + * @brief dap_http_delete Clear dap_http structure in the internal data field of dap_server_t instance + * @param sh Server's instance + * @param arg Non-used argument + */ +void dap_http_delete( dap_server_t *sh, void * arg ) +{ + (void) arg; + (void) sh; + dap_http_t *shttp = DAP_HTTP( sh ); + dap_http_url_proc_t *up, *tmp; + + HASH_ITER( hh, shttp->url_proc ,up, tmp ) { + HASH_DEL(shttp->url_proc, up); + if( up->_inheritor ) + free( up->_inheritor ); + free( up ); + } +} + + +/** + * @brief dap_http_add_proc Add custom procesor for the HTTP server + * @param sh Server's instance + * @param url_path Part of URL to be processed + * @param read_callback Callback for read in DATA state + * @param write_callback Callback for write in DATA state + * @param error_callback Callback for error processing + */ +void dap_http_add_proc(dap_http_t *sh, const char *url_path, void *internal + ,dap_http_client_callback_t new_callback + ,dap_http_client_callback_t delete_callback + ,dap_http_client_callback_t headers_read_callback + ,dap_http_client_callback_t headers_write_callback + ,dap_http_client_callback_t data_read_callback + ,dap_http_client_callback_t data_write_callback + ,dap_http_client_callback_t error_callback + + ) +{ + dap_http_url_proc_t *up = (dap_http_url_proc_t *) calloc( 1, sizeof(dap_http_url_proc_t) ); + + strncpy( up->url, url_path, sizeof(up->url)-1 ); + + up->new_callback = new_callback; + up->delete_callback = delete_callback; + + up->data_read_callback = data_read_callback; + up->data_write_callback = data_write_callback; + up->headers_read_callback = headers_read_callback; + up->headers_write_callback = headers_write_callback; + up->error_callback = error_callback; + + up->_inheritor = internal; + + HASH_ADD_STR( sh->url_proc, url, up ); + + log_it( L_DEBUG, "Added URL processor for '%s' path", up->url ); +} + + diff --git a/dap-sdk/net/server/http_server/dap_http_folder.c b/dap-sdk/net/server/http_server/dap_http_folder.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/http_server/dap_http_simple.c b/dap-sdk/net/server/http_server/dap_http_simple.c old mode 100755 new mode 100644 index 518e4cdcde..12345d2c3c --- a/dap-sdk/net/server/http_server/dap_http_simple.c +++ b/dap-sdk/net/server/http_server/dap_http_simple.c @@ -52,8 +52,8 @@ See more details here <http://www.gnu.org/licenses/>. #include "dap_http_user_agent.h" -#include "../enc_server/dap_enc_ks.h" -#include "../enc_server/dap_enc_http.h" +#include "../enc_server/include/dap_enc_ks.h" +#include "../enc_server/include/dap_enc_http.h" #include "http_status_code.h" diff --git a/dap-sdk/net/server/http_server/http_client/CMakeLists.txt b/dap-sdk/net/server/http_server/http_client/CMakeLists.txt old mode 100755 new mode 100644 index 7d3b34e161..b3633d7203 --- a/dap-sdk/net/server/http_server/http_client/CMakeLists.txt +++ b/dap-sdk/net/server/http_server/http_client/CMakeLists.txt @@ -1,18 +1,15 @@ cmake_minimum_required(VERSION 3.0) project (dap_http_client) -set(HTTP_SRCS dap_http_client.c dap_http_header.c) +set(HTTP_SRCS FILES *.c) +set(HTTP_HDRS FILES include/*.h) if(WIN32) - include_directories(../../../libdap/src/win32/) - include_directories(../../../3rdparty/libmemcached/) - include_directories(../../../3rdparty/libmemcached/win32/) - include_directories(../../../3rdparty/wepoll/include/) - include_directories(../../../3rdparty/uthash/src/) - include_directories(../../../3rdparty/libjson-c/) - include_directories(../../../3rdparty/libmagic/src/) - include_directories(../../../3rdparty/curl/include/) + include_directories(../../../../os/win32/) + include_directories(../../../../3rdparty/wepoll/include/) + include_directories(../../../../3rdparty/uthash/src/) + include_directories(../../../../3rdparty/libmagic/src/) endif() -add_library(${PROJECT_NAME} STATIC ${HTTP_SRCS}) +add_library(${PROJECT_NAME} STATIC ${HTTP_SRCS} ${HTTP_HDRS}) diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_client.c b/dap-sdk/net/server/http_server/http_client/dap_http_client.c old mode 100755 new mode 100644 index 4ecdcd5687..e7944d411b --- a/dap-sdk/net/server/http_server/http_client/dap_http_client.c +++ b/dap-sdk/net/server/http_server/http_client/dap_http_client.c @@ -38,8 +38,8 @@ #include "dap_common.h" #include "dap_client_remote.h" -#include "../dap_http.h" -#include "../http_status_code.h" +#include "dap_http.h" +#include "http_status_code.h" #include "dap_http_header.h" #include "dap_http_client.h" diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_header.c b/dap-sdk/net/server/http_server/http_client/dap_http_header.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_user_agent.c b/dap-sdk/net/server/http_server/http_client/dap_http_user_agent.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/http_server/http_client/http.pri b/dap-sdk/net/server/http_server/http_client/http.pri old mode 100755 new mode 100644 index 4c88864907..2feda48461 --- a/dap-sdk/net/server/http_server/http_client/http.pri +++ b/dap-sdk/net/server/http_server/http_client/http.pri @@ -1,15 +1,10 @@ HEADERS += $$PWD/dap_http_client.h \ - $$PWD/dap_http_client_simple.h \ - $$PWD/dap_http_header.h + $$PWD/include/dap_http_client_simple.h \ + $$PWD/include/dap_http_header.h SOURCES += $$PWD/dap_http_client.c \ $$PWD/dap_http_client_simple.c \ $$PWD/dap_http_header.c - -linux-* { - LIBS += -lcurl -} - INCLUDEPATH += $$PWD diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_client.h b/dap-sdk/net/server/http_server/http_client/include/dap_http_client.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/server/http_server/http_client/dap_http_client.h rename to dap-sdk/net/server/http_server/http_client/include/dap_http_client.h diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_header.h b/dap-sdk/net/server/http_server/http_client/include/dap_http_header.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/server/http_server/http_client/dap_http_header.h rename to dap-sdk/net/server/http_server/http_client/include/dap_http_header.h diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_user_agent.h b/dap-sdk/net/server/http_server/http_client/include/dap_http_user_agent.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/server/http_server/http_client/dap_http_user_agent.h rename to dap-sdk/net/server/http_server/http_client/include/dap_http_user_agent.h diff --git a/dap-sdk/net/server/http_server/dap_http.h b/dap-sdk/net/server/http_server/include/dap_http.h old mode 100755 new mode 100644 similarity index 94% rename from dap-sdk/net/server/http_server/dap_http.h rename to dap-sdk/net/server/http_server/include/dap_http.h index 9c7ee75cb2..6468119401 --- a/dap-sdk/net/server/http_server/dap_http.h +++ b/dap-sdk/net/server/http_server/include/dap_http.h @@ -1,79 +1,79 @@ -/* -* Authors: -* Dmitrii Gerasimov <naeper@demlabs.net> -* DeM Labs Inc. https://demlabs.net -* Cellframe https://cellframe.net -* Copyright (c) 2017-2019 -* All rights reserved. - -This file is part of DAP the open source project. - -DAP is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -DAP is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -See more details here <http://www.gnu.org/licenses/>. -*/ -#pragma once - -#include "dap_server.h" -#include "dap_client_remote.h" -#include "http_client/dap_http_header.h" -#include "http_client/dap_http_client.h" -#include "uthash.h" - -struct dap_http; -struct dap_http_url_processor; -//Structure for internal data of dap_server_t structure for holding special HTTP data - -// Structure for holding URL processors -typedef struct dap_http_url_proc{ - char url[512]; // First part of URL that will be processed - struct dap_http * http; // Pointer to HTTP server instance - - dap_http_client_callback_t new_callback; // Init internal structure - dap_http_client_callback_t delete_callback; // Delete internal structure - - dap_http_client_callback_t headers_read_callback; - dap_http_client_callback_t headers_write_callback; - - dap_http_client_callback_t data_read_callback; - dap_http_client_callback_t data_write_callback; - dap_http_client_callback_t error_callback; - - dap_http_client_callback_t access_callback; - - void *_inheritor; // Internal data specific to the current URL processor - UT_hash_handle hh; // makes this structure hashable with UTHASH library -} dap_http_url_proc_t; - -// Internal server structure for HTTP server -typedef struct dap_http { - dap_server_t *server; - char server_name[256]; - dap_http_url_proc_t * url_proc; -} dap_http_t; - -#define DAP_HTTP(a) ((dap_http_t *) (a)->_inheritor) - -int dap_http_init( ); // Init module -void dap_http_deinit( ); // Deinit module - -int dap_http_new( dap_server_t *sh, const char *server_name ); // Create dap_http structure in the internal data field of dap_server_t instance -void dap_http_delete( dap_server_t *sh, void *arg ); // Clear dap_http structure in the internal data field of dap_server_t instance - -void dap_http_add_proc(dap_http_t *sh, const char *url_path, void *internal - ,dap_http_client_callback_t new_callback - ,dap_http_client_callback_t delete_callback - ,dap_http_client_callback_t headers_read_callback - ,dap_http_client_callback_t headers_write_callback - ,dap_http_client_callback_t data_read_callback - ,dap_http_client_callback_t data_write_callback - ,dap_http_client_callback_t error_callback ); // Add custom procesor for the HTTP server - +/* +* Authors: +* Dmitrii Gerasimov <naeper@demlabs.net> +* DeM Labs Inc. https://demlabs.net +* Cellframe https://cellframe.net +* Copyright (c) 2017-2019 +* All rights reserved. + +This file is part of DAP the open source project. + +DAP is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +DAP is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +See more details here <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include "dap_server.h" +#include "dap_client_remote.h" +#include "dap_http_header.h" +#include "dap_http_client.h" +#include "uthash.h" + +struct dap_http; +struct dap_http_url_processor; +//Structure for internal data of dap_server_t structure for holding special HTTP data + +// Structure for holding URL processors +typedef struct dap_http_url_proc{ + char url[512]; // First part of URL that will be processed + struct dap_http * http; // Pointer to HTTP server instance + + dap_http_client_callback_t new_callback; // Init internal structure + dap_http_client_callback_t delete_callback; // Delete internal structure + + dap_http_client_callback_t headers_read_callback; + dap_http_client_callback_t headers_write_callback; + + dap_http_client_callback_t data_read_callback; + dap_http_client_callback_t data_write_callback; + dap_http_client_callback_t error_callback; + + dap_http_client_callback_t access_callback; + + void *_inheritor; // Internal data specific to the current URL processor + UT_hash_handle hh; // makes this structure hashable with UTHASH library +} dap_http_url_proc_t; + +// Internal server structure for HTTP server +typedef struct dap_http { + dap_server_t *server; + char server_name[256]; + dap_http_url_proc_t * url_proc; +} dap_http_t; + +#define DAP_HTTP(a) ((dap_http_t *) (a)->_inheritor) + +int dap_http_init( ); // Init module +void dap_http_deinit( ); // Deinit module + +int dap_http_new( dap_server_t *sh, const char *server_name ); // Create dap_http structure in the internal data field of dap_server_t instance +void dap_http_delete( dap_server_t *sh, void *arg ); // Clear dap_http structure in the internal data field of dap_server_t instance + +void dap_http_add_proc(dap_http_t *sh, const char *url_path, void *internal + ,dap_http_client_callback_t new_callback + ,dap_http_client_callback_t delete_callback + ,dap_http_client_callback_t headers_read_callback + ,dap_http_client_callback_t headers_write_callback + ,dap_http_client_callback_t data_read_callback + ,dap_http_client_callback_t data_write_callback + ,dap_http_client_callback_t error_callback ); // Add custom procesor for the HTTP server + diff --git a/dap-sdk/net/server/http_server/dap_http_folder.h b/dap-sdk/net/server/http_server/include/dap_http_folder.h old mode 100755 new mode 100644 similarity index 97% rename from dap-sdk/net/server/http_server/dap_http_folder.h rename to dap-sdk/net/server/http_server/include/dap_http_folder.h index 05d0eedec0..3dec0498a1 --- a/dap-sdk/net/server/http_server/dap_http_folder.h +++ b/dap-sdk/net/server/http_server/include/dap_http_folder.h @@ -1,31 +1,31 @@ -/* - Copyright (c) 2017-2018 (c) Project "DeM Labs Inc" https://github.com/demlabsinc - All rights reserved. - - This file is part of DAP (Deus Applications Prototypes) the open source project - - DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DAP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef _DAP_HTTP_FOLDER_H_ -#define _DAP_HTTP_FOLDER_H_ - -struct dap_http; - -extern int dap_http_folder_init(); -extern void dap_http_folder_deinit(); - -extern int dap_http_folder_add(struct dap_http *sh, const char * url_path, const char * local_path); // Add folder for reading to the HTTP server - -#endif +/* + Copyright (c) 2017-2018 (c) Project "DeM Labs Inc" https://github.com/demlabsinc + All rights reserved. + + This file is part of DAP (Deus Applications Prototypes) the open source project + + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef _DAP_HTTP_FOLDER_H_ +#define _DAP_HTTP_FOLDER_H_ + +struct dap_http; + +extern int dap_http_folder_init(); +extern void dap_http_folder_deinit(); + +extern int dap_http_folder_add(struct dap_http *sh, const char * url_path, const char * local_path); // Add folder for reading to the HTTP server + +#endif diff --git a/dap-sdk/net/server/http_server/dap_http_simple.h b/dap-sdk/net/server/http_server/include/dap_http_simple.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/server/http_server/dap_http_simple.h rename to dap-sdk/net/server/http_server/include/dap_http_simple.h diff --git a/dap-sdk/net/server/http_server/http_status_code.h b/dap-sdk/net/server/http_server/include/http_status_code.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/server/http_server/http_status_code.h rename to dap-sdk/net/server/http_server/include/http_status_code.h diff --git a/dap-sdk/net/server/test/CMakeLists.txt b/dap-sdk/net/server/test/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/test/enc_server/CMakeLists.txt b/dap-sdk/net/server/test/enc_server/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/test/enc_server/main.c b/dap-sdk/net/server/test/enc_server/main.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/test/http_server/CMakeLists.txt b/dap-sdk/net/server/test/http_server/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/test/http_server/dap_http_simple_test.c b/dap-sdk/net/server/test/http_server/dap_http_simple_test.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/test/http_server/dap_http_simple_test.h b/dap-sdk/net/server/test/http_server/dap_http_simple_test.h old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/test/http_server/dap_http_user_agent_test.c b/dap-sdk/net/server/test/http_server/dap_http_user_agent_test.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/test/http_server/dap_http_user_agent_test.h b/dap-sdk/net/server/test/http_server/dap_http_user_agent_test.h old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/test/http_server/main.c b/dap-sdk/net/server/test/http_server/main.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/server/test/main.c b/dap-sdk/net/server/test/main.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/stream/.gitignore b/dap-sdk/net/stream/.gitignore deleted file mode 100755 index 15cef3cea8..0000000000 --- a/dap-sdk/net/stream/.gitignore +++ /dev/null @@ -1,54 +0,0 @@ -# Prerequisites -*.d -build/ -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf - -*.txt.user diff --git a/dap-sdk/net/stream/.travis.yml b/dap-sdk/net/stream/.travis.yml deleted file mode 100755 index ff468b80fc..0000000000 --- a/dap-sdk/net/stream/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -language: c -compiler: gcc -dist: xenial -notifications: - email: false - -before_install: - - git submodule init - - git submodule update - -script: - - mkdir build - - cd build - - cmake -DBUILD_DAP_STREAM_TESTS=ON ../ - - make - - ctest --verbose - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - libjson-c-dev - - libev-dev - - libmagic-dev diff --git a/dap-sdk/net/stream/CMakeLists.txt b/dap-sdk/net/stream/CMakeLists.txt old mode 100755 new mode 100644 index 3e477f95a2..87d7d73645 --- a/dap-sdk/net/stream/CMakeLists.txt +++ b/dap-sdk/net/stream/CMakeLists.txt @@ -1,35 +1,6 @@ project(libdap-stream C) cmake_minimum_required(VERSION 3.0) -if(NOT SUBMODULES_NO_BUILD) - if ( NOT ( TARGET dap_core ) ) - add_subdirectory(libdap) - endif() - if ( NOT ( TARGET dap_crypto ) ) - add_subdirectory(libdap-crypto) - endif() - - if ( NOT ( TARGET libdap-server ) ) - add_subdirectory(libdap-server) - endif() - - if ( NOT ( TARGET dap_server_core ) ) - add_subdirectory(libdap-server-core) - endif() - - if ( NOT ( TARGET dap_server_udp ) ) - add_subdirectory(libdap-server-udp) - endif() - - if ( NOT ( TARGET dap_stream_ch ) ) - add_subdirectory(libdap-stream-ch) - endif() -endif() - -if(BUILD_DAP_STREAM_TESTS) - enable_testing() - add_subdirectory(test) -endif() - add_subdirectory(session) add_subdirectory(stream) +add_subdirectory(ch) diff --git a/dap-sdk/net/stream/LICENSE b/dap-sdk/net/stream/LICENSE deleted file mode 100755 index 65c5ca88a6..0000000000 --- a/dap-sdk/net/stream/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/dap-sdk/net/stream/README.md b/dap-sdk/net/stream/README.md deleted file mode 100755 index e0b4a68318..0000000000 --- a/dap-sdk/net/stream/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# libdap-stream -Deus Applications Prototypes: multichannel stream - -[](https://travis-ci.com/kelvinblockchain/libdap-stream) diff --git a/dap-sdk/net/stream/ch/.gitignore b/dap-sdk/net/stream/ch/.gitignore deleted file mode 100755 index c6127b38c1..0000000000 --- a/dap-sdk/net/stream/ch/.gitignore +++ /dev/null @@ -1,52 +0,0 @@ -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf diff --git a/dap-sdk/net/stream/ch/CMakeLists.txt b/dap-sdk/net/stream/ch/CMakeLists.txt old mode 100755 new mode 100644 index d3be99c041..8a2c0d822b --- a/dap-sdk/net/stream/ch/CMakeLists.txt +++ b/dap-sdk/net/stream/ch/CMakeLists.txt @@ -1,16 +1,17 @@ cmake_minimum_required(VERSION 3.0) project (dap_stream_ch) -set(DAP_STREAM_CH_SRCS dap_stream_ch.c dap_stream_ch_pkt.c dap_stream_ch_proc.c) +file(GLOB DAP_STREAM_CH_SRCS *.c) +file(GLOB DAP_STREAM_CH_HDRS include/*.h) if(WIN32) include_directories(../3rdparty/wepoll/) include_directories(../3rdparty/uthash/src/) - #include_directories(../3rdparty/curl/include/) endif() -add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_SRCS}) +add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_SRCS} ${DAP_STREAM_CH_HDRS}) target_link_libraries(dap_stream_ch dap_core dap_crypto dap_stream) target_include_directories(dap_stream_ch INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/dap-sdk/net/stream/ch/LICENSE b/dap-sdk/net/stream/ch/LICENSE deleted file mode 100755 index 94a9ed024d..0000000000 --- a/dap-sdk/net/stream/ch/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/dap-sdk/net/stream/ch/README.md b/dap-sdk/net/stream/ch/README.md deleted file mode 100755 index be612fe2e6..0000000000 --- a/dap-sdk/net/stream/ch/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# libdap-stream-ch -Channels managment diff --git a/dap-sdk/net/stream/ch/dap_stream_ch.c b/dap-sdk/net/stream/ch/dap_stream_ch.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/stream/ch/dap_stream_ch_pkt.c b/dap-sdk/net/stream/ch/dap_stream_ch_pkt.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/stream/ch/dap_stream_ch_proc.c b/dap-sdk/net/stream/ch/dap_stream_ch_proc.c old mode 100755 new mode 100644 diff --git a/dap-sdk/net/stream/ch/dap_stream_ch.h b/dap-sdk/net/stream/ch/include/dap_stream_ch.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/stream/ch/dap_stream_ch.h rename to dap-sdk/net/stream/ch/include/dap_stream_ch.h diff --git a/dap-sdk/net/stream/ch/dap_stream_ch_pkt.h b/dap-sdk/net/stream/ch/include/dap_stream_ch_pkt.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/stream/ch/dap_stream_ch_pkt.h rename to dap-sdk/net/stream/ch/include/dap_stream_ch_pkt.h diff --git a/dap-sdk/net/stream/ch/dap_stream_ch_proc.h b/dap-sdk/net/stream/ch/include/dap_stream_ch_proc.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/stream/ch/dap_stream_ch_proc.h rename to dap-sdk/net/stream/ch/include/dap_stream_ch_proc.h diff --git a/dap-sdk/net/stream/session/CMakeLists.txt b/dap-sdk/net/stream/session/CMakeLists.txt old mode 100755 new mode 100644 index 4c702cfbd8..ffda4c0ca4 --- a/dap-sdk/net/stream/session/CMakeLists.txt +++ b/dap-sdk/net/stream/session/CMakeLists.txt @@ -1,16 +1,16 @@ cmake_minimum_required(VERSION 2.8) project (dap_session) -set(SESSION_SRCS dap_stream_session.c) +file(GLOB SESSION_SRCS *.c) +file(GLOB SESSION_HDRS include/*.h) if(WIN32) - include_directories(../../3rdparty/wepoll/) include_directories(../../3rdparty/uthash/src/) - #include_directories(../../3rdparty/curl/include/) endif() add_library(${PROJECT_NAME} STATIC ${SESSION_SRCS}) +include_directories(include/) target_link_libraries(dap_session dap_core dap_crypto) - -target_include_directories(dap_session INTERFACE .) +target_include_directories(dap_session INTERFACE . include/) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/dap-sdk/net/stream/session/dap_stream_session.h b/dap-sdk/net/stream/session/include/dap_stream_session.h old mode 100755 new mode 100644 similarity index 100% rename from dap-sdk/net/stream/session/dap_stream_session.h rename to dap-sdk/net/stream/session/include/dap_stream_session.h diff --git a/dap-sdk/net/stream/stream/CMakeLists.txt b/dap-sdk/net/stream/stream/CMakeLists.txt index 7bb630e624..1b4ed0617c 100755 --- a/dap-sdk/net/stream/stream/CMakeLists.txt +++ b/dap-sdk/net/stream/stream/CMakeLists.txt @@ -1,20 +1,19 @@ cmake_minimum_required(VERSION 2.8) project (dap_stream) -set(STREAM_SRCS - dap_stream.c - dap_stream_ctl.c - dap_stream_pkt.c ) +file(GLOB STREAM_SRCS *.c) +file(GLOB STREAM_HDRS include/*.h) if(WIN32) - include_directories(../../3rdparty/wepoll/) - include_directories(../../3rdparty/uthash/src/) + include_directories(../../../3rdparty/wepoll/) + include_directories(../../../3rdparty/uthash/src/) #include_directories(../../3rdparty/curl/include/) endif() -add_library(${PROJECT_NAME} STATIC ${STREAM_SRCS}) +add_library(${PROJECT_NAME} STATIC ${STREAM_SRCS} ${STREAM_HDRS}) target_link_libraries(dap_stream dap_core dap_server_core dap_udp_server dap_crypto dap_http_server dap_enc_server dap_session dap_stream_ch) target_include_directories(dap_stream INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/dap-sdk/net/stream/stream/dap_stream.h b/dap-sdk/net/stream/stream/include/dap_stream.h similarity index 100% rename from dap-sdk/net/stream/stream/dap_stream.h rename to dap-sdk/net/stream/stream/include/dap_stream.h diff --git a/dap-sdk/net/stream/stream/dap_stream_ctl.h b/dap-sdk/net/stream/stream/include/dap_stream_ctl.h similarity index 100% rename from dap-sdk/net/stream/stream/dap_stream_ctl.h rename to dap-sdk/net/stream/stream/include/dap_stream_ctl.h diff --git a/dap-sdk/net/stream/stream/dap_stream_pkt.h b/dap-sdk/net/stream/stream/include/dap_stream_pkt.h similarity index 100% rename from dap-sdk/net/stream/stream/dap_stream_pkt.h rename to dap-sdk/net/stream/stream/include/dap_stream_pkt.h diff --git a/dap-sdk/net/stream/test/CMakeLists.txt b/dap-sdk/net/stream/test/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/dap-sdk/net/stream/test/main.c b/dap-sdk/net/stream/test/main.c old mode 100755 new mode 100644 diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 35b0e0cf89..d9dbd649e8 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -1,7 +1,7 @@ add_subdirectory(app-cli) add_subdirectory(chain) add_subdirectory(common) -add_subdirectory(crypto) +add_subdirectory(mining) add_subdirectory(wallet) add_subdirectory(mempool) add_subdirectory(net) @@ -9,13 +9,13 @@ add_subdirectory(net/srv) add_subdirectory(global-db) # Consensus types -add_subdirectory(types/dag) -add_subdirectory(types/block) -add_subdirectory(types/no-consensus) +add_subdirectory(type/dag) +#add_subdirectory(type/block) # Consensuses -add_subdirectory(consensus/block-pow) -add_subdirectory(consensus/block-poa) +add_subdirectory(consensus/none) +#add_subdirectory(consensus/block-pow) +#add_subdirectory(consensus/block-poa) add_subdirectory(consensus/dag-pos) add_subdirectory(consensus/dag-poa) @@ -29,4 +29,9 @@ if(NOT (WIN32)) add_subdirectory(service/vpn) endif() +add_subdirectory(service/app) +add_subdirectory(service/app-db) +add_subdirectory(service/datum) +add_subdirectory(service/mining-pool) + diff --git a/modules/app-cli/CMakeLists.txt b/modules/app-cli/CMakeLists.txt index 7ca7367a47..d03500dfa5 100644 --- a/modules/app-cli/CMakeLists.txt +++ b/modules/app-cli/CMakeLists.txt @@ -1,22 +1,9 @@ cmake_minimum_required(VERSION 2.8) project (dap_app_cli) -set(DAP_APP_CLI_SRCS - src/dap_app_cli.c - src/dap_app_cli_net.c - src/dap_app_cli_shell.c - ) +file(GLOB DAP_APP_CLI_SRCS *.c) -set(DAP_APP_CLI_HEADERS - include/dap_app_cli.h - include/dap_app_cli_net.h - include/dap_app_cli_shell.h - ) - - -if(WIN32) - #include_directories(../3rdparty/curl/include/) -endif() +file(GLOB DAP_APP_CLI_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_APP_CLI_SRCS} ${DAP_APP_CLI_HEADERS} ) diff --git a/modules/chain/CMakeLists.txt b/modules/chain/CMakeLists.txt index 493975f6a6..ed93dd69eb 100644 --- a/modules/chain/CMakeLists.txt +++ b/modules/chain/CMakeLists.txt @@ -1,9 +1,9 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain) -set(DAP_CHAIN_SRCS *.c) +file(GLOB DAP_CHAIN_SRCS *.c) -set(DAP_CHAIN_HEADERS include/*.h) +file(GLOB DAP_CHAIN_HEADERS include/*.h) if(WIN32) include_directories(../../../3rdparty/wepoll/) @@ -16,4 +16,5 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_SRCS} ${DAP_CHAIN_HEADERS}) #pkg_search_module(GLIB REQUIRED glib-2.0) target_link_libraries(dap_chain dap_core dap_chain_common dap_chain_crypto dap_chain_mempool dap_chain_global_db ${GLIB_LDFLAGS}) -target_include_directories(dap_chain INTERFACE . ${GLIB_INCLUDE_DIRS}) +target_include_directories(dap_chain INTERFACE . include/ ${GLIB_INCLUDE_DIRS}) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/channel/chain-net-srv/CMakeLists.txt b/modules/channel/chain-net-srv/CMakeLists.txt index 0be2199dfc..257582d017 100644 --- a/modules/channel/chain-net-srv/CMakeLists.txt +++ b/modules/channel/chain-net-srv/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 3.0) project (dap_stream_ch_chain_net_srv) -set(DAP_STREAM_CH_CHAIN_NET_SRV_SRCS *.c) -set(DAP_STREAM_CH_CHAIN_NET_SRV_HDRS include/*.h) +file(GLOB DAP_STREAM_CH_CHAIN_NET_SRV_SRCS *.c) +file(GLOB DAP_STREAM_CH_CHAIN_NET_SRV_HDRS include/*.h) if(WIN32) include_directories(../../../3rdparty/wepoll/) @@ -14,3 +14,4 @@ add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_CHAIN_NET_SRV_SRCS} ${DAP_STR target_link_libraries(dap_stream_ch_chain_net_srv dap_core dap_crypto dap_chain_common dap_chain dap_chain_mempool dap_chain_net dap_chain_net_srv dap_server_core dap_stream dap_stream_ch dap_stream_ch_chain dap_stream_ch_chain_net) target_include_directories(dap_stream_ch_chain_net_srv INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/channel/chain-net/CMakeLists.txt b/modules/channel/chain-net/CMakeLists.txt index 44a24c1b9e..62f2a5c4b2 100644 --- a/modules/channel/chain-net/CMakeLists.txt +++ b/modules/channel/chain-net/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 3.0) project (dap_stream_ch_chain_net) -set(DAP_STREAM_CH_CHAIN_NET_SRCS *.c) -set(DAP_STREAM_CH_CHAIN_NET_HDRS include/*.h) +file(GLOB DAP_STREAM_CH_CHAIN_NET_SRCS *.c) +file(GLOB DAP_STREAM_CH_CHAIN_NET_HDRS include/*.h) if(WIN32) include_directories(../../../3rdparty/wepoll/) @@ -15,3 +15,4 @@ target_link_libraries(dap_stream_ch_chain_net dap_core dap_crypto dap_stream dap dap_chain_net) target_include_directories(dap_stream_ch_chain_net INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/channel/chain/CMakeLists.txt b/modules/channel/chain/CMakeLists.txt index 93bbfbb055..2c31b0a784 100644 --- a/modules/channel/chain/CMakeLists.txt +++ b/modules/channel/chain/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 3.0) project (dap_stream_ch_chain) -set(DAP_STREAM_CH_CHAIN_SRCS *.c) -set(DAP_STREAM_CH_CHAIN_SRCS include/*.h) +file(GLOB DAP_STREAM_CH_CHAIN_SRCS *.c) +file(GLOB DAP_STREAM_CH_CHAIN_HDRS include/*.h) if(WIN32) include_directories(../../../3rdparty/wepoll/) @@ -14,4 +14,4 @@ add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_CHAIN_SRCS} ${DAP_STREAM_CH_C target_link_libraries(dap_stream_ch_chain dap_core dap_crypto dap_chain dap_stream dap_stream_ch) target_include_directories(dap_stream_ch_chain INTERFACE .) - +target_include_directories(${PROJECT_NAME} PUBLIC include) \ No newline at end of file diff --git a/modules/common/CMakeLists.txt b/modules/common/CMakeLists.txt index b9a1e49823..ca8333ab03 100644 --- a/modules/common/CMakeLists.txt +++ b/modules/common/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_common) -set(DAP_CHAIN_COMMON_SRCS *.c) -set(DAP_CHAIN_COMMON_HEADERS include/*.h) +file(GLOB DAP_CHAIN_COMMON_SRCS *.c) +file(GLOB DAP_CHAIN_COMMON_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_COMMON_SRCS} ${DAP_CHAIN_COMMON_HEADERS}) diff --git a/modules/consensus/block-poa/CMakeLists.txt b/modules/consensus/block-poa/CMakeLists.txt index 5a5d36de80..2d2fbe8bf0 100644 --- a/modules/consensus/block-poa/CMakeLists.txt +++ b/modules/consensus/block-poa/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_cs_block_poa) -set(DAP_CHAIN_BLOCK_CS_POA_SRCS *.c) -set(DAP_CHAIN_BLOCK_CS_POA_HEADERS include/*.h) +file(GLOB DAP_CHAIN_BLOCK_CS_POA_SRCS *.c) +file(GLOB DAP_CHAIN_BLOCK_CS_POA_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_BLOCK_CS_POA_SRCS} ${DAP_CHAIN_BLOCK_CS_POA_HEADERS}) add_definitions ("-DDAP_CHAIN_BLOCK_CS_POA") diff --git a/modules/consensus/block-pow/CMakeLists.txt b/modules/consensus/block-pow/CMakeLists.txt index 4d9b13ae14..944079a1df 100644 --- a/modules/consensus/block-pow/CMakeLists.txt +++ b/modules/consensus/block-pow/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_cs_block_pow) -set(DAP_CHAIN_BLOCK_CS_POW_SRCS *.c) -set(DAP_CHAIN_BLOCK_CS_POW_HEADERS include/*.h) +file(GLOB DAP_CHAIN_BLOCK_CS_POW_SRCS *.c) +file(GLOB DAP_CHAIN_BLOCK_CS_POW_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_BLOCK_CS_POW_SRCS} ${DAP_CHAIN_BLOCK_CS_POW_HEADERS}) diff --git a/modules/consensus/dag-poa/CMakeLists.txt b/modules/consensus/dag-poa/CMakeLists.txt index 0cea39c868..48c8e1e6f2 100644 --- a/modules/consensus/dag-poa/CMakeLists.txt +++ b/modules/consensus/dag-poa/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_cs_dag_poa) -set(DAP_CHAIN_DAG_CS_POA_SRCS *.c) -set(DAP_CHAIN_DAG_CS_POA_HEADERS include/*.h) +file(GLOB DAP_CHAIN_DAG_CS_POA_SRCS *.c) +file(GLOB DAP_CHAIN_DAG_CS_POA_HEADERS include/*.h) if(WIN32) include_directories(../../../3rdparty/wepoll/) @@ -13,3 +13,4 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DAG_CS_POA_SRCS} ${DAP_CHAIN_DAG_ target_link_libraries(dap_chain_cs_dag_poa dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_cs_dag ) target_include_directories(dap_chain_cs_dag_poa INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/consensus/dag-pos/CMakeLists.txt b/modules/consensus/dag-pos/CMakeLists.txt index 36d0f5c44f..7f35421cd0 100644 --- a/modules/consensus/dag-pos/CMakeLists.txt +++ b/modules/consensus/dag-pos/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_cs_dag_pos) -set(DAP_CHAIN_CS_DAG_POS_SRCS *.c) -set(DAP_CHAIN_CS_DAG_POS_HEADERS include/*.h) +file(GLOB DAP_CHAIN_CS_DAG_POS_SRCS *.c) +file(GLOB DAP_CHAIN_CS_DAG_POS_HEADERS include/*.h) if(WIN32) include_directories(../../../3rdparty/wepoll/) @@ -13,3 +13,4 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_CS_DAG_POS_SRCS} ${DAP_CHAIN_CS_D target_link_libraries(dap_chain_cs_dag_pos dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_cs_dag ) target_include_directories(dap_chain_cs_dag_pos INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/consensus/none/CMakeLists.txt b/modules/consensus/none/CMakeLists.txt index ec4118ffed..eb679fd4b5 100644 --- a/modules/consensus/none/CMakeLists.txt +++ b/modules/consensus/none/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 2.8) -project (dap_chain_cs_no_consensus) +project (dap_chain_cs_none) file(GLOB DAP_CHAIN_CS_NO_CONSENSUS_SRC *.c) file(GLOB DAP_CHAIN_CS_NO_CONSENSUS_HDR include/*.h) @@ -10,5 +10,6 @@ endif() add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_CS_NO_CONSENSUS_SRC} ${DAP_CHAIN_CS_NO_CONSENSUS_HDR}) -target_link_libraries(dap_chain_gdb dap_core dap_chain dap_chain_global_db dap_chain_mempool dap_chain_net) -target_include_directories(dap_chain_gdb INTERFACE .) +target_link_libraries(${PROJECT_NAME} dap_core dap_chain dap_chain_global_db dap_chain_mempool dap_chain_net) +target_include_directories(${PROJECT_NAME} INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/global-db/CMakeLists.txt b/modules/global-db/CMakeLists.txt index e837ab4541..c918ddaddc 100644 --- a/modules/global-db/CMakeLists.txt +++ b/modules/global-db/CMakeLists.txt @@ -5,19 +5,14 @@ file(GLOB DAP_CHAIN_GLOBAL_DB_SRC *.c) file(GLOB DAP_CHAIN_GLOBAL_DB_HDR include/*.h) if(WIN32) - include_directories(../../../3rdparty/wepoll/) - include_directories(../../../3rdparty/uthash/src/) + include_directories(../../3rdparty/wepoll/) + include_directories(../../3rdparty/uthash/src/) endif() - add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_GLOBAL_DB_SRC} ${DAP_CHAIN_GLOBAL_DB_HDR}) -add_subdirectory(../../../3rdparty/cuttdb) - target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_crypto sqlite3 dap_cuttdb json-c) target_include_directories(dap_chain_global_db INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) -#set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE) - -#set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE) diff --git a/modules/mempool/CMakeLists.txt b/modules/mempool/CMakeLists.txt index aa680dd6b6..004d63d862 100644 --- a/modules/mempool/CMakeLists.txt +++ b/modules/mempool/CMakeLists.txt @@ -13,3 +13,4 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_MEMPOOL_SRC} ${DAP_CHAIN_MEMPOOL_ target_link_libraries(dap_chain_mempool dap_http_server dap_client dap_chain_net dap_chain_global_db dap_core) target_include_directories(dap_chain_mempool INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/mining/CMakeLists.txt b/modules/mining/CMakeLists.txt index b3b2f16de3..d42442f1fd 100644 --- a/modules/mining/CMakeLists.txt +++ b/modules/mining/CMakeLists.txt @@ -1,11 +1,9 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_crypto) -set(DAP_CHAIN_CRYPTO_SRCS *.c) +file(GLOB DAP_CHAIN_CRYPTO_SRCS *.c) -set(DAP_CHAIN_CRYPTO_HEADERS include/*.h) - -add_subdirectory(../../../3rdparty/monero_crypto) +file(GLOB DAP_CHAIN_CRYPTO_HEADERS include/*.h) include_directories("${monero_crypto_INCLUDE_DIRS}") add_definitions ("${monero_crypto_DEFINITIONS}") @@ -13,6 +11,7 @@ add_definitions ("${monero_crypto_DEFINITIONS}") add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_CRYPTO_SRCS} ${DAP_CHAIN_CRYPTO_HEADERS}) target_include_directories(dap_chain_crypto INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) target_link_libraries(dap_chain_crypto dap_core dap_crypto dap_chain monero_crypto) set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE) diff --git a/modules/net/CMakeLists.txt b/modules/net/CMakeLists.txt index e4d7c5e545..2f19f6a87b 100644 --- a/modules/net/CMakeLists.txt +++ b/modules/net/CMakeLists.txt @@ -2,9 +2,9 @@ cmake_minimum_required(VERSION 3.0) project (dap_chain_net) -set(DAP_CHAIN_NET_SRCS *.c) +file(GLOB DAP_CHAIN_NET_SRCS *.c) -set(DAP_CHAIN_NET_HEADERS *.h) +file(GLOB DAP_CHAIN_NET_HEADERS *.h) #if (ANDROID) # set(DAP_CHAIN_NET_HEADERS ${DAP_CHAIN_NET_HEADERS} @@ -50,6 +50,7 @@ if(UNIX) endif() target_include_directories(${PROJECT_NAME} INTERFACE . ) +target_include_directories(${PROJECT_NAME} PUBLIC include) if (!WIN32) target_include_directories(${PROJECT_NAME} PUBLIC ${IPUTILS_INCLUDE_DIRS}) diff --git a/modules/net/iputils/iputils.c b/modules/net/iputils/iputils.c new file mode 100755 index 0000000000..263590139c --- /dev/null +++ b/modules/net/iputils/iputils.c @@ -0,0 +1,49 @@ +/* + * Set utilities for networking + */ + +#include <stdio.h> +#include <stdbool.h> +#include "dap_common.h" +#include "dap_strfuncs.h" + +static bool LOG_VERBOSE = false; + +/** + * Set verbose mode + */ +void iputils_set_verbose(void) +{ + LOG_VERBOSE = true; +} + +/** + * Reset verbose mode + */ +void iputils_reset_verbose(void) +{ + LOG_VERBOSE = false; +} + +// analog printf() +int log_printf(const char *format, ...) +{ + int ret = 0; + if(LOG_VERBOSE) + { + char *log_str = NULL; + va_list args; + + va_start(args, format); + log_str = dap_strdup_vprintf(format, args); + va_end(args); + + if(log_str) + { + + ret = printf("%s", log_str); + DAP_DELETE(log_str); + } + } + return ret; +} diff --git a/modules/net/iputils/iputils.h b/modules/net/iputils/iputils.h new file mode 100644 index 0000000000..0330b548f1 --- /dev/null +++ b/modules/net/iputils/iputils.h @@ -0,0 +1,189 @@ +/* + * Set utilities for networking + */ + +#ifndef _IPUTILS_H +#define _IPUTILS_H + +#include <stdint.h> +#include <stdlib.h> +#ifndef _WIN32 +#include <netinet/ip.h> +#else +#include <winsock2.h> +#include <windows.h> +#include <mswsock.h> +#include <ws2tcpip.h> +#include <io.h> +#include "win32/iphdr.h" +#include "win32/ip.h" +#define uid_t uint32_t +#endif +#include <setjmp.h> +#include <sys/time.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAXPACKET 128000 /* max packet size */ + +#define MAX_DUP_CHK 0x10000 + +#ifdef USE_BITMAP64 +typedef uint64_t bitmap_t; +# define BITMAP_SHIFT 6 +#else +typedef uint32_t bitmap_t; +# define BITMAP_SHIFT 5 +#endif + +struct rcvd_table { + bitmap_t bitmap[MAX_DUP_CHK / (sizeof(bitmap_t) * 8)]; +}; + +typedef struct ping_handle{ + int ts_type; + int nroute; + uint32_t route[10]; + + struct sockaddr_in whereto; /* who to ping */ + int optlen; + int settos; /* Set TOS, Precendence or other QOS options */ + + int broadcast_pings; + + struct sockaddr_in source; + char *device; + int pmtudisc; + struct { + + int options; + + int mark; + int sndbuf; + int ttl; + int rtt; + int rtt_addend; + uint16_t acked; + + unsigned char outpack[MAXPACKET]; + struct rcvd_table rcvd_tbl; + + // counters + long npackets; // max packets to transmit + long nreceived; // # of packets we got back + long nrepeats; // number of duplicates + long ntransmitted; // sequence # for outbound packets = #sent + long nchecksum; // replies with bad checksum + long nerrors; // icmp errors + int interval; // interval between packets (msec) + int preload; + int deadline; // time to die + int lingertime; + struct timeval start_time, cur_time; + //volatile int exiting; + //volatile int status_snapshot; + int confirm; + volatile int in_pr_addr; // pr_addr() is executing + jmp_buf pr_addr_jmp; + + /* Stupid workarounds for bugs/missing functionality in older linuces. + * confirm_flag fixes refusing service of kernels without MSG_CONFIRM. + * i.e. for linux-2.2 */ + int confirm_flag; + + // timing + int timing; // flag to do timing + long tmin; // minimum round trip time + long tmax; // maximum round trip time + /* Message for rpm maintainers: have _shame_. If you want + * to fix something send the patch to me for sanity checking. + * "sparcfix" patch is a complete non-sense, apparenly the person + * prepared it was stoned. + */ + long long tsum; // sum of all times, for doing average + long long tsum2; + int pipesize; + + int datalen; + + char *hostname; + int uid; + uid_t euid; + int ident; // process id to identify our packets + + int screen_width; + + #ifdef HAVE_LIBCAP + cap_value_t cap_raw; + cap_value_t cap_admin; + #endif + } ping_common; +}ping_handle_t; + +ping_handle_t* ping_handle_create(void); + +/** + * Send ping for ipv4 + * + * @addr host name or IP address + * @count number of packets to transmit + * @return ping time in microsecond or -1 if error + */ +int ping_util(ping_handle_t *a_ping_handle, const char *addr, int count); + +/** + * Send ping for ipv6 + * + * @addr host name or IP address + * @count number of packets to transmit + * @return ping time in microsecond or -1 if error + */ +int ping_util6(ping_handle_t *a_ping_handle, const char *addr, int count); + + +/** + * Tracepath host + * + * @addr[in] host name or IP address + * @hops[out] hops count + * @time_usec[out] latency in microseconds + * @return 0 Ok, -1 error + */ +int tracepath_util(const char *addr, int *hops, int *time_usec); + +/** + * Traceroute host + * + * @addr[in] host name or IP address + * @hops[out] hops count + * @time_usec[out] latency in microseconds + * @return 0 Ok, -1 error + */ +int traceroute_util(const char *addr, int *hops, int *time_usec); + + +/** + * Set verbose mode + */ +void iputils_set_verbose(void); +/** + * Reset verbose mode + */ +void iputils_reset_verbose(void); + + +// analog printf() +int log_printf(const char *format, ...); + +#define PACKAGE_NAME "iputils" +#define PACKAGE_VERSION "0.1" +#define IPUTILS_VERSION(_prog) "%s from %s %s\n", _prog, PACKAGE_NAME, PACKAGE_VERSION +#define UNUSED(x) (void)(x) + +#ifdef __cplusplus +} +#endif + +#endif // _IPUTILS_H diff --git a/modules/net/iputils/ping.c b/modules/net/iputils/ping.c new file mode 100644 index 0000000000..e634a606e8 --- /dev/null +++ b/modules/net/iputils/ping.c @@ -0,0 +1,1694 @@ +/* + * Copyright (c) 1989 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Mike Muuss. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/* + * P I N G . C + * + * Using the InterNet Control Message Protocol (ICMP) "ECHO" facility, + * measure round-trip-delays and packet loss across network paths. + * + * Author - + * Mike Muuss + * U. S. Army Ballistic Research Laboratory + * December, 1983 + * + * Status - + * Public Domain. Distribution Unlimited. + * Bugs - + * More statistics could always be gathered. + * If kernel does not support non-raw ICMP sockets, + * this program has to run SUID to ROOT or with + * net_cap_raw enabled. + */ + +#include "ping.h" + +#include <assert.h> +#include <netinet/ip_icmp.h> +#include <ifaddrs.h> +#include <math.h> +#include "dap_common.h" +#include "dap_strfuncs.h" +#include "iputils.h" + +#ifndef ICMP_FILTER +#define ICMP_FILTER 1 +struct icmp_filter { + uint32_t data; +}; +#endif + +ping_func_set_st ping4_func_set = { + .send_probe = ping4_send_probe, + .receive_error_msg = ping4_receive_error_msg, + .parse_reply = ping4_parse_reply, + .install_filter = ping4_install_filter +}; + +#define MAXIPLEN 60 +#define MAXICMPLEN 76 +#define NROUTES 9 /* number of record route slots */ +#define TOS_MAX 255 /* 8-bit TOS field */ + +/* +static int ts_type; +static int nroute = 0; +static uint32_t route[10]; + +static struct sockaddr_in whereto; // who to ping +static int optlen = 0; +static int settos = 0; // Set TOS, Precendence or other QOS options + +static int broadcast_pings = 0; + +static struct sockaddr_in source = { .sin_family = AF_INET }; +char *device; +int pmtudisc = -1; +*/ + +static void pr_options(ping_handle_t *a_ping_handle, unsigned char * cp, int hlen); +static void pr_iph(ping_handle_t *a_ping_handle, struct iphdr *ip); +static unsigned short in_cksum(const unsigned short *addr, int len, unsigned short salt); +static void pr_icmph(ping_handle_t *a_ping_handle, uint8_t type, uint8_t code, uint32_t info, struct icmphdr *icp); +static int parsetos(char *str); +static int parseflow(char *str); + +ping_handle_t* ping_handle_create(void) +{ + ping_handle_t *lping = DAP_NEW_Z(ping_handle_t); + lping->source.sin_family = AF_INET; + lping->pmtudisc = -1; + + lping->ping_common.interval = 1000; // interval between packets (msec) + lping->ping_common.preload = 1; + lping->ping_common.lingertime = MAXWAIT * 1000; + + + lping->ping_common.confirm_flag = MSG_CONFIRM; + + lping->ping_common.tmin = LONG_MAX; // minimum round trip time + lping->ping_common.pipesize = -1; + + lping->ping_common.datalen = DEFDATALEN; + + lping->ping_common.screen_width = INT_MAX; + +#ifdef HAVE_LIBCAP + lping->ping_common.cap_raw = CAP_NET_RAW; + lping->ping_common.cap_admin = CAP_NET_ADMIN; +#endif + + return lping; +} + +static void create_socket(ping_handle_t *a_ping_handle, socket_st *sock, int family, int socktype, int protocol, int requisite) +{ + int do_fallback = 0; + + errno = 0; + + assert(sock->fd == -1); + assert(socktype == SOCK_DGRAM || socktype == SOCK_RAW); + + /* Attempt to create a ping socket if requested. Attempt to create a raw + * socket otherwise or as a fallback. Well known errno values follow. + * + * 1) EACCES + * + * Kernel returns EACCES for all ping socket creation attempts when the + * user isn't allowed to use ping socket. A range of group ids is + * configured using the `net.ipv4.ping_group_range` sysctl. Fallback + * to raw socket is necessary. + * + * Kernel returns EACCES for all raw socket creation attempts when the + * process doesn't have the `CAP_NET_RAW` capability. + * + * 2) EAFNOSUPPORT + * + * Kernel returns EAFNOSUPPORT for IPv6 ping or raw socket creation + * attempts when run with IPv6 support disabled (e.g. via `ipv6.disable=1` + * kernel command-line option. + * + * https://github.com/iputils/iputils/issues/32 + * + * OpenVZ 2.6.32-042stab113.11 and possibly other older kernels return + * EAFNOSUPPORT for all IPv4 ping socket creation attempts due to lack + * of support in the kernel. Fallback to raw socket is necessary. + * + * https://github.com/iputils/iputils/issues/54 + * + * 3) EPROTONOSUPPORT + * + * OpenVZ 2.6.32-042stab113.11 and possibly other older kernels return + * EPROTONOSUPPORT for all IPv6 ping socket creation attempts due to lack + * of support in the kernel [1]. Debian 9.5 based container with kernel 4.10 + * returns EPROTONOSUPPORT also for IPv4 [2]. Fallback to raw socket is + * necessary. + * + * [1] https://github.com/iputils/iputils/issues/54 + * [2] https://github.com/iputils/iputils/issues/129 + */ + if(socktype == SOCK_DGRAM) + sock->fd = socket(family, socktype, protocol); + + /* Kernel doesn't support ping sockets. */ + if(sock->fd == -1 && errno == EAFNOSUPPORT && family == AF_INET) + do_fallback = 1; + if(sock->fd == -1 && errno == EPROTONOSUPPORT) + do_fallback = 1; + + /* User is not allowed to use ping sockets. */ + if(sock->fd == -1 && errno == EACCES) + do_fallback = 1; + + if(socktype == SOCK_RAW || do_fallback) { + socktype = SOCK_RAW; + sock->fd = socket(family, SOCK_RAW, protocol); + } + + if(sock->fd == -1) { + /* Report error related to disabled IPv6 only when IPv6 also failed or in + * verbose mode. Report other errors always. + */ + if((errno == EAFNOSUPPORT && socktype == AF_INET6) || (a_ping_handle->ping_common.options & F_VERBOSE) || requisite) + error(0, errno, "socket"); + if(requisite) + exit(2); + } else + sock->socktype = socktype; +} + +static void set_socket_option(socket_st *sock, int level, int optname, const void *optval, socklen_t olen) +{ + if(sock->fd == -1) + return; + + if(setsockopt(sock->fd, level, optname, optval, olen) == -1) + error(2, errno, "setsockopt"); +} + +/* Much like stdtod(3, but will fails if str is not valid number. */ +static double ping_strtod(const char *str, const char *err_msg) +{ + double num; + char *end = NULL; + + if(str == NULL || *str == '\0') + goto err; + errno = 0; +#ifdef USE_IDN + setlocale(LC_ALL, "C"); +#endif + num = strtod(str, &end); +#ifdef USE_IDN + setlocale(LC_ALL, ""); +#endif + if(errno || str == end || (end && *end)) + goto err; + switch (fpclassify(num)) { + case FP_NORMAL: + case FP_ZERO: + break; + default: + errno = ERANGE; + goto err; + } + return num; + err: + error(2, errno, "%s: %s", err_msg, str); + abort(); /* cannot be reached, above error() will exit */ + return 0.0; +} + +static int ping_main(ping_handle_t *a_ping_handle, int argc, char **argv) +{ + struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_protocol = IPPROTO_UDP, .ai_socktype = SOCK_DGRAM, .ai_flags = + getaddrinfo_flags }; + struct addrinfo *result, *ai; + int status; + int ch; + socket_st sock4 = { .fd = -1 }; + socket_st sock6 = { .fd = -1 }; + char *target; + + limit_capabilities(a_ping_handle); + +#ifdef USE_IDN + setlocale(LC_ALL, ""); + if (!strcmp(setlocale(LC_ALL, NULL), "C")) + hints.ai_flags &= ~ AI_CANONIDN; +#endif + + /* Support being called using `ping4` or `ping6` symlinks */ + if(argv[0][strlen(argv[0]) - 1] == '4') + hints.ai_family = AF_INET; + else if(argv[0][strlen(argv[0]) - 1] == '6') + hints.ai_family = AF_INET6; + + /* Parse command line options */ + while((ch = getopt(argc, argv, "h?" "4bRT:" "6F:N:" "aABc:dDfi:I:l:Lm:M:nOp:qQ:rs:S:t:UvVw:W:")) != EOF) { + switch (ch) { + /* IPv4 specific options */ + case '4': + if(hints.ai_family != AF_UNSPEC) + error(2, 0, "only one -4 or -6 option may be specified"); + hints.ai_family = AF_INET; + break; + case 'b': + a_ping_handle->broadcast_pings = 1; + break; + case 'R': + if(a_ping_handle->ping_common.options & F_TIMESTAMP) + error(2, 0, "only one of -T or -R may be used"); + a_ping_handle->ping_common.options |= F_RROUTE; + break; + case 'T': + if(a_ping_handle->ping_common.options & F_RROUTE) + error(2, 0, "only one of -T or -R may be used"); + a_ping_handle->ping_common.options |= F_TIMESTAMP; + if(strcmp(optarg, "tsonly") == 0) + a_ping_handle->ts_type = IPOPT_TS_TSONLY; + else if(strcmp(optarg, "tsandaddr") == 0) + a_ping_handle->ts_type = IPOPT_TS_TSANDADDR; + else if(strcmp(optarg, "tsprespec") == 0) + a_ping_handle->ts_type = IPOPT_TS_PRESPEC; + else + error(2, 0, "invalid timestamp type: %s", optarg); + break; + /* IPv6 specific options */ + case '6': + if(hints.ai_family != AF_UNSPEC) + error(2, 0, "only one -4 or -6 option may be specified"); + hints.ai_family = AF_INET6; + break; + case 'F': + flowlabel = parseflow(optarg); + a_ping_handle->ping_common.options |= F_FLOWINFO; + break; + case 'N': + if(niquery_option_handler(optarg) < 0) + usage(); + hints.ai_socktype = SOCK_RAW; + break; + /* Common options */ + case 'a': + a_ping_handle->ping_common.options |= F_AUDIBLE; + break; + case 'A': + a_ping_handle->ping_common.options |= F_ADAPTIVE; + break; + case 'B': + a_ping_handle->ping_common.options |= F_STRICTSOURCE; + break; + case 'c': + a_ping_handle->ping_common.npackets = atoi(optarg); + if(a_ping_handle->ping_common.npackets <= 0) + error(2, 0, "bad number of packets to transmit: %ld", a_ping_handle->ping_common.npackets); + break; + case 'd': + a_ping_handle->ping_common.options |= F_SO_DEBUG; + break; + case 'D': + a_ping_handle->ping_common.options |= F_PTIMEOFDAY; + break; + case 'i': + { + double optval; + + optval = ping_strtod(optarg, "bad timing interval"); + if(isgreater(optval, (double)(INT_MAX / 1000))) + error(2, 0, "bad timing interval: %s", optarg); + a_ping_handle->ping_common.interval = (int) (optval * 1000); + a_ping_handle->ping_common.options |= F_INTERVAL; + } + break; + case 'I': + /* IPv6 */ + if(strchr(optarg, ':')) { + char *p, *addr = strdup(optarg); + + if(!addr) + error(2, errno, "cannot copy: %s", optarg); + + p = strchr(addr, SCOPE_DELIMITER); + if(p) { + *p = '\0'; + a_ping_handle->device = optarg + (p - addr) + 1; + } + + if(inet_pton(AF_INET6, addr, (char*) &source6.sin6_addr) <= 0) + error(2, 0, "invalid source address: %s", optarg); + + a_ping_handle->ping_common.options |= F_STRICTSOURCE; + + free(addr); + } else if(inet_pton(AF_INET, optarg, &a_ping_handle->source.sin_addr) > 0) { + a_ping_handle->ping_common.options |= F_STRICTSOURCE; + } else { + a_ping_handle->device = optarg; + } + break; + case 'l': + a_ping_handle->ping_common.preload = atoi(optarg); + if(a_ping_handle->ping_common.preload <= 0) + error(2, 0, "bad preload value: %s, should be 1..%d", optarg, MAX_DUP_CHK); + if(a_ping_handle->ping_common.preload > MAX_DUP_CHK) + a_ping_handle->ping_common.preload = MAX_DUP_CHK; + if(a_ping_handle->ping_common.uid && a_ping_handle->ping_common.preload > 3) + error(2, 0, "cannot set preload to value greater than 3: %d", a_ping_handle->ping_common.preload); + break; + case 'L': + a_ping_handle->ping_common.options |= F_NOLOOP; + break; + case 'm': + { + char *endp; + a_ping_handle->ping_common.mark = (int) strtoul(optarg, &endp, 10); + if(a_ping_handle->ping_common.mark < 0 || *endp != '\0') + error(2, 0, "mark cannot be negative: %s", optarg); + a_ping_handle->ping_common.options |= F_MARK; + break; + } + case 'M': + if(strcmp(optarg, "do") == 0) + a_ping_handle->pmtudisc = IP_PMTUDISC_DO; + else if(strcmp(optarg, "dont") == 0) + a_ping_handle->pmtudisc = IP_PMTUDISC_DONT; + else if(strcmp(optarg, "want") == 0) + a_ping_handle->pmtudisc = IP_PMTUDISC_WANT; + else + error(2, 0, "invalid -M argument: %s", optarg); + break; + case 'n': + a_ping_handle->ping_common.options |= F_NUMERIC; + break; + case 'O': + a_ping_handle->ping_common.options |= F_OUTSTANDING; + break; + case 'f': + /* avoid `getaddrinfo()` during flood */ + a_ping_handle->ping_common.options |= F_FLOOD | F_NUMERIC; + setbuf(stdout, (char *) NULL); + break; + case 'p': + a_ping_handle->ping_common.options |= F_PINGFILLED; + fill(a_ping_handle, optarg, a_ping_handle->ping_common.outpack, sizeof(a_ping_handle->ping_common.outpack)); + break; + case 'q': + a_ping_handle->ping_common.options |= F_QUIET; + break; + case 'Q': + a_ping_handle->settos = parsetos(optarg); /* IPv4 */ + tclass = a_ping_handle->settos; /* IPv6 */ + break; + case 'r': + a_ping_handle->ping_common.options |= F_SO_DONTROUTE; + break; + case 's': + a_ping_handle->ping_common.datalen = atoi(optarg); + if(a_ping_handle->ping_common.datalen < 0) + error(2, 0, "illegal packet size: %d", a_ping_handle->ping_common.datalen); + if(a_ping_handle->ping_common.datalen > MAXPACKET - 8) + error(2, 0, "packet size too large: %d", a_ping_handle->ping_common.datalen); + break; + case 'S': + a_ping_handle->ping_common.sndbuf = atoi(optarg); + if(a_ping_handle->ping_common.sndbuf <= 0) + error(2, 0, "bad sndbuf value: %s", optarg); + break; + case 't': + a_ping_handle->ping_common.options |= F_TTL; + a_ping_handle->ping_common.ttl = atoi(optarg); + if(a_ping_handle->ping_common.ttl < 0 || a_ping_handle->ping_common.ttl > 255) + error(2, 0, "ttl out of range: %s", optarg); + break; + case 'U': + a_ping_handle->ping_common.options |= F_LATENCY; + break; + case 'v': + a_ping_handle->ping_common.options |= F_VERBOSE; + break; + case 'V': + printf(IPUTILS_VERSION("ping")); + exit(0); + case 'w': + a_ping_handle->ping_common.deadline = atoi(optarg); + if(a_ping_handle->ping_common.deadline < 0) + error(2, 0, "bad wait time: %s", optarg); + break; + case 'W': + { + double optval; + + optval = ping_strtod(optarg, "bad linger time"); + if(isless(optval, 0.001) || isgreater(optval, (double)(INT_MAX / 1000))) + error(2, 0, "bad linger time: %s", optarg); + /* lingertime will be converted to usec later */ + a_ping_handle->ping_common.lingertime = (int) (optval * 1000); + } + break; + default: + usage(); + break; + } + } + + argc -= optind; + argv += optind; + optind = 0; + + if(!argc) + { + //error(1, EDESTADDRREQ, "usage error"); + return -EDESTADDRREQ;// 89 Destination address required + } + + target = argv[argc - 1]; + + /* Create sockets */ + enable_capability_raw(a_ping_handle); + if(hints.ai_family != AF_INET6) + create_socket(a_ping_handle, &sock4, AF_INET, hints.ai_socktype, IPPROTO_ICMP, hints.ai_family == AF_INET); + if(hints.ai_family != AF_INET) { + create_socket(a_ping_handle, &sock6, AF_INET6, hints.ai_socktype, IPPROTO_ICMPV6, sock4.fd == -1); + /* This may not be needed if both protocol versions always had the same value, but + * since I don't know that, it's better to be safe than sorry. */ + a_ping_handle->pmtudisc = a_ping_handle->pmtudisc == IP_PMTUDISC_DO ? IPV6_PMTUDISC_DO : + a_ping_handle->pmtudisc == IP_PMTUDISC_DONT ? IPV6_PMTUDISC_DONT : + a_ping_handle->pmtudisc == IP_PMTUDISC_WANT ? IPV6_PMTUDISC_WANT : a_ping_handle->pmtudisc; + } + disable_capability_raw(a_ping_handle); + + /* Limit address family on single-protocol systems */ + if(hints.ai_family == AF_UNSPEC) { + if(sock4.fd == -1) + hints.ai_family = AF_INET6; + else if(sock6.fd == -1) + hints.ai_family = AF_INET; + } + + /* Set socket options */ + if(a_ping_handle->settos) + set_socket_option(&sock4, IPPROTO_IP, IP_TOS, &a_ping_handle->settos, sizeof (a_ping_handle->settos)); + if(tclass) + set_socket_option(&sock6, IPPROTO_IPV6, IPV6_TCLASS, &tclass, sizeof tclass); + + status = getaddrinfo(target, NULL, &hints, &result); + if(status) + { + //error(2, 0, "%s: %s", target, gai_strerror(status)); + return -EADDRNOTAVAIL;// + } + + for(ai = result; ai; ai = ai->ai_next) { + switch (ai->ai_family) { + case AF_INET: + status = ping4_run(a_ping_handle, argc, argv, ai, &sock4); + break; + case AF_INET6: + status = ping6_run(a_ping_handle, argc, argv, ai, &sock6); + break; + default: + { + //error(2, 0, "unknown protocol family: %d", ai->ai_family); + return -EPFNOSUPPORT; + } + } + + if(status == 0) + break; + } + + freeaddrinfo(result); + + return status; +} + +/** + * Send ping + * + * @type for ipv4=4, for ipv6=6 + * @addr host name or IP address + * @count number of packets to transmit + * @return ping time in microsecond or -1 if error + */ +int ping_util_common(ping_handle_t *a_ping_handle, int type, const char *addr, int count) +{ + + /* + rights for /bin/ping: -rwsr-xr-x 1 root root + current parametr: + # sysctl net.ipv4.ping_group_range + net.ipv4.ping_group_range = 1 0 + Need change range for other users: + # sysctl net.ipv4.ping_group_range="1 65000" + */ + a_ping_handle->ping_common.tsum = a_ping_handle->ping_common.ntransmitted = a_ping_handle->ping_common.nreceived = exiting = 0; + int argc = 3; + const char *argv[argc]; + if(type != 4) + argv[0] = "ping6"; + else + argv[0] = "ping4"; + argv[1] = dap_strdup_printf("-c%d", count); + argv[2] = addr; + int status = ping_main(a_ping_handle, argc, (char**) argv); + DAP_DELETE((char*) argv[1]); + if(a_ping_handle->ping_common.ntransmitted >= 1 && a_ping_handle->ping_common.nreceived >= 1) + return a_ping_handle->ping_common.tsum; + return status; +} + +/** + * Send ping for ipv4 + * + * @addr host name or IP address + * @count number of packets to transmit + * @return ping time in microsecond or -1 if error + */ +int ping_util(ping_handle_t *a_ping_handle, const char *addr, int count) +{ + return ping_util_common(a_ping_handle, 4, addr, count); +} + +/** + * Send ping for ipv6 + * + * @addr host name or IP address + * @count number of packets to transmit + * @return ping time in microsecond or -1 if error + */ +int ping_util6(ping_handle_t *a_ping_handle, const char *addr, int count) +{ + return ping_util_common(a_ping_handle, 6, addr, count); +} + +int ping4_run(ping_handle_t *a_ping_handle, int argc, char **argv, struct addrinfo *ai, socket_st *sock) +{ + static const struct addrinfo hints = { .ai_family = AF_INET, .ai_protocol = IPPROTO_UDP, .ai_flags = + getaddrinfo_flags }; + int hold, packlen; + unsigned char *packet; + char *target; + char hnamebuf[NI_MAXHOST]; + unsigned char rspace[3 + 4 * NROUTES + 1]; /* record route space */ + uint32_t *tmp_rspace; + + if(argc > 1) { + if(a_ping_handle->ping_common.options & F_RROUTE) + usage(); + else if(a_ping_handle->ping_common.options & F_TIMESTAMP) { + if(a_ping_handle->ts_type != IPOPT_TS_PRESPEC) + usage(); + if(argc > 5) + usage(); + } else { + if(argc > 10) + usage(); + a_ping_handle->ping_common.options |= F_SOURCEROUTE; + } + } + while(argc > 0) { + target = *argv; + + memset((char *) &a_ping_handle->whereto, 0, sizeof(a_ping_handle->whereto)); + a_ping_handle->whereto.sin_family = AF_INET; + if(inet_aton(target, &a_ping_handle->whereto.sin_addr) == 1) { + a_ping_handle->ping_common.hostname = target; + if(argc == 1) + a_ping_handle->ping_common.options |= F_NUMERIC; + } else { + struct addrinfo *result = NULL; + int status; + + if(argc > 1 || !ai) { + status = getaddrinfo(target, NULL, &hints, &result); + if(status) + error(2, 0, "%s: %s", target, gai_strerror(status)); + ai = result; + } + + memcpy(&a_ping_handle->whereto, ai->ai_addr, sizeof (a_ping_handle->whereto)); + memset(hnamebuf, 0, sizeof hnamebuf); + if(ai->ai_canonname) + strncpy(hnamebuf, ai->ai_canonname, sizeof hnamebuf - 1); + a_ping_handle->ping_common.hostname = hnamebuf; + + if(result) + freeaddrinfo(result); + } + if(argc > 1) + a_ping_handle->route[a_ping_handle->nroute++] = a_ping_handle->whereto.sin_addr.s_addr; + argc--; + argv++; + } + + if(a_ping_handle->source.sin_addr.s_addr == 0) { + socklen_t alen; + struct sockaddr_in dst = a_ping_handle->whereto; + int probe_fd = socket(AF_INET, SOCK_DGRAM, 0); + + if(probe_fd < 0) + error(2, errno, "socket"); + if(a_ping_handle->device) { + struct ifreq ifr; + int i; + int fds[2] = { probe_fd, sock->fd }; + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, a_ping_handle->device, IFNAMSIZ - 1); + + for(i = 0; i < 2; i++) { + int fd = fds[i]; + int rc; + int errno_save; + + enable_capability_raw(a_ping_handle); + rc = setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, a_ping_handle->device, strlen(a_ping_handle->device) + 1); + errno_save = errno; + disable_capability_raw(a_ping_handle); + + if(rc == -1) { + if(IN_MULTICAST(ntohl(dst.sin_addr.s_addr))) { + struct ip_mreqn imr; + if(ioctl(fd, SIOCGIFINDEX, &ifr) < 0) + error(2, 0, "unknown iface: %s", a_ping_handle->device); + memset(&imr, 0, sizeof(imr)); + imr.imr_ifindex = ifr.ifr_ifindex; + if(setsockopt(fd, SOL_IP, IP_MULTICAST_IF, &imr, sizeof(imr)) == -1) + error(2, errno, "IP_MULTICAST_IF"); + } else + error(2, errno_save, "SO_BINDTODEVICE %s", a_ping_handle->device); + } + } + } + + if(a_ping_handle->settos && + setsockopt(probe_fd, IPPROTO_IP, IP_TOS, (char *) &a_ping_handle->settos, sizeof(int)) < 0) + error(0, errno, "warning: QOS sockopts"); + + dst.sin_port = htons(1025); + if(a_ping_handle->nroute) + dst.sin_addr.s_addr = a_ping_handle->route[0]; + if(connect(probe_fd, (struct sockaddr*) &dst, sizeof(dst)) == -1) { + if(errno == EACCES) { + if(a_ping_handle->broadcast_pings == 0) + error(2, 0, + "Do you want to ping broadcast? Then -b. If not, check your local firewall rules"); + fprintf(stderr, "WARNING: pinging broadcast address\n"); + if(setsockopt(probe_fd, SOL_SOCKET, SO_BROADCAST, + &a_ping_handle->broadcast_pings, sizeof(a_ping_handle->broadcast_pings)) < 0) + error(2, errno, "cannot set broadcasting"); + if(connect(probe_fd, (struct sockaddr*) &dst, sizeof(dst)) == -1) + error(2, errno, "connect"); + } else + error(2, errno, "connect"); + } + alen = sizeof(a_ping_handle->source); + if(getsockname(probe_fd, (struct sockaddr*) &a_ping_handle->source, &alen) == -1) + error(2, errno, "getsockname"); + a_ping_handle->source.sin_port = 0; + + if(a_ping_handle->device) { + struct ifaddrs *ifa0, *ifa; + int ret; + + ret = getifaddrs(&ifa0); + if(ret) + error(2, errno, "gatifaddrs failed"); + for(ifa = ifa0; ifa; ifa = ifa->ifa_next) { + if(!ifa->ifa_name || !ifa->ifa_addr || + ifa->ifa_addr->sa_family != AF_INET) + continue; + if(!strcmp(ifa->ifa_name, a_ping_handle->device) && + !memcmp(&((struct sockaddr_in *) ifa->ifa_addr)->sin_addr, + &a_ping_handle->source.sin_addr, sizeof(a_ping_handle->source.sin_addr))) + break; + } + if(ifa && !memcmp(&((struct sockaddr_in *) ifa->ifa_addr)->sin_addr, + &dst.sin_addr, sizeof(a_ping_handle->source.sin_addr))) { + enable_capability_raw(a_ping_handle); + setsockopt(sock->fd, SOL_SOCKET, SO_BINDTODEVICE, "", 0); + disable_capability_raw(a_ping_handle); + } + freeifaddrs(ifa0); + if(!ifa) + error(0, 0, "Warning: source address might be selected on device other than: %s", a_ping_handle->device); + } + close(probe_fd); + } + while(0) + ; + + if(a_ping_handle->whereto.sin_addr.s_addr == 0) + a_ping_handle->whereto.sin_addr.s_addr = a_ping_handle->source.sin_addr.s_addr; + + if(a_ping_handle->device) { + struct ifreq ifr; + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, a_ping_handle->device, IFNAMSIZ - 1); + if(ioctl(sock->fd, SIOCGIFINDEX, &ifr) < 0) + error(2, 0, "unknown iface: %s", a_ping_handle->device); + } + + if(a_ping_handle->broadcast_pings || IN_MULTICAST(ntohl(a_ping_handle->whereto.sin_addr.s_addr))) { + if(a_ping_handle->ping_common.uid) { + if(a_ping_handle->ping_common.interval < 1000) + error(2, 0, "broadcast ping with too short interval: %d", a_ping_handle->ping_common.interval); + if(a_ping_handle->pmtudisc >= 0 && a_ping_handle->pmtudisc != IP_PMTUDISC_DO) + error(2, 0, "broadcast ping does not fragment"); + } + if(a_ping_handle->pmtudisc < 0) + a_ping_handle->pmtudisc = IP_PMTUDISC_DO; + } + + if(a_ping_handle->pmtudisc >= 0) { + if(setsockopt(sock->fd, SOL_IP, IP_MTU_DISCOVER, &a_ping_handle->pmtudisc, sizeof (a_ping_handle->pmtudisc)) == -1) + error(2, errno, "IP_MTU_DISCOVER"); + } + + if((a_ping_handle->ping_common.options & F_STRICTSOURCE) && + bind(sock->fd, (struct sockaddr *) &a_ping_handle->source, sizeof (a_ping_handle->source)) == -1) + error(2, errno, "bind"); + + if(sock->socktype == SOCK_RAW) { + struct icmp_filter filt; + filt.data = ~((1 << ICMP_SOURCE_QUENCH) | + (1 << ICMP_DEST_UNREACH) | + (1 << ICMP_TIME_EXCEEDED) | + (1 << ICMP_PARAMETERPROB) | + (1 << ICMP_REDIRECT) | + (1 << ICMP_ECHOREPLY)); + if(setsockopt(sock->fd, SOL_RAW, ICMP_FILTER, &filt, sizeof filt) == -1) + error(0, errno, "WARNING: setsockopt(ICMP_FILTER)"); + } + + hold = 1; + if(setsockopt(sock->fd, SOL_IP, IP_RECVERR, &hold, sizeof hold)) + error(0, 0, "WARNING: your kernel is veeery old. No problems."); + + if(sock->socktype == SOCK_DGRAM) { + if(setsockopt(sock->fd, SOL_IP, IP_RECVTTL, &hold, sizeof hold)) + error(0, errno, "WARNING: setsockopt(IP_RECVTTL)"); + if(setsockopt(sock->fd, SOL_IP, IP_RETOPTS, &hold, sizeof hold)) + error(0, errno, "WARNING: setsockopt(IP_RETOPTS)"); + } + + /* record route option */ + if(a_ping_handle->ping_common.options & F_RROUTE) { + memset(rspace, 0, sizeof(rspace)); + rspace[0] = IPOPT_NOP; + rspace[1 + IPOPT_OPTVAL] = IPOPT_RR; + rspace[1 + IPOPT_OLEN] = sizeof(rspace) - 1; + rspace[1 + IPOPT_OFFSET] = IPOPT_MINOFF; + a_ping_handle->optlen = 40; + if(setsockopt(sock->fd, IPPROTO_IP, IP_OPTIONS, rspace, sizeof rspace) < 0) + error(2, errno, "record route"); + } + if(a_ping_handle->ping_common.options & F_TIMESTAMP) { + memset(rspace, 0, sizeof(rspace)); + rspace[0] = IPOPT_TIMESTAMP; + rspace[1] = (a_ping_handle->ts_type == IPOPT_TS_TSONLY ? 40 : 36); + rspace[2] = 5; + rspace[3] = a_ping_handle->ts_type; + if(a_ping_handle->ts_type == IPOPT_TS_PRESPEC) { + int i; + rspace[1] = 4 + a_ping_handle->nroute * 8; + for(i = 0; i < a_ping_handle->nroute; i++) { + tmp_rspace = (uint32_t*) &rspace[4 + i * 8]; + *tmp_rspace = a_ping_handle->route[i]; + } + } + if(setsockopt(sock->fd, IPPROTO_IP, IP_OPTIONS, rspace, rspace[1]) < 0) { + rspace[3] = 2; + if(setsockopt(sock->fd, IPPROTO_IP, IP_OPTIONS, rspace, rspace[1]) < 0) + error(2, errno, "ts option"); + } + a_ping_handle->optlen = 40; + } + if(a_ping_handle->ping_common.options & F_SOURCEROUTE) { + int i; + memset(rspace, 0, sizeof(rspace)); + rspace[0] = IPOPT_NOOP; + rspace[1 + IPOPT_OPTVAL] = (a_ping_handle->ping_common.options & F_SO_DONTROUTE) ? IPOPT_SSRR + : + IPOPT_LSRR; + rspace[1 + IPOPT_OLEN] = 3 + a_ping_handle->nroute * 4; + rspace[1 + IPOPT_OFFSET] = IPOPT_MINOFF; + for(i = 0; i < a_ping_handle->nroute; i++) { + tmp_rspace = (uint32_t*) &rspace[4 + i * 4]; + *tmp_rspace = a_ping_handle->route[i]; + } + + if(setsockopt(sock->fd, IPPROTO_IP, IP_OPTIONS, rspace, 4 + a_ping_handle->nroute * 4) < 0) + error(2, errno, "record route"); + a_ping_handle->optlen = 40; + } + + /* Estimate memory eaten by single packet. It is rough estimate. + * Actually, for small datalen's it depends on kernel side a lot. */ + hold = a_ping_handle->ping_common.datalen + 8; + hold += ((hold + 511) / 512) * (a_ping_handle->optlen + 20 + 16 + 64 + 160); + sock_setbufs(a_ping_handle, sock, hold); + + if(a_ping_handle->broadcast_pings) { + if(setsockopt(sock->fd, SOL_SOCKET, SO_BROADCAST, &a_ping_handle->broadcast_pings, sizeof (a_ping_handle->broadcast_pings)) < 0) + error(2, errno, "cannot set broadcasting"); + } + + if(a_ping_handle->ping_common.options & F_NOLOOP) { + int loop = 0; + if(setsockopt(sock->fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof loop) == -1) + error(2, errno, "cannot disable multicast loopback"); + } + if(a_ping_handle->ping_common.options & F_TTL) { + int ittl = a_ping_handle->ping_common.ttl; + if(setsockopt(sock->fd, IPPROTO_IP, IP_MULTICAST_TTL, &a_ping_handle->ping_common.ttl, sizeof (a_ping_handle->ping_common.ttl)) == -1) + error(2, errno, "cannot set multicast time-to-live"); + if(setsockopt(sock->fd, IPPROTO_IP, IP_TTL, &ittl, sizeof ittl) == -1) + error(2, errno, "cannot set unicast time-to-live"); + } + + if(a_ping_handle->ping_common.datalen > 0xFFFF - 8 - a_ping_handle->optlen - 20) + error(2, 0, "packet size %d is too large. Maximum is %d", + a_ping_handle->ping_common.datalen, 0xFFFF - 8 - 20 - a_ping_handle->optlen); + + if(a_ping_handle->ping_common.datalen >= (int) sizeof(struct timeval)) /* can we time transfer */ + a_ping_handle->ping_common.timing = 1; + packlen = a_ping_handle->ping_common.datalen + MAXIPLEN + MAXICMPLEN; + if(!(packet = (unsigned char *) malloc((unsigned int) packlen))) + error(2, errno, "memory allocation failed"); + +//printf("PING %s (%s) ", hostname, inet_ntoa(whereto.sin_addr)); + if(a_ping_handle->device || (a_ping_handle->ping_common.options & F_STRICTSOURCE)) + printf("from %s %s: ", inet_ntoa(a_ping_handle->source.sin_addr), a_ping_handle->device ? a_ping_handle->device : ""); +//printf("%d(%d) bytes of data.\n", datalen, datalen + 8 + optlen + 20); + + setup(a_ping_handle, sock); + log_printf("main_loop start %s (%s)\n", a_ping_handle->ping_common.hostname, inet_ntoa(a_ping_handle->whereto.sin_addr)); + main_loop(a_ping_handle, &ping4_func_set, sock, packet, packlen); + log_printf("main_loop end\n"); + return 0; +} + +int ping4_receive_error_msg(ping_handle_t *a_ping_handle, socket_st *sock) +{ + ssize_t res; + char cbuf[512]; + struct iovec iov; + struct msghdr msg; + struct cmsghdr *cmsgh; + struct sock_extended_err *e; + struct icmphdr icmph; + struct sockaddr_in target; + int net_errors = 0; + int local_errors = 0; + int saved_errno = errno; + + iov.iov_base = &icmph; + iov.iov_len = sizeof(icmph); + msg.msg_name = (void*) ⌖ + msg.msg_namelen = sizeof(target); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_flags = 0; + msg.msg_control = cbuf; + msg.msg_controllen = sizeof(cbuf); + if(!sock) + return net_errors; + res = recvmsg(sock->fd, &msg, MSG_ERRQUEUE | MSG_DONTWAIT); + if(res < 0) + goto out; + + e = NULL; + for(cmsgh = CMSG_FIRSTHDR(&msg); cmsgh; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { + if(cmsgh->cmsg_level == SOL_IP) { + if(cmsgh->cmsg_type == IP_RECVERR) + e = (struct sock_extended_err *) CMSG_DATA(cmsgh); + } + } + if(e == NULL) + abort(); + + if(e->ee_origin == SO_EE_ORIGIN_LOCAL) { + local_errors++; + if(a_ping_handle->ping_common.options & F_QUIET) + goto out; + if(a_ping_handle->ping_common.options & F_FLOOD) + write_stdout("E", 1); + else if(e->ee_errno != EMSGSIZE) + error(0, 0, "local error: %s", strerror(e->ee_errno)); + else + error(0, 0, "local error: message too long, mtu=%u", e->ee_info); + a_ping_handle->ping_common.nerrors++; + } else if(e->ee_origin == SO_EE_ORIGIN_ICMP) { + struct sockaddr_in *sin = (struct sockaddr_in*) (e + 1); + + if(res < (ssize_t) sizeof(icmph) || + target.sin_addr.s_addr != a_ping_handle->whereto.sin_addr.s_addr || + icmph.type != ICMP_ECHO || + !is_ours(a_ping_handle, sock, icmph.un.echo.id)) { + /* Not our error, not an error at all. Clear. */ + saved_errno = 0; + goto out; + } + + acknowledge(a_ping_handle, ntohs(icmph.un.echo.sequence)); + + net_errors++; + a_ping_handle->ping_common.nerrors++; + if(a_ping_handle->ping_common.options & F_QUIET) + goto out; + if(a_ping_handle->ping_common.options & F_FLOOD) { + write_stdout("\bE", 2); + } else { + print_timestamp(a_ping_handle); + printf("From %s icmp_seq=%u ", pr_addr(a_ping_handle, sin, sizeof *sin), ntohs(icmph.un.echo.sequence)); + pr_icmph(a_ping_handle, e->ee_type, e->ee_code, e->ee_info, NULL); + fflush(stdout); + } + } + + out: + errno = saved_errno; + return net_errors ? net_errors : -local_errors; +} + +/* + * pinger -- + * Compose and transmit an ICMP ECHO REQUEST packet. The IP packet + * will be added on by the kernel. The ID field is our UNIX process ID, + * and the sequence number is an ascending integer. The first several bytes + * of the data portion are used to hold a UNIX "timeval" struct in VAX + * byte-order, to compute the round-trip time. + */ +int ping4_send_probe(ping_handle_t *a_ping_handle, socket_st *sock, void *packet, unsigned packet_size __attribute__((__unused__))) +{ + struct icmphdr *icp; + int cc; + int i; + + icp = (struct icmphdr *) packet; + icp->type = ICMP_ECHO; + icp->code = 0; + icp->checksum = 0; + icp->un.echo.sequence = htons(a_ping_handle->ping_common.ntransmitted + 1); + icp->un.echo.id = a_ping_handle->ping_common.ident; /* ID */ + + rcvd_clear(a_ping_handle, a_ping_handle->ping_common.ntransmitted + 1); + + if(a_ping_handle->ping_common.timing) { + if(a_ping_handle->ping_common.options & F_LATENCY) { + struct timeval tmp_tv; + gettimeofday(&tmp_tv, NULL); + memcpy(icp + 1, &tmp_tv, sizeof(tmp_tv)); + } else { + memset(icp + 1, 0, sizeof(struct timeval)); + } + } + + cc = a_ping_handle->ping_common.datalen + 8; /* skips ICMP portion */ + + /* compute ICMP checksum here */ + icp->checksum = in_cksum((unsigned short *) icp, cc, 0); + + if(a_ping_handle->ping_common.timing && !(a_ping_handle->ping_common.options & F_LATENCY)) { + struct timeval tmp_tv; + gettimeofday(&tmp_tv, NULL); + memcpy(icp + 1, &tmp_tv, sizeof(tmp_tv)); + icp->checksum = in_cksum((unsigned short *) &tmp_tv, sizeof(tmp_tv), ~icp->checksum); + } + + i = sendto(sock->fd, icp, cc, 0, (struct sockaddr*) &a_ping_handle->whereto, sizeof(a_ping_handle->whereto)); + //log_printf("**sendto(fd=%d,icp=0x%x,cc=%d)=%d\n",sock->fd,&icp,cc,i); + return (cc == i ? 0 : i); +} + +/* + * parse_reply -- + * Print out the packet, if it came from us. This logic is necessary + * because ALL readers of the ICMP socket get a copy of ALL ICMP packets + * which arrive ('tis only fair). This permits multiple copies of this + * program to be run without having intermingled output (or statistics!). + */ +static +void pr_echo_reply(uint8_t *_icp, int len __attribute__((__unused__))) +{ + struct icmphdr *icp = (struct icmphdr *) _icp; + log_printf(" icmp_seq=%u", ntohs(icp->un.echo.sequence)); +} + +int +ping4_parse_reply(ping_handle_t *a_ping_handle, struct socket_st *sock, struct msghdr *msg, int cc, void *addr, struct timeval *tv) +{ + struct sockaddr_in *from = addr; + uint8_t *buf = msg->msg_iov->iov_base; + struct icmphdr *icp; + struct iphdr *ip; + int hlen; + int csfailed; + struct cmsghdr *cmsgh; + int reply_ttl; + uint8_t *opts, *tmp_ttl; + int olen; + + /* Check the IP header */ + ip = (struct iphdr *) buf; + if(sock->socktype == SOCK_RAW) { + hlen = ip->ihl * 4; + if(cc < hlen + 8 || ip->ihl < 5) { + if(a_ping_handle->ping_common.options & F_VERBOSE) + error(0, 0, "packet too short (%d bytes) from %s", cc, + pr_addr(a_ping_handle, from, sizeof *from)); + return 1; + } + reply_ttl = ip->ttl; + opts = buf + sizeof(struct iphdr); + olen = hlen - sizeof(struct iphdr); + } else { + hlen = 0; + reply_ttl = 0; + opts = buf; + olen = 0; + for(cmsgh = CMSG_FIRSTHDR(msg); cmsgh; cmsgh = CMSG_NXTHDR(msg, cmsgh)) { + if(cmsgh->cmsg_level != SOL_IP) + continue; + if(cmsgh->cmsg_type == IP_TTL) { + if(cmsgh->cmsg_len < sizeof(int)) + continue; + tmp_ttl = (uint8_t *) CMSG_DATA(cmsgh); + reply_ttl = (int) *tmp_ttl; + } else if(cmsgh->cmsg_type == IP_RETOPTS) { + opts = (uint8_t *) CMSG_DATA(cmsgh); + olen = cmsgh->cmsg_len; + } + } + } + + /* Now the ICMP part */ + cc -= hlen; + icp = (struct icmphdr *) (buf + hlen); + csfailed = in_cksum((unsigned short *) icp, cc, 0); + + if(icp->type == ICMP_ECHOREPLY) { + //log_printf("in ping4_parse_reply00\n"); + if(!is_ours(a_ping_handle, sock, icp->un.echo.id)) + return 1; /* 'Twas not our ECHO */ + if(!contains_pattern_in_payload(a_ping_handle, (uint8_t*) (icp + 1))) + return 1; /* 'Twas really not our ECHO */ + if(gather_statistics(a_ping_handle, (uint8_t*) icp, sizeof(*icp), cc, + ntohs(icp->un.echo.sequence), + reply_ttl, 0, tv, pr_addr(a_ping_handle, from, sizeof *from), + pr_echo_reply)) { + fflush(stdout); + return 0; + } + //log_printf("in ping4_parse_reply01\n"); + } else { + /* We fall here when a redirect or source quench arrived. */ + switch (icp->type) { + case ICMP_ECHO: + /* MUST NOT */ + return 1; + case ICMP_SOURCE_QUENCH: + case ICMP_REDIRECT: + case ICMP_DEST_UNREACH: + case ICMP_TIME_EXCEEDED: + case ICMP_PARAMETERPROB: + { + struct iphdr * iph = (struct iphdr *) (&icp[1]); + struct icmphdr *icp1 = (struct icmphdr*) ((unsigned char *) iph + iph->ihl * 4); + int error_pkt; + if(cc < (int) (8 + sizeof(struct iphdr) + 8) || + cc < 8 + iph->ihl * 4 + 8) + return 1; + if(icp1->type != ICMP_ECHO || + iph->daddr != a_ping_handle->whereto.sin_addr.s_addr || + !is_ours(a_ping_handle, sock, icp1->un.echo.id)) + return 1; + error_pkt = (icp->type != ICMP_REDIRECT && + icp->type != ICMP_SOURCE_QUENCH); + if(error_pkt) { + acknowledge(a_ping_handle, ntohs(icp1->un.echo.sequence)); + return 0; + } + if(a_ping_handle->ping_common.options & (F_QUIET | F_FLOOD)) + return 1; + print_timestamp(a_ping_handle); + log_printf("From %s: icmp_seq=%u ", + pr_addr(a_ping_handle, from, sizeof *from), + ntohs(icp1->un.echo.sequence)); + if(csfailed) + log_printf("(BAD CHECKSUM)"); + pr_icmph(a_ping_handle, icp->type, icp->code, ntohl(icp->un.gateway), icp); + return 1; + } + default: + /* MUST NOT */ + break; + } + if((a_ping_handle->ping_common.options & F_FLOOD) && !(a_ping_handle->ping_common.options & (F_VERBOSE | F_QUIET))) { + if(!csfailed) + write_stdout("!E", 2); + else + write_stdout("!EC", 3); + return 0; + } + if(!(a_ping_handle->ping_common.options & F_VERBOSE) || a_ping_handle->ping_common.uid) + return 0; + if(a_ping_handle->ping_common.options & F_PTIMEOFDAY) { + struct timeval recv_time; + gettimeofday(&recv_time, NULL); + log_printf("%lu.%06lu ", (unsigned long) recv_time.tv_sec, (unsigned long) recv_time.tv_usec); + } + printf("From %s: ", pr_addr(a_ping_handle, from, sizeof *from)); + if(csfailed) { + log_printf("(BAD CHECKSUM)\n"); + return 0; + } + pr_icmph(a_ping_handle, icp->type, icp->code, ntohl(icp->un.gateway), icp); + return 0; + } + + if(a_ping_handle->ping_common.options & F_AUDIBLE) { + log_printf("\a"); //putchar('\a'); + if(a_ping_handle->ping_common.options & F_FLOOD) + fflush(stdout); + } + if(!(a_ping_handle->ping_common.options & F_FLOOD)) { + pr_options(a_ping_handle, opts, olen + sizeof(struct iphdr)); + + log_printf("\n"); //putchar('\n'); + fflush(stdout); + } + return 0; +} + +#if BYTE_ORDER == LITTLE_ENDIAN +# define ODDBYTE(v) (v) +#elif BYTE_ORDER == BIG_ENDIAN +# define ODDBYTE(v) ((unsigned short)(v) << 8) +#else +# define ODDBYTE(v) htons((unsigned short)(v) << 8) +#endif + +unsigned short +in_cksum(const unsigned short *addr, int len, unsigned short csum) +{ + int nleft = len; + const unsigned short *w = addr; + unsigned short answer; + int sum = csum; + + /* + * Our algorithm is simple, using a 32 bit accumulator (sum), + * we add sequential 16 bit words to it, and at the end, fold + * back all the carry bits from the top 16 bits into the lower + * 16 bits. + */ + while(nleft > 1) { + sum += *w++; + nleft -= 2; + } + + /* mop up an odd byte, if necessary */ + if(nleft == 1) + sum += ODDBYTE(*(unsigned char * )w); /* le16toh() may be unavailable on old systems */ + + /* + * add back carry outs from top 16 bits to low 16 bits + */ + sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ + sum += (sum >> 16); /* add carry */ + answer = ~sum; /* truncate to 16 bits */ + return (answer); +} + +/* + * pr_icmph -- + * Print a descriptive string about an ICMP header. + */ +void pr_icmph(ping_handle_t *a_ping_handle, uint8_t type, uint8_t code, uint32_t info, struct icmphdr *icp) +{ + switch (type) { + case ICMP_ECHOREPLY: + printf("Echo Reply\n"); + /* XXX ID + Seq + Data */ + break; + case ICMP_DEST_UNREACH: + switch (code) { + case ICMP_NET_UNREACH: + printf("Destination Net Unreachable\n"); + break; + case ICMP_HOST_UNREACH: + printf("Destination Host Unreachable\n"); + break; + case ICMP_PROT_UNREACH: + printf("Destination Protocol Unreachable\n"); + break; + case ICMP_PORT_UNREACH: + printf("Destination Port Unreachable\n"); + break; + case ICMP_FRAG_NEEDED: + printf("Frag needed and DF set (mtu = %u)\n", info); + break; + case ICMP_SR_FAILED: + printf("Source Route Failed\n"); + break; + case ICMP_NET_UNKNOWN: + printf("Destination Net Unknown\n"); + break; + case ICMP_HOST_UNKNOWN: + printf("Destination Host Unknown\n"); + break; + case ICMP_HOST_ISOLATED: + printf("Source Host Isolated\n"); + break; + case ICMP_NET_ANO: + printf("Destination Net Prohibited\n"); + break; + case ICMP_HOST_ANO: + printf("Destination Host Prohibited\n"); + break; + case ICMP_NET_UNR_TOS: + printf("Destination Net Unreachable for Type of Service\n"); + break; + case ICMP_HOST_UNR_TOS: + printf("Destination Host Unreachable for Type of Service\n"); + break; + case ICMP_PKT_FILTERED: + printf("Packet filtered\n"); + break; + case ICMP_PREC_VIOLATION: + printf("Precedence Violation\n"); + break; + case ICMP_PREC_CUTOFF: + printf("Precedence Cutoff\n"); + break; + default: + printf("Dest Unreachable, Bad Code: %d\n", code); + break; + } + if(icp && (a_ping_handle->ping_common.options & F_VERBOSE)) + pr_iph(a_ping_handle, (struct iphdr*) (icp + 1)); + break; + case ICMP_SOURCE_QUENCH: + printf("Source Quench\n"); + if(icp && (a_ping_handle->ping_common.options & F_VERBOSE)) + pr_iph(a_ping_handle, (struct iphdr*) (icp + 1)); + break; + case ICMP_REDIRECT: + switch (code) { + case ICMP_REDIR_NET: + printf("Redirect Network"); + break; + case ICMP_REDIR_HOST: + printf("Redirect Host"); + break; + case ICMP_REDIR_NETTOS: + printf("Redirect Type of Service and Network"); + break; + case ICMP_REDIR_HOSTTOS: + printf("Redirect Type of Service and Host"); + break; + default: + printf("Redirect, Bad Code: %d", code); + break; + } + { + struct sockaddr_in sin = { .sin_family = AF_INET, .sin_addr = { icp ? icp->un.gateway : info } }; + + printf("(New nexthop: %s)\n", pr_addr(a_ping_handle, &sin, sizeof sin)); + } + if(icp && (a_ping_handle->ping_common.options & F_VERBOSE)) + pr_iph(a_ping_handle, (struct iphdr*) (icp + 1)); + break; + case ICMP_ECHO: + printf("Echo Request\n"); + /* XXX ID + Seq + Data */ + break; + case ICMP_TIME_EXCEEDED: + switch (code) { + case ICMP_EXC_TTL: + printf("Time to live exceeded\n"); + break; + case ICMP_EXC_FRAGTIME: + printf("Frag reassembly time exceeded\n"); + break; + default: + printf("Time exceeded, Bad Code: %d\n", code); + break; + } + if(icp && (a_ping_handle->ping_common.options & F_VERBOSE)) + pr_iph(a_ping_handle, (struct iphdr*) (icp + 1)); + break; + case ICMP_PARAMETERPROB: + printf("Parameter problem: pointer = %u\n", icp ? (ntohl(icp->un.gateway) >> 24) : info); + if(icp && (a_ping_handle->ping_common.options & F_VERBOSE)) + pr_iph(a_ping_handle, (struct iphdr*) (icp + 1)); + break; + case ICMP_TIMESTAMP: + printf("Timestamp\n"); + /* XXX ID + Seq + 3 timestamps */ + break; + case ICMP_TIMESTAMPREPLY: + printf("Timestamp Reply\n"); + /* XXX ID + Seq + 3 timestamps */ + break; + case ICMP_INFO_REQUEST: + printf("Information Request\n"); + /* XXX ID + Seq */ + break; + case ICMP_INFO_REPLY: + printf("Information Reply\n"); + /* XXX ID + Seq */ + break; +#ifdef ICMP_MASKREQ + case ICMP_MASKREQ: + printf("Address Mask Request\n"); + break; +#endif +#ifdef ICMP_MASKREPLY + case ICMP_MASKREPLY: + printf("Address Mask Reply\n"); + break; +#endif + default: + printf("Bad ICMP type: %d\n", type); + } +} + +void pr_options(ping_handle_t *a_ping_handle, unsigned char * cp, int hlen) +{ + int i, j; + int olen, totlen; + unsigned char * optptr; + static int old_rrlen; + static char old_rr[MAX_IPOPTLEN]; + + totlen = hlen - sizeof(struct iphdr); + optptr = cp; + + while(totlen > 0) { + if(*optptr == IPOPT_EOL) + break; + if(*optptr == IPOPT_NOP) { + totlen--; + optptr++; + printf("\nNOP"); + continue; + } + cp = optptr; + olen = optptr[1]; + if(olen < 2 || olen > totlen) + break; + + switch (*cp) { + case IPOPT_SSRR: + case IPOPT_LSRR: + printf("\n%cSRR: ", *cp == IPOPT_SSRR ? 'S' : 'L'); + j = *++cp; + cp++; + if(j > IPOPT_MINOFF) { + for(;;) { + uint32_t address; + memcpy(&address, cp, 4); + cp += 4; + if(address == 0) + printf("\t0.0.0.0"); + else { + struct sockaddr_in sin = { .sin_family = AF_INET, .sin_addr = { address } }; + + printf("\t%s", pr_addr(a_ping_handle, &sin, sizeof sin)); + } + j -= 4; + putchar('\n'); + if(j <= IPOPT_MINOFF) + break; + } + } + break; + case IPOPT_RR: + j = *++cp; /* get length */ + i = *++cp; /* and pointer */ + if(i > j) + i = j; + i -= IPOPT_MINOFF; + if(i <= 0) + break; + if(i == old_rrlen + && !memcmp(cp, old_rr, i) + && !(a_ping_handle->ping_common.options & F_FLOOD)) { + printf("\t(same route)"); + break; + } + old_rrlen = i; + memcpy(old_rr, (char *) cp, i); + printf("\nRR: "); + cp++; + for(;;) { + uint32_t address; + memcpy(&address, cp, 4); + cp += 4; + if(address == 0) + printf("\t0.0.0.0"); + else { + struct sockaddr_in sin = { .sin_family = AF_INET, .sin_addr = { address } }; + + printf("\t%s", pr_addr(a_ping_handle, &sin, sizeof sin)); + } + i -= 4; + putchar('\n'); + if(i <= 0) + break; + } + break; + case IPOPT_TS: + { + int stdtime = 0, nonstdtime = 0; + uint8_t flags; + j = *++cp; /* get length */ + i = *++cp; /* and pointer */ + if(i > j) + i = j; + i -= 5; + if(i <= 0) + break; + flags = *++cp; + printf("\nTS: "); + cp++; + for(;;) { + long l; + + if((flags & 0xF) != IPOPT_TS_TSONLY) { + uint32_t address; + memcpy(&address, cp, 4); + cp += 4; + if(address == 0) + printf("\t0.0.0.0"); + else { + struct sockaddr_in sin = { .sin_family = AF_INET, .sin_addr = { address } }; + + printf("\t%s", pr_addr(a_ping_handle, &sin, sizeof sin)); + } + i -= 4; + if(i <= 0) + break; + } + l = *cp++; + l = (l << 8) + *cp++; + l = (l << 8) + *cp++; + l = (l << 8) + *cp++; + + if(l & 0x80000000) { + if(nonstdtime == 0) + printf("\t%ld absolute not-standard", l & 0x7fffffff); + else + printf("\t%ld not-standard", (l & 0x7fffffff) - nonstdtime); + nonstdtime = l & 0x7fffffff; + } else { + if(stdtime == 0) + printf("\t%ld absolute", l); + else + printf("\t%ld", l - stdtime); + stdtime = l; + } + i -= 4; + putchar('\n'); + if(i <= 0) + break; + } + if(flags >> 4) + printf("Unrecorded hops: %d\n", flags >> 4); + break; + } + default: + printf("\nunknown option %x", *cp); + break; + } + totlen -= olen; + optptr += olen; + } +} + +/* + * pr_iph -- + * Print an IP header with options. + */ +void pr_iph(ping_handle_t *a_ping_handle, struct iphdr *ip) +{ + int hlen; + unsigned char *cp; + + hlen = ip->ihl << 2; + cp = (unsigned char *) ip + 20; /* point to options */ + + printf("Vr HL TOS Len ID Flg off TTL Pro cks Src Dst Data\n"); + printf(" %1x %1x %02x %04x %04x", + ip->version, ip->ihl, ip->tos, ip->tot_len, ip->id); + printf(" %1x %04x", ((ip->frag_off) & 0xe000) >> 13, + (ip->frag_off) & 0x1fff); + printf(" %02x %02x %04x", ip->ttl, ip->protocol, ip->check); + printf(" %s ", inet_ntoa(*(struct in_addr *) &ip->saddr)); + printf(" %s ", inet_ntoa(*(struct in_addr *) &ip->daddr)); + printf("\n"); + pr_options(a_ping_handle, cp, hlen); +} + +/* + * pr_addr -- + * + * Return an ascii host address optionally with a hostname. + */ +char * +pr_addr(ping_handle_t *a_ping_handle, void *sa, socklen_t salen) +{ + static char buffer[4096] = ""; + static struct sockaddr_storage last_sa = { 0, { 0 }, 0 }; + static socklen_t last_salen = 0; + char name[NI_MAXHOST] = ""; + char address[NI_MAXHOST] = ""; + + if(salen == last_salen && !memcmp(sa, &last_sa, salen)) + return buffer; + + memcpy(&last_sa, sa, (last_salen = salen)); + + a_ping_handle->ping_common.in_pr_addr = !setjmp(a_ping_handle->ping_common.pr_addr_jmp); + + getnameinfo(sa, salen, address, sizeof address, NULL, 0, getnameinfo_flags | NI_NUMERICHOST); + if(!exiting && !(a_ping_handle->ping_common.options & F_NUMERIC)) + getnameinfo(sa, salen, name, sizeof name, NULL, 0, getnameinfo_flags); + + if(*name) + snprintf(buffer, sizeof buffer, "%s (%s)", name, address); + else + snprintf(buffer, sizeof buffer, "%s", address); + + a_ping_handle->ping_common.in_pr_addr = 0; + + return (buffer); +} + +/* Set Type of Service (TOS) and other Quality of Service relating bits */ +int parsetos(char *str) +{ + const char *cp; + int tos; + char *ep; + + /* handle both hex and decimal values */ + if(str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) { + cp = str + 2; + tos = (int) strtol(cp, &ep, 16); + } else + tos = (int) strtol(str, &ep, 10); + + /* doesn't look like decimal or hex, eh? */ + if(*ep != '\0') + error(2, 0, "bad TOS value: %s", str); + + if(tos > TOS_MAX) + error(2, 0, "the decimal value of TOS bits must be in range 0-255: %d", tos); + return (tos); +} + +int parseflow(char *str) +{ + const char *cp; + unsigned long val; + char *ep; + + /* handle both hex and decimal values */ + if(str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) { + cp = str + 2; + val = (int) strtoul(cp, &ep, 16); + } else + val = (int) strtoul(str, &ep, 10); + + /* doesn't look like decimal or hex, eh? */ + if(*ep != '\0') + error(2, 0, "bad value for flowinfo: %s", str); + + if(val & ~IPV6_FLOWINFO_FLOWLABEL) + error(2, 0, "flow value is greater than 20 bits: %s", str); + return (val); +} + +void ping4_install_filter(ping_handle_t *a_ping_handle, socket_st *sock) +{ + static int once; + static struct sock_filter insns[] = { + BPF_STMT(BPF_LDX|BPF_B|BPF_MSH, 0), /* Skip IP header. F..g BSD... Look into ping6. */ + BPF_STMT(BPF_LD|BPF_H|BPF_IND, 4), /* Load icmp echo ident */ + BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 0xAAAA, 0, 1), /* Ours? */ + BPF_STMT(BPF_RET|BPF_K, ~0U), /* Yes, it passes. */ + BPF_STMT(BPF_LD|BPF_B|BPF_IND, 0), /* Load icmp type */ + BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ICMP_ECHOREPLY, 1, 0), /* Echo? */ + BPF_STMT(BPF_RET|BPF_K, 0xFFFFFFF), /* No. It passes. */ + BPF_STMT(BPF_RET|BPF_K, 0) /* Echo with wrong ident. Reject. */ + }; + static struct sock_fprog filter = { + sizeof insns / sizeof(insns[0]), + insns + }; + + if(once) + return; + once = 1; + + /* Patch bpflet for current identifier. */ + insns[2] = (struct sock_filter )BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(a_ping_handle->ping_common.ident), 0, 1); + + if(setsockopt(sock->fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter))) + error(0, errno, "WARNING: failed to install socket filter"); +} diff --git a/modules/net/iputils/ping.h b/modules/net/iputils/ping.h new file mode 100644 index 0000000000..651455289f --- /dev/null +++ b/modules/net/iputils/ping.h @@ -0,0 +1,436 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <time.h> +#include <signal.h> +#include <poll.h> + +#include <sys/param.h> +#include <sys/socket.h> + +#define __USE_GNU + +#include <netinet/in.h> +#include <netinet/ip.h> +#include <netinet/ip6.h> +#include <netinet/ip_icmp.h> +#include <netinet/icmp6.h> + +#include <linux/filter.h> +#include <linux/types.h> +#include <linux/sockios.h> + +#include <sys/file.h> +#include <sys/time.h> +#include <sys/ioctl.h> +#include <net/if.h> +#include <sys/uio.h> +#include <ctype.h> +#include <errno.h> +#include <string.h> +#include <netdb.h> +#include <setjmp.h> + +#include <asm/byteorder.h> +#include <sched.h> +#include <math.h> + +#include <resolv.h> + +#include "iputils.h" + +#ifdef HAVE_ERROR_H +#include <error.h> +#else +#include <stdarg.h> +#endif + +#ifdef HAVE_LIBCAP +#include <sys/prctl.h> +#include <sys/capability.h> +#endif + +#ifdef USE_IDN +#include <locale.h> +#include <idn2.h> + +#ifndef AI_IDN +#define AI_IDN 0x0040 +#endif +#ifndef AI_CANONIDN +#define AI_CANONIDN 0x0080 +#endif +#ifndef NI_IDN +#define NI_IDN 32 +#endif + +#define getaddrinfo_flags (AI_CANONNAME | AI_IDN | AI_CANONIDN) +#define getnameinfo_flags NI_IDN +#else +#define getaddrinfo_flags (AI_CANONNAME) +#define getnameinfo_flags 0 +#endif + +#include <ifaddrs.h> +#include <netinet/in.h> +#include <linux/ipv6.h> +#include <arpa/inet.h> +#include <linux/types.h> +#include <linux/errqueue.h> +#include <linux/in6.h> + +#ifndef SCOPE_DELIMITER +#define SCOPE_DELIMITER '%' +#endif + +#define DEFDATALEN (64 - 8) /* default data length */ + +#define MAXWAIT 10 /* max seconds to wait for response */ +#define MININTERVAL 10 /* Minimal interpacket gap */ +#define MINUSERINTERVAL 200 /* Minimal allowed interval for non-root */ + +#define SCHINT(a) (((a) <= MININTERVAL) ? MININTERVAL : (a)) + +/* various options */ +//extern int options; +#define F_FLOOD 0x001 +#define F_INTERVAL 0x002 +#define F_NUMERIC 0x004 +#define F_PINGFILLED 0x008 +#define F_QUIET 0x010 +#define F_RROUTE 0x020 +#define F_SO_DEBUG 0x040 +#define F_SO_DONTROUTE 0x080 +#define F_VERBOSE 0x100 +#define F_TIMESTAMP 0x200 +#define F_SOURCEROUTE 0x400 +#define F_FLOOD_POLL 0x800 +#define F_LATENCY 0x1000 +#define F_AUDIBLE 0x2000 +#define F_ADAPTIVE 0x4000 +#define F_STRICTSOURCE 0x8000 +#define F_NOLOOP 0x10000 +#define F_TTL 0x20000 +#define F_MARK 0x40000 +#define F_PTIMEOFDAY 0x80000 +#define F_OUTSTANDING 0x100000 +#define F_FLOWINFO 0x200000 +#define F_TCLASS 0x400000 + +/* + * MAX_DUP_CHK is the number of bits in received table, i.e. the maximum + * number of received sequence numbers we can keep track of. + */ + + +#if defined(__WORDSIZE) && __WORDSIZE == 64 +# define USE_BITMAP64 +#endif + + + +#if ((MAX_DUP_CHK >> (BITMAP_SHIFT + 3)) << (BITMAP_SHIFT + 3)) != MAX_DUP_CHK +# error Please MAX_DUP_CHK and/or BITMAP_SHIFT +#endif + + + +//extern struct rcvd_table rcvd_tbl; + +//#define A(a_ping_handle, bit) (a_ping_handle->ping_common.rcvd_tbl.bitmap[(bit) >> BITMAP_SHIFT]) /* identify word in array */ +#define B(bit) (((bitmap_t)1) << ((bit) & ((1 << BITMAP_SHIFT) - 1))) /* identify bit in word */ + +static inline void rcvd_set(ping_handle_t *a_ping_handle, uint16_t seq) +{ + unsigned bit = seq % MAX_DUP_CHK; + a_ping_handle->ping_common.rcvd_tbl.bitmap[(bit) >> BITMAP_SHIFT] |= B(bit); + //A(a_ping_handle, bit) |= B(bit); +} + +static inline void rcvd_clear(ping_handle_t *a_ping_handle, uint16_t seq) +{ + unsigned bit = seq % MAX_DUP_CHK; + a_ping_handle->ping_common.rcvd_tbl.bitmap[(bit) >> BITMAP_SHIFT] &= ~B(bit); + //A(a_ping_handle, bit) &= ~B(bit); +} + +static inline bitmap_t rcvd_test(ping_handle_t *a_ping_handle, uint16_t seq) +{ + unsigned bit = seq % MAX_DUP_CHK; + return (a_ping_handle->ping_common.rcvd_tbl.bitmap[(bit) >> BITMAP_SHIFT] & B(bit)); + //return A(a_ping_handle, bit) & B(bit); +} + +#ifndef HAVE_ERROR_H +static void error(int status, int errnum, const char *format, ...) +{ + va_list ap; + + fprintf(stderr, "ping: "); + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + if (errnum) + fprintf(stderr, ": %s\n", strerror(errnum)); + else + fprintf(stderr, "\n"); + if (status) + exit(status); +} +#endif + +/* +extern int datalen; +extern char *hostname; +extern int uid; +extern int ident; // process id to identify our packets + +extern int sndbuf; +extern int ttl; + +extern long npackets; // max packets to transmit +extern long nreceived; // # of packets we got back +extern long nrepeats; // number of duplicates +extern long ntransmitted; // sequence # for outbound packets = #sent +extern long nchecksum; // replies with bad checksum +extern long nerrors; // icmp errors +extern int interval; // interval between packets (msec) +extern int preload; +extern int deadline; // time to die +extern int lingertime; +extern struct timeval start_time, cur_time; +extern int confirm; +extern int confirm_flag; +extern char *device; +extern int pmtudisc; + +extern volatile int in_pr_addr; // pr_addr() is executing +extern jmp_buf pr_addr_jmp; +*/ + +extern volatile int exiting; +extern volatile int status_snapshot; + +#ifndef MSG_CONFIRM +#define MSG_CONFIRM 0 +#endif + + +/* timing */ +/* +extern int timing; // flag to do timing +extern long tmin; // minimum round trip time +extern long tmax; // maximum round trip time +extern long long tsum; // sum of all times, for doing average +extern long long tsum2; +extern int rtt; +extern uint16_t acked; +extern int pipesize; +*/ + +/* + * Write to stdout + */ +static inline void write_stdout(const char *str, size_t len) +{ + size_t o = 0; + ssize_t cc; + do { + cc = write(STDOUT_FILENO, str + o, len - o); + o += cc; + } while (len > o || cc < 0); +} + +/* + * tvsub -- + * Subtract 2 timeval structs: out = out - in. Out is assumed to + * be >= in. + */ +static inline void tvsub(struct timeval *out, struct timeval *in) +{ + if ((out->tv_usec -= in->tv_usec) < 0) { + --out->tv_sec; + out->tv_usec += 1000000; + } + out->tv_sec -= in->tv_sec; +} + +static inline void set_signal(int signo, void (*handler)(int)) +{ + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + + sa.sa_handler = (void (*)(int))handler; + sigaction(signo, &sa, NULL); +} + +extern int __schedule_exit(ping_handle_t *a_ping_handle, int next); + +static inline int schedule_exit(ping_handle_t *a_ping_handle, int next) +{ + if (a_ping_handle->ping_common.npackets && a_ping_handle->ping_common.ntransmitted >= a_ping_handle->ping_common.npackets + && !a_ping_handle->ping_common.deadline) + next = __schedule_exit(a_ping_handle, next); + return next; +} + +static inline int in_flight(ping_handle_t *a_ping_handle) +{ + uint16_t diff = (uint16_t)a_ping_handle->ping_common.ntransmitted - a_ping_handle->ping_common.acked; + return (diff<=0x7FFF) ? diff : a_ping_handle->ping_common.ntransmitted-a_ping_handle->ping_common.nreceived-a_ping_handle->ping_common.nerrors; +} + +static inline void acknowledge(ping_handle_t *a_ping_handle, uint16_t seq) +{ + uint16_t diff = (uint16_t)a_ping_handle->ping_common.ntransmitted - seq; + if (diff <= 0x7FFF) { + if ((int)diff+1 > a_ping_handle->ping_common.pipesize) + a_ping_handle->ping_common.pipesize = (int)diff+1; + if ((int16_t)(seq - a_ping_handle->ping_common.acked) > 0 || + (uint16_t)a_ping_handle->ping_common.ntransmitted - a_ping_handle->ping_common.acked > 0x7FFF) + a_ping_handle->ping_common.acked = seq; + } +} + +static inline void advance_ntransmitted(ping_handle_t *a_ping_handle) +{ + a_ping_handle->ping_common.ntransmitted++; + /* Invalidate acked, if 16 bit seq overflows. */ + if ((uint16_t)a_ping_handle->ping_common.ntransmitted - a_ping_handle->ping_common.acked > 0x7FFF) + a_ping_handle->ping_common.acked = (uint16_t)a_ping_handle->ping_common.ntransmitted + 1; +} + +extern void usage(void) __attribute__((noreturn)); +extern void limit_capabilities(ping_handle_t *a_ping_handle); +static int enable_capability_raw(ping_handle_t *a_ping_handle); +static int disable_capability_raw(ping_handle_t *a_ping_handle); +static int enable_capability_admin(ping_handle_t *a_ping_handle); +static int disable_capability_admin(ping_handle_t *a_ping_handle); +#ifdef HAVE_LIBCAP +extern int modify_capability(cap_value_t, cap_flag_value_t); +static inline int enable_capability_raw(void) { return modify_capability(CAP_NET_RAW, CAP_SET); } +static inline int disable_capability_raw(void) { return modify_capability(CAP_NET_RAW, CAP_CLEAR); } +static inline int enable_capability_admin(void) { return modify_capability(CAP_NET_ADMIN, CAP_SET); } +static inline int disable_capability_admin(void) { return modify_capability(CAP_NET_ADMIN, CAP_CLEAR); } +#else +extern int modify_capability(ping_handle_t *a_ping_handle, int); +static inline int enable_capability_raw(ping_handle_t *a_ping_handle) { return modify_capability(a_ping_handle, 1); } +static inline int disable_capability_raw(ping_handle_t *a_ping_handle) { return modify_capability(a_ping_handle, 0); } +static inline int enable_capability_admin(ping_handle_t *a_ping_handle) { return modify_capability(a_ping_handle, 1); } +static inline int disable_capability_admin(ping_handle_t *a_ping_handle) { return modify_capability(a_ping_handle, 0); } +#endif +extern void drop_capabilities(void); + +typedef struct socket_st { + int fd; + int socktype; +} socket_st; + +char *pr_addr(ping_handle_t *a_ping_handle, void *sa, socklen_t salen); + +int is_ours(ping_handle_t *a_ping_handle, socket_st *sock, uint16_t id); + +int ping4_run(ping_handle_t *a_ping_handle, int argc, char **argv, struct addrinfo *ai, socket_st *sock); +int ping4_send_probe(ping_handle_t *a_ping_handle, socket_st *, void *packet, unsigned packet_size); +int ping4_receive_error_msg(ping_handle_t *a_ping_handle, socket_st *sock); +int ping4_parse_reply(ping_handle_t *a_ping_handle, socket_st *, struct msghdr *msg, int len, void *addr, struct timeval *); +void ping4_install_filter( ping_handle_t *a_ping_handle, socket_st *); + +typedef struct ping_func_set_st { + int (*send_probe)(ping_handle_t *a_ping_handle, socket_st *, void *packet, unsigned packet_size); + int (*receive_error_msg)(ping_handle_t *a_ping_handle, socket_st *sock); + int (*parse_reply)(ping_handle_t *a_ping_handle, socket_st *, struct msghdr *msg, int len, void *addr, struct timeval *); + void (*install_filter)(ping_handle_t *a_ping_handle, socket_st *); +} ping_func_set_st; + +extern ping_func_set_st ping4_func_set; + +extern int pinger(ping_handle_t *a_ping_handle, ping_func_set_st *fset, socket_st *sock); +extern void sock_setbufs(ping_handle_t *a_ping_handle, socket_st*, int alloc); +extern void setup(ping_handle_t *a_ping_handle, socket_st *); +extern int contains_pattern_in_payload(ping_handle_t *a_ping_handle, uint8_t *ptr); +extern void main_loop(ping_handle_t *a_ping_handle, ping_func_set_st *fset, socket_st*, uint8_t *buf, int buflen);// __attribute__((noreturn)); +extern void finish(ping_handle_t *a_ping_handle);// __attribute__((noreturn)); +extern void status(ping_handle_t *a_ping_handle); +extern void common_options(int ch); +extern int gather_statistics(ping_handle_t *a_ping_handle, uint8_t *ptr, int icmplen, + int cc, uint16_t seq, int hops, + int csfailed, struct timeval *tv, char *from, + void (*pr_reply)(uint8_t *ptr, int cc)); +extern void print_timestamp(ping_handle_t *a_ping_handle); +void fill(ping_handle_t *a_ping_handle, char *patp, unsigned char *packet, unsigned packet_size); + +//extern int mark; +//extern unsigned char outpack[MAXPACKET]; + +/* IPv6 */ + +int ping6_run(ping_handle_t *a_ping_handle, int argc, char **argv, struct addrinfo *ai, socket_st *sock); +void ping6_usage(unsigned from_ping); + +int ping6_send_probe(ping_handle_t *a_ping_handle, socket_st *sockets, void *packet, unsigned packet_size); +int ping6_receive_error_msg(ping_handle_t *a_ping_handle, socket_st *sock); +int ping6_parse_reply(ping_handle_t *a_ping_handle, socket_st *, struct msghdr *msg, int len, void *addr, struct timeval *); +void ping6_install_filter(ping_handle_t *a_ping_handle, socket_st *sockets); + +extern ping_func_set_st ping6_func_set; + +int niquery_option_handler(const char *opt_arg); + +extern uint32_t tclass; +extern uint32_t flowlabel; +extern struct sockaddr_in6 source6; +extern struct sockaddr_in6 whereto6; +extern struct sockaddr_in6 firsthop6; + +/* IPv6 node information query */ + +#define NI_NONCE_SIZE 8 + +struct ni_hdr { + struct icmp6_hdr ni_u; + uint8_t ni_nonce[NI_NONCE_SIZE]; +}; + +#define ni_type ni_u.icmp6_type +#define ni_code ni_u.icmp6_code +#define ni_cksum ni_u.icmp6_cksum +#define ni_qtype ni_u.icmp6_data16[0] +#define ni_flags ni_u.icmp6_data16[1] + +/* Types */ +#ifndef ICMPV6_NI_QUERY +# define ICMPV6_NI_QUERY 139 +# define ICMPV6_NI_REPLY 140 +#endif + +/* Query Codes */ +#define NI_SUBJ_IPV6 0 +#define NI_SUBJ_NAME 1 +#define NI_SUBJ_IPV4 2 + +/* Reply Codes */ +#define NI_SUCCESS 0 +#define NI_REFUSED 1 +#define NI_UNKNOWN 2 + +/* Qtypes */ +#define NI_QTYPE_NOOP 0 +#define NI_QTYPE_NAME 2 +#define NI_QTYPE_IPV6ADDR 3 +#define NI_QTYPE_IPV4ADDR 4 + +/* Flags */ +#define NI_IPV6ADDR_F_TRUNCATE __constant_cpu_to_be16(0x0001) +#define NI_IPV6ADDR_F_ALL __constant_cpu_to_be16(0x0002) +#define NI_IPV6ADDR_F_COMPAT __constant_cpu_to_be16(0x0004) +#define NI_IPV6ADDR_F_LINKLOCAL __constant_cpu_to_be16(0x0008) +#define NI_IPV6ADDR_F_SITELOCAL __constant_cpu_to_be16(0x0010) +#define NI_IPV6ADDR_F_GLOBAL __constant_cpu_to_be16(0x0020) + +#define NI_IPV4ADDR_F_TRUNCATE NI_IPV6ADDR_F_TRUNCATE +#define NI_IPV4ADDR_F_ALL NI_IPV6ADDR_F_ALL + + diff --git a/modules/net/iputils/ping6_common.c b/modules/net/iputils/ping6_common.c new file mode 100644 index 0000000000..3bb143fadd --- /dev/null +++ b/modules/net/iputils/ping6_common.c @@ -0,0 +1,1398 @@ +/* + * + * Modified for AF_INET6 by Pedro Roque + * + * <roque@di.fc.ul.pt> + * + * Original copyright notice included bellow + */ + +/* + * Copyright (c) 1989 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Mike Muuss. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/* + * P I N G . C + * + * Using the InterNet Control Message Protocol (ICMP) "ECHO" facility, + * measure round-trip-delays and packet loss across network paths. + * + * Author - + * Mike Muuss + * U. S. Army Ballistic Research Laboratory + * December, 1983 + * + * Status - + * Public Domain. Distribution Unlimited. + * Bugs - + * More statistics could always be gathered. + * If kernel does not support non-raw ICMP sockets or + * if -N option is used, this program has to run SUID to ROOT or + * with net_cap_raw enabled. + */ + +#include "ping.h" + +/* IPv6 packet information. */ +//struct in6_pktinfo +// { +// struct in6_addr ipi6_addr; /* src/dst IPv6 address */ +// unsigned int ipi6_ifindex; /* send/recv interface index */ +// }; + +ping_func_set_st ping6_func_set = { + .send_probe = ping6_send_probe, + .receive_error_msg = ping6_receive_error_msg, + .parse_reply = ping6_parse_reply, + .install_filter = ping6_install_filter +}; + +#ifndef SCOPE_DELIMITER +# define SCOPE_DELIMITER '%' +#endif + +uint32_t flowlabel; +uint32_t tclass; + +static struct sockaddr_in6 whereto; +static struct sockaddr_in6 firsthop; + +static unsigned char cmsgbuf[4096]; +static size_t cmsglen = 0; + +static int pr_icmph(uint8_t type, uint8_t code, uint32_t info); + +struct sockaddr_in6 source6 = { .sin6_family = AF_INET6 }; +//extern char *device; + +#if defined(USE_GCRYPT) || defined(USE_OPENSSL) || defined(USE_NETTLE) +#include "iputils_md5dig.h" +#define USE_CRYPTO +#endif + +/* Node Information query */ +int ni_query = -1; +int ni_flag = 0; +void *ni_subject = NULL; +int ni_subject_len = 0; +int ni_subject_type = -1; +char *ni_group; + +static inline int ntohsp(uint16_t *p) +{ + uint16_t v; + memcpy(&v, p, sizeof(v)); + return ntohs(v); +} + +unsigned int if_name2index(const char *ifname) +{ + unsigned int i = if_nametoindex(ifname); + if(!i) + error(2, 0, "unknown iface: %s", ifname); + return i; +} + +struct niquery_option { + char *name; + int namelen; + int has_arg; + int data; + int (*handler)(int index, const char *arg); +}; + +#define NIQUERY_OPTION(_name, _has_arg, _data, _handler) \ + { \ + .name = _name, \ + .namelen = sizeof(_name) - 1, \ + .has_arg = _has_arg, \ + .data = _data, \ + .handler = _handler \ + } + +static int niquery_option_name_handler(int index __attribute__((__unused__)), + const char *arg __attribute__((__unused__))); +static int niquery_option_ipv6_handler(int index __attribute__((__unused__)), + const char *arg __attribute__((__unused__))); +static int niquery_option_ipv6_flag_handler(int index, const char *arg); +static int niquery_option_ipv4_handler(int index, const char *arg); +static int niquery_option_ipv4_flag_handler(int index, const char *arg); +static int niquery_option_subject_addr_handler(int index, const char *arg); +static int niquery_option_subject_name_handler(int index, const char *arg); +static int niquery_option_help_handler(int index, const char *arg); + +struct niquery_option niquery_options[] = { +NIQUERY_OPTION("name", 0, 0, niquery_option_name_handler), +NIQUERY_OPTION("fqdn", 0, 0, niquery_option_name_handler), +NIQUERY_OPTION("ipv6", 0, 0, niquery_option_ipv6_handler), +NIQUERY_OPTION("ipv6-all", 0, NI_IPV6ADDR_F_ALL, niquery_option_ipv6_flag_handler), +NIQUERY_OPTION("ipv6-compatible", 0, NI_IPV6ADDR_F_COMPAT, niquery_option_ipv6_flag_handler), +NIQUERY_OPTION("ipv6-linklocal", 0, NI_IPV6ADDR_F_LINKLOCAL, niquery_option_ipv6_flag_handler), +NIQUERY_OPTION("ipv6-sitelocal", 0, NI_IPV6ADDR_F_SITELOCAL, niquery_option_ipv6_flag_handler), +NIQUERY_OPTION("ipv6-global", 0, NI_IPV6ADDR_F_GLOBAL, niquery_option_ipv6_flag_handler), +NIQUERY_OPTION("ipv4", 0, 0, niquery_option_ipv4_handler), +NIQUERY_OPTION("ipv4-all", 0, NI_IPV4ADDR_F_ALL, niquery_option_ipv4_flag_handler), +NIQUERY_OPTION("subject-ipv6", 1, NI_SUBJ_IPV6, niquery_option_subject_addr_handler), +NIQUERY_OPTION("subject-ipv4", 1, NI_SUBJ_IPV4, niquery_option_subject_addr_handler), +NIQUERY_OPTION("subject-name", 1, 0, niquery_option_subject_name_handler), +NIQUERY_OPTION("subject-fqdn", 1, -1, niquery_option_subject_name_handler), +NIQUERY_OPTION("help", 0, 0, niquery_option_help_handler), + { NULL, 0, 0, 0, NULL } +}; + +static inline int niquery_is_enabled(void) +{ + return ni_query >= 0; +} + +#if PING6_NONCE_MEMORY +uint8_t *ni_nonce_ptr; +#else +struct { + struct timeval tv; + pid_t pid; +} ni_nonce_secret; +#endif + +static void niquery_init_nonce(void) +{ +#if PING6_NONCE_MEMORY + struct timeval tv; + unsigned long seed; + + seed = (unsigned long)getpid(); + if (!gettimeofday(&tv, NULL)) + seed ^= tv.tv_usec; + srand(seed); + + ni_nonce_ptr = calloc(NI_NONCE_SIZE, MAX_DUP_CHK); + if (!ni_nonce_ptr) + error(2, errno, "calloc"); + + ni_nonce_ptr[0] = ~0; +#else + gettimeofday(&ni_nonce_secret.tv, NULL); + ni_nonce_secret.pid = getpid(); +#endif +} + +#if !PING6_NONCE_MEMORY +static int niquery_nonce(uint8_t *nonce, int fill) +{ +# ifdef USE_CRYPTO + static uint8_t digest[MD5_DIGEST_LENGTH]; + static int seq = -1; + + if (fill || seq != *(uint16_t *)nonce || seq < 0) { + MD5_CTX ctxt; + + MD5_Init(&ctxt); + MD5_Update(&ctxt, &ni_nonce_secret, sizeof(ni_nonce_secret)); + MD5_Update(&ctxt, nonce, sizeof(uint16_t)); + MD5_Final(digest, &ctxt); + + seq = *(uint16_t *)nonce; + } + + if (fill) { + memcpy(nonce + sizeof(uint16_t), digest, NI_NONCE_SIZE - sizeof(uint16_t)); + return 0; + } else { + if (memcmp(nonce + sizeof(uint16_t), digest, NI_NONCE_SIZE - sizeof(uint16_t))) + return -1; + return ntohsp((uint16_t *)nonce); + } +# else + error(3, ENOSYS, "niquery_nonce() crypto disabled"); +# endif + if(nonce || fill) + return -1; + return -1; +} +#endif + +static inline void niquery_fill_nonce(uint16_t seq, uint8_t *nonce) +{ + uint16_t v = htons(seq); +#if PING6_NONCE_MEMORY + int i; + + memcpy(&ni_nonce_ptr[NI_NONCE_SIZE * (seq % MAX_DUP_CHK)], &v, sizeof(v)); + + for (i = sizeof(v); i < NI_NONCE_SIZE; i++) + ni_nonce_ptr[NI_NONCE_SIZE * (seq % MAX_DUP_CHK) + i] = 0x100 * (rand() / (RAND_MAX + 1.0)); + + memcpy(nonce, &ni_nonce_ptr[NI_NONCE_SIZE * (seq % MAX_DUP_CHK)], NI_NONCE_SIZE); +#else + memcpy(nonce, &v, sizeof(v)); + niquery_nonce(nonce, 1); +#endif +} + +static inline int niquery_check_nonce(uint8_t *nonce) +{ +#if PING6_NONCE_MEMORY + uint16_t seq = ntohsp((uint16_t *)nonce); + if (memcmp(nonce, &ni_nonce_ptr[NI_NONCE_SIZE * (seq % MAX_DUP_CHK)], NI_NONCE_SIZE)) + return -1; + return seq; +#else + return niquery_nonce(nonce, 0); +#endif +} + +static int niquery_set_qtype(int type) +{ + if(niquery_is_enabled() && ni_query != type) { + printf("Qtype conflict\n"); + return -1; + } + ni_query = type; + return 0; +} + +static int niquery_option_name_handler(int index __attribute__((__unused__)), + const char *arg __attribute__((__unused__))) +{ + if(niquery_set_qtype(NI_QTYPE_NAME) < 0) + return -1; + return 0; +} + +static int niquery_option_ipv6_handler(int index __attribute__((__unused__)), + const char *arg __attribute__((__unused__))) +{ + if(niquery_set_qtype(NI_QTYPE_IPV6ADDR) < 0) + return -1; + return 0; +} + +static int niquery_option_ipv6_flag_handler(int index, const char *arg __attribute__((__unused__))) +{ + if(niquery_set_qtype(NI_QTYPE_IPV6ADDR) < 0) + return -1; + ni_flag |= niquery_options[index].data; + return 0; +} + +static int niquery_option_ipv4_handler(int index __attribute__((__unused__)), + const char *arg __attribute__((__unused__))) +{ + if(niquery_set_qtype(NI_QTYPE_IPV4ADDR) < 0) + return -1; + return 0; +} + +static int niquery_option_ipv4_flag_handler(int index, const char *arg __attribute__((__unused__))) +{ + if(niquery_set_qtype(NI_QTYPE_IPV4ADDR) < 0) + return -1; + ni_flag |= niquery_options[index].data; + return 0; +} + +static inline int niquery_is_subject_valid(void) +{ + return ni_subject_type >= 0 && ni_subject; +} + +static int niquery_set_subject_type(int type) +{ + if(niquery_is_subject_valid() && ni_subject_type != type) { + printf("Subject type conflict\n"); + return -1; + } + ni_subject_type = type; + return 0; +} + +#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) +#define OFFSET_OF(type,elem) ((size_t)&((type *)0)->elem) + +static int niquery_option_subject_addr_handler(int index, const char *arg) +{ + struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM, .ai_flags = getaddrinfo_flags }; + struct addrinfo *result, *ai; + int status; + int offset; + + if(niquery_set_subject_type(niquery_options[index].data) < 0) + return -1; + + ni_subject_type = niquery_options[index].data; + + switch (niquery_options[index].data) { + case NI_SUBJ_IPV6: + ni_subject_len = sizeof(struct in6_addr); + offset = OFFSET_OF(struct sockaddr_in6, sin6_addr); + hints.ai_family = AF_INET6; + break; + case NI_SUBJ_IPV4: + ni_subject_len = sizeof(struct in_addr); + offset = OFFSET_OF(struct sockaddr_in, sin_addr); + hints.ai_family = AF_INET; + break; + default: + /* should not happen. */ + offset = -1; + } + + status = getaddrinfo(arg, 0, &hints, &result); + if(status) { + error(0, 0, "%s: %s", arg, gai_strerror(status)); + return -1; + } + + for(ai = result; ai; ai = ai->ai_next) { + void *p = malloc(ni_subject_len); + if(!p) + continue; + memcpy(p, (uint8_t *) ai->ai_addr + offset, ni_subject_len); + free(ni_subject); + ni_subject = p; + break; + } + freeaddrinfo(result); + + return 0; +} + +#ifdef USE_IDN +# if IDN2_VERSION_NUMBER >= 0x02000000 +# define IDN2_FLAGS IDN2_NONTRANSITIONAL +# else +# define IDN2_FLAGS 0 +# endif +#endif + +#ifdef USE_CRYPTO +static int niquery_option_subject_name_handler(int index, const char *name) +{ + static char nigroup_buf[INET6_ADDRSTRLEN + 1 + IFNAMSIZ]; + unsigned char *dnptrs[2], **dpp, **lastdnptr; + int n; + size_t i; + char *p; + char *canonname = NULL, *idn = NULL; + unsigned char *buf = NULL; + size_t namelen; + size_t buflen; + int dots, fqdn = niquery_options[index].data; + MD5_CTX ctxt; + uint8_t digest[MD5_DIGEST_LENGTH]; +#ifdef USE_IDN + int rc; +#endif + + if (niquery_set_subject_type(NI_SUBJ_NAME) < 0) + return -1; + +#ifdef USE_IDN + rc = idn2_lookup_ul(name, &idn, IDN2_FLAGS); + if (rc) + error(2, 0, "IDN encoding error: %s", idn2_strerror(rc)); +#else + idn = strdup(name); + if (!idn) + goto oomexit; +#endif + + p = strchr(idn, SCOPE_DELIMITER); + if (p) { + *p = '\0'; + if (strlen(p + 1) >= IFNAMSIZ) + error(1, 0, "too long scope name"); + } + + namelen = strlen(idn); + canonname = malloc(namelen + 1); + if (!canonname) + goto oomexit; + + dots = 0; + for (i = 0; i < namelen + 1; i++) { + canonname[i] = isupper(idn[i]) ? tolower(idn[i]) : idn[i]; + if (idn[i] == '.') + dots++; + } + + if (fqdn == 0) { + /* guess if hostname is FQDN */ + fqdn = dots ? 1 : -1; + } + + buflen = namelen + 3 + 1; /* dn_comp() requrires strlen() + 3, + plus non-fqdn indicator. */ + buf = malloc(buflen); + if (!buf) { + error(0, errno, "memory allocation failed"); + goto errexit; + } + + dpp = dnptrs; + lastdnptr = &dnptrs[ARRAY_SIZE(dnptrs)]; + + *dpp++ = (unsigned char *)buf; + *dpp++ = NULL; + + n = dn_comp(canonname, (unsigned char *)buf, buflen, dnptrs, lastdnptr); + if (n < 0) { + error(0, 0, "inappropriate subject name: %s", canonname); + goto errexit; + } else if ((size_t) n >= buflen) { + error(0, 0, "dn_comp() returned too long result"); + goto errexit; + } + + MD5_Init(&ctxt); + MD5_Update(&ctxt, buf, buf[0]); + MD5_Final(digest, &ctxt); + + sprintf(nigroup_buf, "ff02::2:%02x%02x:%02x%02x%s%s", + digest[0], digest[1], digest[2], digest[3], + p ? "%" : "", + p ? p + 1 : ""); + + if (fqdn < 0) + buf[n] = 0; + + free(ni_subject); + + ni_group = nigroup_buf; + ni_subject = buf; + ni_subject_len = n + (fqdn < 0); + ni_group = nigroup_buf; + + free(canonname); + free(idn); + + return 0; + oomexit: + error(0, errno, "memory allocation failed"); + errexit: + free(buf); + free(canonname); + free(idn); + exit(1); +} +#else +static int niquery_option_subject_name_handler(int index __attribute__((__unused__)), + const char *name __attribute__((__unused__))) +{ + error(3, ENOSYS, "niquery_option_subject_name_handler() crypto disabled"); + return -1; +} +#endif + +int niquery_option_help_handler(int index __attribute__((__unused__)), const char *arg __attribute__((__unused__))) +{ + fprintf(stderr, "ping -6 -N <nodeinfo opt>\n" + "Help:\n" + " help\n" + "Query:\n" + " name\n" + " ipv6\n" + " ipv6-all\n" + " ipv6-compatible\n" + " ipv6-global\n" + " ipv6-linklocal\n" + " ipv6-sitelocal\n" + " ipv4\n" + " ipv4-all\n" + "Subject:\n" + " subject-ipv6=addr\n" + " subject-ipv4=addr\n" + " subject-name=name\n" + " subject-fqdn=name\n" + ); + exit(2); +} + +int niquery_option_handler(const char *opt_arg) +{ + struct niquery_option *p; + int i; + int ret = -1; + for(i = 0, p = niquery_options; p->name; i++, p++) { + if(strncmp(p->name, opt_arg, p->namelen)) + continue; + if(!p->has_arg) { + if(opt_arg[p->namelen] == '\0') { + ret = p->handler(i, NULL); + if(ret >= 0) + break; + } + } else { + if(opt_arg[p->namelen] == '=') { + ret = p->handler(i, &opt_arg[p->namelen] + 1); + if(ret >= 0) + break; + } + } + } + if(!p->name) + ret = niquery_option_help_handler(0, NULL); + return ret; +} + +int ping6_run(ping_handle_t *a_ping_handle, int argc, char **argv, struct addrinfo *ai, struct socket_st *sock) +{ + static const struct addrinfo hints = { .ai_family = AF_INET6, .ai_flags = getaddrinfo_flags }; + struct addrinfo *result = NULL; + int status; + int hold, packlen; + unsigned char *packet; + char *target; + struct icmp6_filter filter; + int err; + static uint32_t scope_id = 0; + + if(niquery_is_enabled()) { + niquery_init_nonce(); + + if(!niquery_is_subject_valid()) { + ni_subject = &whereto.sin6_addr; + ni_subject_len = sizeof(whereto.sin6_addr); + ni_subject_type = NI_SUBJ_IPV6; + } + } + + if(argc > 1) { + usage(); + } else if(argc == 1) { + target = *argv; + } else { + if(ni_query < 0 && ni_subject_type != NI_SUBJ_NAME) + usage(); + target = ni_group; + } + + if(!ai) { + status = getaddrinfo(target, NULL, &hints, &result); + if(status) + error(2, 0, "%s: %s", target, gai_strerror(status)); + ai = result; + } + + memcpy(&whereto, ai->ai_addr, sizeof(whereto)); + whereto.sin6_port = htons(IPPROTO_ICMPV6); + + if(result) + freeaddrinfo(result); + + if(memchr(target, ':', strlen(target))) + a_ping_handle->ping_common.options |= F_NUMERIC; + + if(IN6_IS_ADDR_UNSPECIFIED(&firsthop.sin6_addr)) { + memcpy(&firsthop.sin6_addr, &whereto.sin6_addr, 16); + firsthop.sin6_scope_id = whereto.sin6_scope_id; + /* Verify scope_id is the same as intermediate nodes */ + if(firsthop.sin6_scope_id && scope_id && firsthop.sin6_scope_id != scope_id) + error(2, 0, "scope discrepancy among the nodes"); + else if(!scope_id) + scope_id = firsthop.sin6_scope_id; + } + + a_ping_handle->ping_common.hostname = target; + + if(IN6_IS_ADDR_UNSPECIFIED(&source6.sin6_addr)) { + socklen_t alen; + int probe_fd = socket(AF_INET6, SOCK_DGRAM, 0); + + if(probe_fd < 0) + error(2, errno, "socket"); + if(a_ping_handle->device) { + unsigned int iface = if_name2index(a_ping_handle->device); +#ifdef IPV6_RECVPKTINFO + struct in6_pktinfo ipi; + + memset(&ipi, 0, sizeof(ipi)); + ipi.ipi6_ifindex = iface; +#endif + + if(IN6_IS_ADDR_LINKLOCAL(&firsthop.sin6_addr) || + IN6_IS_ADDR_MC_LINKLOCAL(&firsthop.sin6_addr)) + firsthop.sin6_scope_id = iface; + enable_capability_raw(a_ping_handle); +#ifdef IPV6_RECVPKTINFO + if( + setsockopt(probe_fd, IPPROTO_IPV6, IPV6_PKTINFO, &ipi, sizeof ipi) == -1 || + setsockopt(sock->fd, IPPROTO_IPV6, IPV6_PKTINFO, &ipi, sizeof ipi) == -1) { + perror("setsockopt(IPV6_PKTINFO)"); + exit(2); + } +#endif + if( + setsockopt(probe_fd, SOL_SOCKET, SO_BINDTODEVICE, a_ping_handle->device, strlen(a_ping_handle->device) + 1) == -1 || + setsockopt(sock->fd, SOL_SOCKET, SO_BINDTODEVICE, a_ping_handle->device, strlen(a_ping_handle->device) + 1) == -1) { + error(2, errno, "setsockopt(SO_BINDTODEVICE) %s", a_ping_handle->device); + } + disable_capability_raw(a_ping_handle); + } + + if(!IN6_IS_ADDR_LINKLOCAL(&firsthop.sin6_addr) && + !IN6_IS_ADDR_MC_LINKLOCAL(&firsthop.sin6_addr)) + firsthop.sin6_family = AF_INET6; + + firsthop.sin6_port = htons(1025); + if(connect(probe_fd, (struct sockaddr*) &firsthop, sizeof(firsthop)) == -1) + error(2, errno, "connect"); + alen = sizeof source6; + if(getsockname(probe_fd, (struct sockaddr *) &source6, &alen) == -1) + error(2, errno, "getsockname"); + source6.sin6_port = 0; + close(probe_fd); + + if(a_ping_handle->device) { + struct ifaddrs *ifa0, *ifa; + + if(getifaddrs(&ifa0)) + error(2, errno, "getifaddrs"); + + for(ifa = ifa0; ifa; ifa = ifa->ifa_next) { + if(!ifa->ifa_name || !ifa->ifa_addr || + ifa->ifa_addr->sa_family != AF_INET6) + continue; + if(!strcmp(ifa->ifa_name, a_ping_handle->device) && + IN6_ARE_ADDR_EQUAL(&((struct sockaddr_in6 * )ifa->ifa_addr)->sin6_addr, + &source6.sin6_addr)) + break; + } + if(!ifa) + error(0, 0, "Warning: source address might be selected on device other than: %s", a_ping_handle->device); + + freeifaddrs(ifa0); + } + } + else if(a_ping_handle->device && (IN6_IS_ADDR_LINKLOCAL(&source6.sin6_addr) || + IN6_IS_ADDR_MC_LINKLOCAL(&source6.sin6_addr))) + source6.sin6_scope_id = if_name2index(a_ping_handle->device); + + if(a_ping_handle->device) { + struct cmsghdr *cmsg; + struct in6_pktinfo *ipi; + + cmsg = (struct cmsghdr*) (cmsgbuf + cmsglen); + cmsglen += CMSG_SPACE(sizeof(*ipi)); + cmsg->cmsg_len = CMSG_LEN(sizeof(*ipi)); + cmsg->cmsg_level = IPPROTO_IPV6; + cmsg->cmsg_type = IPV6_PKTINFO; + + ipi = (struct in6_pktinfo*) CMSG_DATA(cmsg); + memset(ipi, 0, sizeof(*ipi)); + ipi->ipi6_ifindex = if_name2index(a_ping_handle->device); + } + + if((whereto.sin6_addr.s6_addr16[0] & htons(0xff00)) == htons(0xff00)) { + if(a_ping_handle->ping_common.uid) { + if(a_ping_handle->ping_common.interval < 1000) + error(2, 0, "multicast ping with too short interval: %d", a_ping_handle->ping_common.interval); + if(a_ping_handle->pmtudisc >= 0 && a_ping_handle->pmtudisc != IPV6_PMTUDISC_DO) + error(2, 0, "multicast ping does not fragment"); + } + if(a_ping_handle->pmtudisc < 0) + a_ping_handle->pmtudisc = IPV6_PMTUDISC_DO; + } + + if(a_ping_handle->pmtudisc >= 0) { + if(setsockopt(sock->fd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, &a_ping_handle->pmtudisc, sizeof (a_ping_handle->pmtudisc)) == -1) + error(2, errno, "IPV6_MTU_DISCOVER"); + } + + if((a_ping_handle->ping_common.options & F_STRICTSOURCE) && + bind(sock->fd, (struct sockaddr *) &source6, sizeof source6) == -1) + error(2, errno, "bind icmp socket"); + + if((ssize_t) a_ping_handle->ping_common.datalen >= (ssize_t) sizeof(struct timeval) && (ni_query < 0)) { + /* can we time transfer */ + a_ping_handle->ping_common.timing = 1; + } + packlen = a_ping_handle->ping_common.datalen + 8 + 4096 + 40 + 8; /* 4096 for rthdr */ + if(!(packet = (unsigned char *) malloc((unsigned int) packlen))) + error(2, errno, "memory allocation failed"); + + hold = 1; + + /* Estimate memory eaten by single packet. It is rough estimate. + * Actually, for small datalen's it depends on kernel side a lot. */ + hold = a_ping_handle->ping_common.datalen + 8; + hold += ((hold + 511) / 512) * (40 + 16 + 64 + 160); + sock_setbufs(a_ping_handle,sock, hold); + +#ifdef __linux__ + if(sock->socktype == SOCK_RAW) { + int csum_offset = 2; + int sz_opt = sizeof(int); + + err = setsockopt(sock->fd, SOL_RAW, IPV6_CHECKSUM, &csum_offset, sz_opt); + if(err < 0) { + /* checksum should be enabled by default and setting this + * option might fail anyway. + */ + error(0, errno, "setsockopt(RAW_CHECKSUM) failed - try to continue"); + } +#else + { +#endif + + /* + * select icmp echo reply as icmp type to receive + */ + + ICMP6_FILTER_SETBLOCKALL(&filter); + + ICMP6_FILTER_SETPASS(ICMP6_DST_UNREACH, &filter); + ICMP6_FILTER_SETPASS(ICMP6_PACKET_TOO_BIG, &filter); + ICMP6_FILTER_SETPASS(ICMP6_TIME_EXCEEDED, &filter); + ICMP6_FILTER_SETPASS(ICMP6_PARAM_PROB, &filter); + + if(niquery_is_enabled()) + ICMP6_FILTER_SETPASS(ICMPV6_NI_REPLY, &filter); + else + ICMP6_FILTER_SETPASS(ICMP6_ECHO_REPLY, &filter); + + err = setsockopt(sock->fd, IPPROTO_ICMPV6, ICMP6_FILTER, &filter, sizeof filter); + + if(err < 0) + error(2, errno, "setsockopt(ICMP6_FILTER)"); + } + + if(a_ping_handle->ping_common.options & F_NOLOOP) { + int loop = 0; + if(setsockopt(sock->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &loop, sizeof loop) == -1) + error(2, errno, "can't disable multicast loopback"); + } + if(a_ping_handle->ping_common.options & F_TTL) { + if(setsockopt(sock->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &a_ping_handle->ping_common.ttl, sizeof (a_ping_handle->ping_common.ttl)) == -1) + error(2, errno, "can't set multicast hop limit"); + if(setsockopt(sock->fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &a_ping_handle->ping_common.ttl, sizeof (a_ping_handle->ping_common.ttl)) == -1) + error(2, errno, "can't set unicast hop limit"); + } + + const int on = 1; + if( + #ifdef IPV6_RECVHOPLIMIT + setsockopt(sock->fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &on, sizeof on) == -1 && + setsockopt(sock->fd, IPPROTO_IPV6, IPV6_2292HOPLIMIT, &on, sizeof on) == -1 + #else + setsockopt(sock->fd, IPPROTO_IPV6, IPV6_HOPLIMIT, &on, sizeof on) == -1 +#endif + ) + error(2, errno, "can't receive hop limit"); + + if(a_ping_handle->ping_common.options & F_TCLASS) { +#ifdef IPV6_TCLASS + if(setsockopt(sock->fd, IPPROTO_IPV6, IPV6_TCLASS, &tclass, sizeof tclass) == -1) + error(2, errno, "setsockopt(IPV6_TCLASS)"); +#else + error(0, 0, "traffic class is not supported"); +#endif + } + + if(a_ping_handle->ping_common.options & F_FLOWINFO) { +#ifdef IPV6_FLOWLABEL_MGR + char freq_buf[CMSG_ALIGN(sizeof(struct in6_flowlabel_req)) + cmsglen]; + struct in6_flowlabel_req *freq = (struct in6_flowlabel_req *)freq_buf; + int freq_len = sizeof(*freq); + memset(freq, 0, sizeof(*freq)); + freq->flr_label = htonl(flowlabel & IPV6_FLOWINFO_FLOWLABEL); + freq->flr_action = IPV6_FL_A_GET; + freq->flr_flags = IPV6_FL_F_CREATE; + freq->flr_share = IPV6_FL_S_EXCL; + memcpy(&freq->flr_dst, &whereto.sin6_addr, 16); + if (setsockopt(sock->fd, IPPROTO_IPV6, IPV6_FLOWLABEL_MGR, freq, freq_len) == -1) + error(2, errno, "can't set flowlabel"); + flowlabel = freq->flr_label; +#else + error(2, 0, "flow labels are not supported"); +#endif + +#ifdef IPV6_FLOWINFO_SEND + whereto.sin6_flowinfo = flowlabel; + if (setsockopt(sock->fd, IPPROTO_IPV6, IPV6_FLOWINFO_SEND, &on, sizeof on) == -1) + error(2, errno, "can't send flowinfo"); +#else + error(2, 0, "flowinfo is not supported"); +#endif + } + + printf("PING %s(%s) ", a_ping_handle->ping_common.hostname, pr_addr(a_ping_handle, &whereto, sizeof whereto)); + if(flowlabel) + printf(", flow 0x%05x, ", (unsigned) ntohl(flowlabel)); + if(a_ping_handle->device || (a_ping_handle->ping_common.options & F_STRICTSOURCE)) { + int saved_options = a_ping_handle->ping_common.options; + + a_ping_handle->ping_common.options |= F_NUMERIC; + printf("from %s %s: ", pr_addr(a_ping_handle, &source6, sizeof source6), a_ping_handle->device ? a_ping_handle->device : ""); + a_ping_handle->ping_common.options = saved_options; + } + printf("%d data bytes\n", a_ping_handle->ping_common.datalen); + + setup(a_ping_handle, sock); + + drop_capabilities(); + + main_loop(a_ping_handle, &ping6_func_set, sock, packet, packlen); + return 0; +} + +int ping6_receive_error_msg(ping_handle_t *a_ping_handle, socket_st *sock) +{ + ssize_t res; + char cbuf[512]; + struct iovec iov; + struct msghdr msg; + struct cmsghdr *cmsg; + struct sock_extended_err *e; + struct icmp6_hdr icmph; + struct sockaddr_in6 target; + int net_errors = 0; + int local_errors = 0; + int saved_errno = errno; + + iov.iov_base = &icmph; + iov.iov_len = sizeof(icmph); + msg.msg_name = (void*) ⌖ + msg.msg_namelen = sizeof(target); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_flags = 0; + msg.msg_control = cbuf; + msg.msg_controllen = sizeof(cbuf); + + res = recvmsg(sock->fd, &msg, MSG_ERRQUEUE | MSG_DONTWAIT); + if(res < 0) + goto out; + + e = NULL; + for(cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { + if(cmsg->cmsg_level == IPPROTO_IPV6) { + if(cmsg->cmsg_type == IPV6_RECVERR) + e = (struct sock_extended_err *) CMSG_DATA(cmsg); + } + } + if(e == NULL) + abort(); + + if(e->ee_origin == SO_EE_ORIGIN_LOCAL) { + local_errors++; + if(a_ping_handle->ping_common.options & F_QUIET) + goto out; + if(a_ping_handle->ping_common.options & F_FLOOD) + write_stdout("E", 1); + else if(e->ee_errno != EMSGSIZE) + error(0, e->ee_errno, "local error"); + else + error(0, 0, "local error: message too long, mtu: %u", e->ee_info); + a_ping_handle->ping_common.nerrors++; + } else if(e->ee_origin == SO_EE_ORIGIN_ICMP6) { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6*) (e + 1); + + if((size_t) res < sizeof(icmph) || + memcmp(&target.sin6_addr, &whereto.sin6_addr, 16) || + icmph.icmp6_type != ICMP6_ECHO_REQUEST || + !is_ours(a_ping_handle, sock, icmph.icmp6_id)) { + /* Not our error, not an error at all. Clear. */ + saved_errno = 0; + goto out; + } + + net_errors++; + a_ping_handle->ping_common.nerrors++; + if(a_ping_handle->ping_common.options & F_QUIET) + goto out; + if(a_ping_handle->ping_common.options & F_FLOOD) { + write_stdout("\bE", 2); + } else { + print_timestamp(a_ping_handle); + printf("From %s icmp_seq=%u ", pr_addr(a_ping_handle, sin6, sizeof *sin6), ntohs(icmph.icmp6_seq)); + pr_icmph(e->ee_type, e->ee_code, e->ee_info); + putchar('\n'); + fflush(stdout); + } + } + + out: + errno = saved_errno; + return net_errors ? net_errors : -local_errors; +} + +/* + * pinger -- + * Compose and transmit an ICMP ECHO REQUEST packet. The IP packet + * will be added on by the kernel. The ID field is our UNIX process ID, + * and the sequence number is an ascending integer. The first several bytes + * of the data portion are used to hold a UNIX "timeval" struct in VAX + * byte-order, to compute the round-trip time. + */ +static int build_echo(ping_handle_t *a_ping_handle, uint8_t *_icmph, unsigned packet_size __attribute__((__unused__))) +{ + struct icmp6_hdr *icmph; + int cc; + + icmph = (struct icmp6_hdr *) _icmph; + icmph->icmp6_type = ICMP6_ECHO_REQUEST; + icmph->icmp6_code = 0; + icmph->icmp6_cksum = 0; + icmph->icmp6_seq= htons(a_ping_handle->ping_common.ntransmitted+1); + icmph->icmp6_id= a_ping_handle->ping_common.ident; + + if(a_ping_handle->ping_common.timing) + gettimeofday((struct timeval *) &_icmph[8], + (struct timezone *) NULL); + + cc = a_ping_handle->ping_common.datalen + 8; /* skips ICMP portion */ + + return cc; +} + +static int build_niquery(ping_handle_t *a_ping_handle, uint8_t *_nih, unsigned packet_size __attribute__((__unused__))) +{ + struct ni_hdr *nih; + int cc; + + nih = (struct ni_hdr *) _nih; + nih->ni_cksum = 0; + + nih->ni_type = ICMPV6_NI_QUERY; + cc = sizeof(*nih); + a_ping_handle->ping_common.datalen = 0; + + niquery_fill_nonce(a_ping_handle->ping_common.ntransmitted + 1, nih->ni_nonce); + nih->ni_code = ni_subject_type; + nih->ni_qtype= htons(ni_query); + nih->ni_flags= ni_flag; + memcpy(nih + 1, ni_subject, ni_subject_len); + cc += ni_subject_len; + + return cc; +} + +int ping6_send_probe(ping_handle_t *a_ping_handle, socket_st *sock, void *packet, unsigned packet_size) +{ + int len, cc; + + rcvd_clear(a_ping_handle, a_ping_handle->ping_common.ntransmitted + 1); + + if(niquery_is_enabled()) + len = build_niquery(a_ping_handle, packet, packet_size); + else + len = build_echo(a_ping_handle, packet, packet_size); + + if(cmsglen == 0) { + cc = sendto(sock->fd, (char *) packet, len, a_ping_handle->ping_common.confirm, + (struct sockaddr *) &whereto, + sizeof(struct sockaddr_in6)); + } else { + struct msghdr mhdr; + struct iovec iov; + + iov.iov_len = len; + iov.iov_base = packet; + + memset(&mhdr, 0, sizeof(mhdr)); + mhdr.msg_name = &whereto; + mhdr.msg_namelen = sizeof(struct sockaddr_in6); + mhdr.msg_iov = &iov; + mhdr.msg_iovlen = 1; + mhdr.msg_control = cmsgbuf; + mhdr.msg_controllen = cmsglen; + + cc = sendmsg(sock->fd, &mhdr, a_ping_handle->ping_common.confirm); + } + a_ping_handle->ping_common.confirm = 0; + + return (cc == len ? 0 : cc); +} + +void pr_echo_reply(uint8_t *_icmph, int cc __attribute__((__unused__))) +{ + struct icmp6_hdr *icmph = (struct icmp6_hdr *) _icmph; + log_printf(" icmp_seq=%u", ntohs(icmph->icmp6_seq)); +} + +static void putchar_safe(char c) +{ + if(isprint(c)) + putchar(c); + else + printf("\\%03o", c); +} + +static +void pr_niquery_reply_name(struct ni_hdr *nih, int len) +{ + uint8_t *h = (uint8_t *) (nih + 1); + uint8_t *p = h + 4; + uint8_t *end = (uint8_t *) nih + len; + int continued = 0; + char buf[1024]; + int ret; + + len -= sizeof(struct ni_hdr) + 4; + + if(len < 0) { + printf(" parse error (too short)"); + return; + } + while(p < end) { + int fqdn = 1; + size_t i; + + memset(buf, 0xff, sizeof(buf)); + + if(continued) + putchar(','); + + ret = dn_expand(h, end, p, buf, sizeof(buf)); + if(ret < 0) { + printf(" parse error (truncated)"); + break; + } + if(p + ret < end && *(p + ret) == '\0') + fqdn = 0; + + putchar(' '); + for(i = 0; i < strlen(buf); i++) + putchar_safe(buf[i]); + if(fqdn) + putchar('.'); + + p += ret + !fqdn; + + continued = 1; + } +} + +static +void pr_niquery_reply_addr(struct ni_hdr *nih, int len) +{ + uint8_t *h = (uint8_t *) (nih + 1); + uint8_t *p; + uint8_t *end = (uint8_t *) nih + len; + int af; + int aflen; + int continued = 0; + int truncated; + char buf[1024]; + + switch (ntohs(nih->ni_qtype)) { + case NI_QTYPE_IPV4ADDR: + af = AF_INET; + aflen = sizeof(struct in_addr); + truncated = nih->ni_flags & NI_IPV6ADDR_F_TRUNCATE; + break; + case NI_QTYPE_IPV6ADDR: + af = AF_INET6; + aflen = sizeof(struct in6_addr); + truncated = nih->ni_flags & NI_IPV4ADDR_F_TRUNCATE; + break; + default: + /* should not happen */ + af = aflen = truncated = 0; + } + p = h; + if(len < 0) { + printf(" parse error (too short)"); + return; + } + + while(p < end) { + if(continued) + putchar(','); + + if(p + sizeof(uint32_t) + aflen > end) { + printf(" parse error (truncated)"); + break; + } + if(!inet_ntop(af, p + sizeof(uint32_t), buf, sizeof(buf))) + printf(" unexpeced error in inet_ntop(%s)", + strerror(errno)); + else + printf(" %s", buf); + p += sizeof(uint32_t) + aflen; + + continued = 1; + } + if(truncated) + printf(" (truncated)"); +} + +static +void pr_niquery_reply(uint8_t *_nih, int len) +{ + struct ni_hdr *nih = (struct ni_hdr *) _nih; + + switch (nih->ni_code) { + case NI_SUCCESS: + switch (ntohs(nih->ni_qtype)) { + case NI_QTYPE_NAME: + pr_niquery_reply_name(nih, len); + break; + case NI_QTYPE_IPV4ADDR: + case NI_QTYPE_IPV6ADDR: + pr_niquery_reply_addr(nih, len); + break; + default: + printf(" unknown qtype(0x%02x)", ntohs(nih->ni_qtype)); + } + break; + case NI_REFUSED: + printf(" refused"); + break; + case NI_UNKNOWN: + printf(" unknown"); + break; + default: + printf(" unknown code(%02x)", ntohs(nih->ni_code)); + } + printf("; seq=%u;", ntohsp((uint16_t*) nih->ni_nonce)); +} + +/* + * parse_reply -- + * Print out the packet, if it came from us. This logic is necessary + * because ALL readers of the ICMP socket get a copy of ALL ICMP packets + * which arrive ('tis only fair). This permits multiple copies of this + * program to be run without having intermingled output (or statistics!). + */ +int +ping6_parse_reply(ping_handle_t *a_ping_handle, socket_st *sock, struct msghdr *msg, int cc, void *addr, struct timeval *tv) +{ + struct sockaddr_in6 *from = addr; + uint8_t *buf = msg->msg_iov->iov_base; + struct cmsghdr *c; + struct icmp6_hdr *icmph; + int hops = -1; + + for(c = CMSG_FIRSTHDR(msg); c; c = CMSG_NXTHDR(msg, c)) { + if(c->cmsg_level != IPPROTO_IPV6) + continue; + switch (c->cmsg_type) { + case IPV6_HOPLIMIT: + #ifdef IPV6_2292HOPLIMIT + case IPV6_2292HOPLIMIT: + #endif + if(c->cmsg_len < CMSG_LEN(sizeof(int))) + continue; + memcpy(&hops, CMSG_DATA(c), sizeof(hops)); + } + } + + /* Now the ICMP part */ + + icmph = (struct icmp6_hdr *) buf; + if(cc < 8) { + if(a_ping_handle->ping_common.options & F_VERBOSE) + error(0, 0, "packet too short: %d bytes", cc); + return 1; + } + + if(icmph->icmp6_type == ICMP6_ECHO_REPLY) { + if(!is_ours(a_ping_handle, sock, icmph->icmp6_id)) + return 1; + if (!contains_pattern_in_payload(a_ping_handle, (uint8_t*)(icmph+1))) + return 1; /* 'Twas really not our ECHO */ + if (gather_statistics(a_ping_handle, (uint8_t*)icmph, sizeof(*icmph), cc, + ntohs(icmph->icmp6_seq), + hops, 0, tv, pr_addr(a_ping_handle, from, sizeof *from), + pr_echo_reply)) { + fflush(stdout); + return 0; + } + } else if (icmph->icmp6_type == ICMPV6_NI_REPLY) { + struct ni_hdr *nih = (struct ni_hdr *)icmph; + int seq = niquery_check_nonce(nih->ni_nonce); + if (seq < 0) + return 1; + if (gather_statistics(a_ping_handle, (uint8_t*)icmph, sizeof(*icmph), cc, + seq, + hops, 0, tv, pr_addr(a_ping_handle, from, sizeof *from), + pr_niquery_reply)) + return 0; + } else { + int nexthdr; + struct ip6_hdr *iph1 = (struct ip6_hdr*)(icmph+1); + struct icmp6_hdr *icmph1 = (struct icmp6_hdr *)(iph1+1); + + /* We must not ever fall here. All the messages but + * echo reply are blocked by filter and error are + * received with IPV6_RECVERR. Ugly code is preserved + * however, just to remember what crap we avoided + * using RECVRERR. :-) + */ + + if (cc < (int) (8 + sizeof(struct ip6_hdr) + 8)) + return 1; + + if (memcmp(&iph1->ip6_dst, &whereto.sin6_addr, 16)) + return 1; + + nexthdr = iph1->ip6_nxt; + + if (nexthdr == 44) { + nexthdr = *(uint8_t*)icmph1; + icmph1++; + } + if (nexthdr == IPPROTO_ICMPV6) { + if (icmph1->icmp6_type != ICMP6_ECHO_REQUEST || + !is_ours(a_ping_handle, sock, icmph1->icmp6_id)) + return 1; + acknowledge(a_ping_handle, ntohs(icmph1->icmp6_seq)); + a_ping_handle->ping_common.nerrors++; + if (a_ping_handle->ping_common.options & F_FLOOD) { + write_stdout("\bE", 2); + return 0; + } + print_timestamp(a_ping_handle); + printf("From %s: icmp_seq=%u ", pr_addr(a_ping_handle, from, sizeof *from), ntohs(icmph1->icmp6_seq)); + } else { + /* We've got something other than an ECHOREPLY */ + if (!(a_ping_handle->ping_common.options & F_VERBOSE) || a_ping_handle->ping_common.uid) + return 1; + print_timestamp(a_ping_handle); + printf("From %s: ", pr_addr(a_ping_handle, from, sizeof *from)); + } + pr_icmph(icmph->icmp6_type, icmph->icmp6_code, ntohl(icmph->icmp6_mtu)); + } + + if(a_ping_handle->ping_common.options & F_AUDIBLE) { + putchar('\a'); + if(a_ping_handle->ping_common.options & F_FLOOD) + fflush(stdout); + } + if(!(a_ping_handle->ping_common.options & F_FLOOD)) { + putchar('\n'); + fflush(stdout); + } + return 0; +} + +int pr_icmph(uint8_t type, uint8_t code, uint32_t info) +{ + switch (type) { + case ICMP6_DST_UNREACH: + printf("Destination unreachable: "); + switch (code) { + case ICMP6_DST_UNREACH_NOROUTE: + printf("No route"); + break; + case ICMP6_DST_UNREACH_ADMIN: + printf("Administratively prohibited"); + break; + case ICMP6_DST_UNREACH_BEYONDSCOPE: + printf("Beyond scope of source address"); + break; + case ICMP6_DST_UNREACH_ADDR: + printf("Address unreachable"); + break; + case ICMP6_DST_UNREACH_NOPORT: + printf("Port unreachable"); + break; + default: + printf("Unknown code %d", code); + break; + } + break; + case ICMP6_PACKET_TOO_BIG: + printf("Packet too big: mtu=%u", info); + if(code) + printf(", code=%d", code); + break; + case ICMP6_TIME_EXCEEDED: + printf("Time exceeded: "); + if(code == ICMP6_TIME_EXCEED_TRANSIT) + printf("Hop limit"); + else if(code == ICMP6_TIME_EXCEED_REASSEMBLY) + printf("Defragmentation failure"); + else + printf("code %d", code); + break; + case ICMP6_PARAM_PROB: + printf("Parameter problem: "); + if(code == ICMP6_PARAMPROB_HEADER) + printf("Wrong header field "); + else if(code == ICMP6_PARAMPROB_NEXTHEADER) + printf("Unknown header "); + else if(code == ICMP6_PARAMPROB_OPTION) + printf("Unknown option "); + else + printf("code %d ", code); + printf("at %u", info); + break; + case ICMP6_ECHO_REQUEST: + printf("Echo request"); + break; + case ICMP6_ECHO_REPLY: + printf("Echo reply"); + break; + case MLD_LISTENER_QUERY: + printf("MLD Query"); + break; + case MLD_LISTENER_REPORT: + printf("MLD Report"); + break; + case MLD_LISTENER_REDUCTION: + printf("MLD Reduction"); + break; + default: + printf("unknown icmp type: %u", type); + + } + return 0; +} + +void ping6_install_filter(ping_handle_t *a_ping_handle, socket_st *sock) +{ + static int once; + static struct sock_filter insns[] = { + BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 4), /* Load icmp echo ident */ + BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 0xAAAA, 0, 1), /* Ours? */ + BPF_STMT(BPF_RET|BPF_K, ~0U), /* Yes, it passes. */ + BPF_STMT(BPF_LD|BPF_B|BPF_ABS, 0), /* Load icmp type */ + BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ICMP6_ECHO_REPLY, 1, 0), /* Echo? */ + BPF_STMT(BPF_RET|BPF_K, ~0U), /* No. It passes. This must not happen. */ + BPF_STMT(BPF_RET|BPF_K, 0), /* Echo with wrong ident. Reject. */ + }; + static struct sock_fprog filter = { + sizeof insns / sizeof(insns[0]), + insns + }; + + if(once) + return; + once = 1; + + /* Patch bpflet for current identifier. */ + insns[1] = (struct sock_filter )BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(a_ping_handle->ping_common.ident), 0, 1); + + if(setsockopt(sock->fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter))) + error(0, errno, "WARNING: failed to install socket filter"); +} diff --git a/modules/net/iputils/ping_common.c b/modules/net/iputils/ping_common.c new file mode 100644 index 0000000000..566fdc755e --- /dev/null +++ b/modules/net/iputils/ping_common.c @@ -0,0 +1,1030 @@ +/* + * Copyright (c) 1989 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Mike Muuss. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "ping.h" + +#ifndef HZ +#define HZ sysconf(_SC_CLK_TCK) +#endif + +/* +int options; + +int mark; +int sndbuf; +int ttl; +int rtt; +int rtt_addend; +uint16_t acked; + +unsigned char outpack[MAXPACKET]; +struct rcvd_table rcvd_tbl; + +// counters +long npackets; // max packets to transmit +long nreceived; // # of packets we got back +long nrepeats; // number of duplicates +long ntransmitted; // sequence # for outbound packets = #sent +long nchecksum; // replies with bad checksum +long nerrors; // icmp errors +int interval = 1000; // interval between packets (msec) +int preload = 1; +int deadline = 0; // time to die +int lingertime = MAXWAIT * 1000; +struct timeval start_time, cur_time; +int confirm = 0; +volatile int in_pr_addr = 0; // pr_addr() is executing +jmp_buf pr_addr_jmp; +*/ + +volatile int exiting; +volatile int status_snapshot; + +/* Stupid workarounds for bugs/missing functionality in older linuces. + * confirm_flag fixes refusing service of kernels without MSG_CONFIRM. + * i.e. for linux-2.2 */ +/* + +int confirm_flag = MSG_CONFIRM; + +// timing +int timing; // flag to do timing +long tmin = LONG_MAX; // minimum round trip time +long tmax; // maximum round trip time +*/ +/* Message for rpm maintainers: have _shame_. If you want + * to fix something send the patch to me for sanity checking. + * "sparcfix" patch is a complete non-sense, apparenly the person + * prepared it was stoned. + */ +/* +long long tsum; // sum of all times, for doing average +long long tsum2; +int pipesize = -1; + +int datalen = DEFDATALEN; + +char *hostname; +int uid; +uid_t euid; +int ident; // process id to identify our packets + +static int screen_width = INT_MAX; + +#ifdef HAVE_LIBCAP +static cap_value_t cap_raw = CAP_NET_RAW; +static cap_value_t cap_admin = CAP_NET_ADMIN; +#endif +*/ + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) + + +void usage(void) +{ + fprintf(stderr, + "\nUsage\n" + " ping [options] <destination>\n" + "\nOptions:\n" + " <destination> dns name or ip address\n" + " -a use audible ping\n" + " -A use adaptive ping\n" + " -B sticky source address\n" + " -c <count> stop after <count> replies\n" + " -D print timestamps\n" + " -d use SO_DEBUG socket option\n" + " -f flood ping\n" + " -h print help and exit\n" + " -I <interface> either interface name or address\n" + " -i <interval> seconds between sending each packet\n" + " -L suppress loopback of multicast packets\n" + " -l <preload> send <preload> number of packages while waiting replies\n" + " -m <mark> tag the packets going out\n" + " -M <pmtud opt> define mtu discovery, can be one of <do|dont|want>\n" + " -n no dns name resolution\n" + " -O report outstanding replies\n" + " -p <pattern> contents of padding byte\n" + " -q quiet output\n" + " -Q <tclass> use quality of service <tclass> bits\n" + " -s <size> use <size> as number of data bytes to be sent\n" + " -S <size> use <size> as SO_SNDBUF socket option value\n" + " -t <ttl> define time to live\n" + " -U print user-to-user latency\n" + " -v verbose output\n" + " -V print version and exit\n" + " -w <deadline> reply wait <deadline> in seconds\n" + " -W <timeout> time to wait for response\n" + "\nIPv4 options:\n" + " -4 use IPv4\n" + " -b allow pinging broadcast\n" + " -R record route\n" + " -T <timestamp> define timestamp, can be one of <tsonly|tsandaddr|tsprespec>\n" + "\nIPv6 options:\n" + " -6 use IPv6\n" + " -F <flowlabel> define flow label, default is random\n" + " -N <nodeinfo opt> use icmp6 node info query, try <help> as argument\n" + "\nFor more details see ping(8).\n" + ); + //exit(2); + exit(2); +} + +void limit_capabilities(ping_handle_t *a_ping_handle) +{ +#ifdef HAVE_LIBCAP + cap_t cap_cur_p; + cap_t cap_p; + cap_flag_value_t cap_ok; + + cap_cur_p = cap_get_proc(); + if (!cap_cur_p) + error(-1, errno, "cap_get_proc"); + cap_p = cap_init(); + if (!cap_p) + error(-1, errno, "cap_init"); + cap_ok = CAP_CLEAR; + cap_get_flag(cap_cur_p, CAP_NET_ADMIN, CAP_PERMITTED, &cap_ok); + if (cap_ok != CAP_CLEAR) + cap_set_flag(cap_p, CAP_PERMITTED, 1, &cap_admin, CAP_SET); + cap_ok = CAP_CLEAR; + cap_get_flag(cap_cur_p, CAP_NET_RAW, CAP_PERMITTED, &cap_ok); + if (cap_ok != CAP_CLEAR) + cap_set_flag(cap_p, CAP_PERMITTED, 1, &cap_raw, CAP_SET); + if (cap_set_proc(cap_p) < 0) + error(-1, errno, "cap_set_proc"); + if (prctl(PR_SET_KEEPCAPS, 1) < 0) + error(-1, errno, "prctl"); + if (setuid(getuid()) < 0) + error(-1, errno, "setuid"); + if (prctl(PR_SET_KEEPCAPS, 0) < 0) + error(-1, errno, "prctl"); + cap_free(cap_p); + cap_free(cap_cur_p); +#endif + a_ping_handle->ping_common.uid = getuid(); + a_ping_handle->ping_common.euid = geteuid(); +#ifndef HAVE_LIBCAP + if(seteuid(a_ping_handle->ping_common.uid)) + error(-1, errno, "setuid"); +#endif +} + +#ifdef HAVE_LIBCAP +int modify_capability(cap_value_t cap, cap_flag_value_t on) +{ + cap_t cap_p = cap_get_proc(); + cap_flag_value_t cap_ok; + int rc = -1; + + if (!cap_p) { + error(0, errno, "cap_get_proc"); + goto out; + } + + cap_ok = CAP_CLEAR; + cap_get_flag(cap_p, cap, CAP_PERMITTED, &cap_ok); + if (cap_ok == CAP_CLEAR) { + rc = on ? -1 : 0; + goto out; + } + + cap_set_flag(cap_p, CAP_EFFECTIVE, 1, &cap, on); + + if (cap_set_proc(cap_p) < 0) { + error(0, errno, "cap_set_proc"); + goto out; + } + + cap_free(cap_p); + cap_p = NULL; + + rc = 0; + out: + if (cap_p) + cap_free(cap_p); + return rc; +} +#else +int modify_capability(ping_handle_t *a_ping_handle, int on) +{ + if(seteuid(on ? a_ping_handle->ping_common.euid : getuid())) { + error(0, errno, "seteuid"); + return -1; + } + + return 0; +} +#endif + +void drop_capabilities(void) +{ +#ifdef HAVE_LIBCAP + cap_t cap = cap_init(); + if (cap_set_proc(cap) < 0) + error(-1, errno, "cap_set_proc"); + cap_free(cap); +#else + if(setuid(getuid())) + error(-1, errno, "setuid"); +#endif +} + +/* Fills all the outpack, excluding ICMP header, but _including_ + * timestamp area with supplied pattern. + */ +void fill(ping_handle_t *a_ping_handle, char *patp, unsigned char *packet, unsigned packet_size) +{ + int ii, jj; + unsigned int pat[16]; + char *cp; + unsigned char *bp = packet + 8; + +#ifdef USE_IDN + setlocale(LC_ALL, "C"); +#endif + + for(cp = patp; *cp; cp++) { + if(!isxdigit(*cp)) + error(2, 0, "patterns must be specified as hex digits: %s", cp); + } + ii = sscanf(patp, + "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", + &pat[0], &pat[1], &pat[2], &pat[3], &pat[4], &pat[5], &pat[6], + &pat[7], &pat[8], &pat[9], &pat[10], &pat[11], &pat[12], + &pat[13], &pat[14], &pat[15]); + + if(ii > 0) { + unsigned kk; + for(kk = 0; kk <= packet_size - (8 + ii); kk += ii) + for(jj = 0; jj < ii; ++jj) + bp[jj + kk] = pat[jj]; + } + if(!(a_ping_handle->ping_common.options & F_QUIET)) { + printf("PATTERN: 0x"); + for(jj = 0; jj < ii; ++jj) + printf("%02x", bp[jj] & 0xFF); + printf("\n"); + } + +#ifdef USE_IDN + setlocale(LC_ALL, ""); +#endif +} + +static void sigexit(int signo __attribute__((__unused__))) +{ + //exiting = 1; + //if(in_pr_addr) + // longjmp(pr_addr_jmp, 0); +} + +static void sigstatus(int signo __attribute__((__unused__))) +{ + //status_snapshot = 1; +} + +int __schedule_exit(ping_handle_t *a_ping_handle, int next) +{ + static unsigned long waittime; + struct itimerval it; + + if(waittime) + return next; + + if(a_ping_handle->ping_common.nreceived) { + waittime = 2 * a_ping_handle->ping_common.tmax; + if(waittime < (unsigned long) (1000 * a_ping_handle->ping_common.interval)) + waittime = 1000 * a_ping_handle->ping_common.interval; + } else + waittime = a_ping_handle->ping_common.lingertime * 1000; + + if(next < 0 || (unsigned long) next < waittime / 1000) + next = waittime / 1000; + + it.it_interval.tv_sec = 0; + it.it_interval.tv_usec = 0; + it.it_value.tv_sec = waittime / 1000000; + it.it_value.tv_usec = waittime % 1000000; + setitimer(ITIMER_REAL, &it, NULL); + return next; +} + +static inline void update_interval(ping_handle_t *a_ping_handle) +{ + int est = a_ping_handle->ping_common.rtt ? a_ping_handle->ping_common.rtt / 8 : a_ping_handle->ping_common.interval * 1000; + + a_ping_handle->ping_common.interval = (est + a_ping_handle->ping_common.rtt_addend + 500) / 1000; + if(a_ping_handle->ping_common.uid && a_ping_handle->ping_common.interval < MINUSERINTERVAL) + a_ping_handle->ping_common.interval = MINUSERINTERVAL; +} + +/* + * Print timestamp + */ +void print_timestamp(ping_handle_t *a_ping_handle) +{ + if(a_ping_handle->ping_common.options & F_PTIMEOFDAY) { + struct timeval tv; + gettimeofday(&tv, NULL); + printf("[%lu.%06lu] ", + (unsigned long) tv.tv_sec, (unsigned long) tv.tv_usec); + } +} + +/* + * pinger -- + * Compose and transmit an ICMP ECHO REQUEST packet. The IP packet + * will be added on by the kernel. The ID field is our UNIX process ID, + * and the sequence number is an ascending integer. The first several bytes + * of the data portion are used to hold a UNIX "timeval" struct in VAX + * byte-order, to compute the round-trip time. + */ +int pinger(ping_handle_t *a_ping_handle, ping_func_set_st *fset, socket_st *sock) +{ + static int oom_count; + static int tokens; + int i; + + /* Have we already sent enough? If we have, return an arbitrary positive value. */ + if(exiting || (a_ping_handle->ping_common.npackets && a_ping_handle->ping_common.ntransmitted >= a_ping_handle->ping_common.npackets && !a_ping_handle->ping_common.deadline)) + return 1000; + + /* Check that packets < rate*time + preload */ + if(a_ping_handle->ping_common.cur_time.tv_sec == 0) { + gettimeofday(&a_ping_handle->ping_common.cur_time, NULL); + tokens = a_ping_handle->ping_common.interval * (a_ping_handle->ping_common.preload - 1); + } else { + long ntokens; + struct timeval tv; + + gettimeofday(&tv, NULL); + ntokens = (tv.tv_sec - a_ping_handle->ping_common.cur_time.tv_sec) * 1000 + + (tv.tv_usec - a_ping_handle->ping_common.cur_time.tv_usec) / 1000; + if(!a_ping_handle->ping_common.interval) { + /* Case of unlimited flood is special; + * if we see no reply, they are limited to 100pps */ + if(ntokens < MININTERVAL && in_flight(a_ping_handle) >= a_ping_handle->ping_common.preload) + return MININTERVAL - ntokens; + } + ntokens += tokens; + if(ntokens > a_ping_handle->ping_common.interval * a_ping_handle->ping_common.preload) + ntokens = a_ping_handle->ping_common.interval * a_ping_handle->ping_common.preload; + if(ntokens < a_ping_handle->ping_common.interval) + return a_ping_handle->ping_common.interval - ntokens; + + a_ping_handle->ping_common.cur_time = tv; + tokens = ntokens - a_ping_handle->ping_common.interval; + } + + if(a_ping_handle->ping_common.options & F_OUTSTANDING) { + if(a_ping_handle->ping_common.ntransmitted > 0 && !rcvd_test(a_ping_handle, a_ping_handle->ping_common.ntransmitted)) { + print_timestamp(a_ping_handle); + printf("no answer yet for icmp_seq=%lu\n", (a_ping_handle->ping_common.ntransmitted % MAX_DUP_CHK)); + fflush(stdout); + } + } + + resend: + i = fset->send_probe(a_ping_handle, sock, a_ping_handle->ping_common.outpack, sizeof(a_ping_handle->ping_common.outpack)); + + if(i == 0) { + oom_count = 0; + advance_ntransmitted(a_ping_handle); + if(!(a_ping_handle->ping_common.options & F_QUIET) && (a_ping_handle->ping_common.options & F_FLOOD)) { + /* Very silly, but without this output with + * high preload or pipe size is very confusing. */ + if((a_ping_handle->ping_common.preload < a_ping_handle->ping_common.screen_width && a_ping_handle->ping_common.pipesize < a_ping_handle->ping_common.screen_width) || + in_flight(a_ping_handle) < a_ping_handle->ping_common.screen_width) + write_stdout(".", 1); + } + return a_ping_handle->ping_common.interval - tokens; + } + + /* And handle various errors... */ + if(i > 0) { + /* Apparently, it is some fatal bug. */ + abort(); + } else if(errno == ENOBUFS || errno == ENOMEM) { + int nores_interval; + + /* Device queue overflow or OOM. Packet is not sent. */ + tokens = 0; + /* Slowdown. This works only in adaptive mode (option -A) */ + a_ping_handle->ping_common.rtt_addend += (a_ping_handle->ping_common.rtt < 8 * 50000 ? a_ping_handle->ping_common.rtt / 8 : 50000); + if(a_ping_handle->ping_common.options & F_ADAPTIVE) + update_interval(a_ping_handle); + nores_interval = SCHINT(a_ping_handle->ping_common.interval / 2); + if(nores_interval > 500) + nores_interval = 500; + oom_count++; + if(oom_count * nores_interval < a_ping_handle->ping_common.lingertime) + return nores_interval; + i = 0; + /* Fall to hard error. It is to avoid complete deadlock + * on stuck output device even when dealine was not requested. + * Expected timings are screwed up in any case, but we will + * exit some day. :-) */ + } else if(errno == EAGAIN) { + /* Socket buffer is full. */ + tokens += a_ping_handle->ping_common.interval; + return MININTERVAL; + } else { + if((i = fset->receive_error_msg(a_ping_handle, sock)) > 0) { + /* An ICMP error arrived. In this case, we've received + * an error from sendto(), but we've also received an + * ICMP message, which means the packet did in fact + * send in some capacity. So, in this odd case, report + * the more specific errno as the error, and treat this + * as a hard local error. */ + i = 0; + goto hard_local_error; + } + /* Compatibility with old linuces. */ + if(i == 0 && a_ping_handle->ping_common.confirm_flag && errno == EINVAL) { + a_ping_handle->ping_common.confirm_flag = 0; + errno = 0; + } + if(!errno) + goto resend; + } + + hard_local_error: + /* Hard local error. Pretend we sent packet. */ + advance_ntransmitted(a_ping_handle); + + if(i == 0 && !(a_ping_handle->ping_common.options & F_QUIET)) { + if(a_ping_handle->ping_common.options & F_FLOOD) + write_stdout("E", 1); + else + perror("ping: sendmsg"); + } + tokens = 0; + return SCHINT(a_ping_handle->ping_common.interval); +} + +/* Set socket buffers, "alloc" is an estimate of memory taken by single packet. */ + +void sock_setbufs(ping_handle_t *a_ping_handle, socket_st *sock, int alloc) +{ + int rcvbuf, hold; + socklen_t tmplen = sizeof(hold); + + if(!a_ping_handle->ping_common.sndbuf) + a_ping_handle->ping_common.sndbuf = alloc; + setsockopt(sock->fd, SOL_SOCKET, SO_SNDBUF, (char *) &a_ping_handle->ping_common.sndbuf, sizeof(a_ping_handle->ping_common.sndbuf)); + + rcvbuf = hold = alloc * a_ping_handle->ping_common.preload; + if(hold < 65536) + hold = 65536; + setsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, (char *) &hold, sizeof(hold)); + if(getsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, (char *) &hold, &tmplen) == 0) { + if(hold < rcvbuf) + error(0, 0, "WARNING: probably, rcvbuf is not enough to hold preload"); + } +} + +/* Protocol independent setup and parameter checks. */ + +void setup(ping_handle_t *a_ping_handle, socket_st *sock) +{ + int hold; + struct timeval tv; + sigset_t sset; + + if((a_ping_handle->ping_common.options & F_FLOOD) && !(a_ping_handle->ping_common.options & F_INTERVAL)) + a_ping_handle->ping_common.interval = 0; + + if(a_ping_handle->ping_common.uid && a_ping_handle->ping_common.interval < MINUSERINTERVAL) + error(2, 0, "cannot flood; minimal interval allowed for user is %dms", MINUSERINTERVAL); + + if(a_ping_handle->ping_common.interval >= INT_MAX / a_ping_handle->ping_common.preload) + error(2, 0, "illegal preload and/or interval: %d", a_ping_handle->ping_common.interval); + + hold = 1; + if(a_ping_handle->ping_common.options & F_SO_DEBUG) + setsockopt(sock->fd, SOL_SOCKET, SO_DEBUG, (char *) &hold, sizeof(hold)); + if(a_ping_handle->ping_common.options & F_SO_DONTROUTE) + setsockopt(sock->fd, SOL_SOCKET, SO_DONTROUTE, (char *) &hold, sizeof(hold)); + +#ifdef SO_TIMESTAMP + if(!(a_ping_handle->ping_common.options & F_LATENCY)) { + int on = 1; + if(setsockopt(sock->fd, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on))) + error(0, 0, "Warning: no SO_TIMESTAMP support, falling back to SIOCGSTAMP"); + } +#endif +#ifdef SO_MARK + if(a_ping_handle->ping_common.options & F_MARK) { + int ret; + int errno_save; + + enable_capability_admin(a_ping_handle); + ret = setsockopt(sock->fd, SOL_SOCKET, SO_MARK, &a_ping_handle->ping_common.mark, sizeof(a_ping_handle->ping_common.mark)); + errno_save = errno; + disable_capability_admin(a_ping_handle); + + if(ret == -1) { + /* we probably dont wanna exit since old kernels + * dont support mark .. + */ + error(0, errno_save, "Warning: Failed to set mark: %d", a_ping_handle->ping_common.mark); + } + } +#endif + + /* Set some SNDTIMEO to prevent blocking forever + * on sends, when device is too slow or stalls. Just put limit + * of one second, or "interval", if it is less. + */ + tv.tv_sec = 1; + tv.tv_usec = 0; + if(a_ping_handle->ping_common.interval < 1000) { + tv.tv_sec = 0; + tv.tv_usec = 1000 * SCHINT(a_ping_handle->ping_common.interval); + } + setsockopt(sock->fd, SOL_SOCKET, SO_SNDTIMEO, (char*) &tv, sizeof(tv)); + + /* Set RCVTIMEO to "interval". Note, it is just an optimization + * allowing to avoid redundant poll(). */ + tv.tv_sec = SCHINT(a_ping_handle->ping_common.interval) / 1000; + tv.tv_usec = 1000 * (SCHINT(a_ping_handle->ping_common.interval) % 1000); + if(setsockopt(sock->fd, SOL_SOCKET, SO_RCVTIMEO, (char*) &tv, sizeof(tv))) + a_ping_handle->ping_common.options |= F_FLOOD_POLL; + + if(!(a_ping_handle->ping_common.options & F_PINGFILLED)) { + int i; + unsigned char *p = a_ping_handle->ping_common.outpack + 8; + + /* Do not forget about case of small datalen, + * fill timestamp area too! + */ + for(i = 0; i < a_ping_handle->ping_common.datalen; ++i) + *p++ = i; + } + + if(sock->socktype == SOCK_RAW) + a_ping_handle->ping_common.ident = htons(getpid() & 0xFFFF); + + set_signal(SIGINT, sigexit); + set_signal(SIGALRM, sigexit); + set_signal(SIGQUIT, sigstatus); + + sigemptyset(&sset); + sigprocmask(SIG_SETMASK, &sset, NULL); + + gettimeofday(&a_ping_handle->ping_common.start_time, NULL); + + if(a_ping_handle->ping_common.deadline) { + struct itimerval it; + + it.it_interval.tv_sec = 0; + it.it_interval.tv_usec = 0; + it.it_value.tv_sec = a_ping_handle->ping_common.deadline; + it.it_value.tv_usec = 0; + setitimer(ITIMER_REAL, &it, NULL); + } + + if(isatty(STDOUT_FILENO)) { + struct winsize w; + + if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1) { + if(w.ws_col > 0) + a_ping_handle->ping_common.screen_width = w.ws_col; + } + } +} + +/* + * Return 0 if pattern in payload point to be ptr did not match the pattern that was sent + */ +int contains_pattern_in_payload(ping_handle_t *a_ping_handle, uint8_t *ptr) +{ + int i; + uint8_t *cp, *dp; + + /* check the data */ + cp = ((u_char*) ptr) + sizeof(struct timeval); + dp = &a_ping_handle->ping_common.outpack[8 + sizeof(struct timeval)]; + for(i = sizeof(struct timeval); i < a_ping_handle->ping_common.datalen; ++i, ++cp, ++dp) { + if(*cp != *dp) + return 0; + } + return 1; +} + +void main_loop(ping_handle_t *a_ping_handle, ping_func_set_st *fset, socket_st *sock, uint8_t *packet, int packlen) +{ + char addrbuf[128]; + char ans_data[4096]; + struct iovec iov; + struct msghdr msg; + struct cmsghdr *c; + int cc; + int next; + int polling; + int recv_error; + + iov.iov_base = (char *) packet; + + for(;;) { + /* Check exit conditions. */ + if(exiting) + break; + if(a_ping_handle->ping_common.npackets && a_ping_handle->ping_common.nreceived + a_ping_handle->ping_common.nerrors >= a_ping_handle->ping_common.npackets) + break; + if(a_ping_handle->ping_common.deadline && a_ping_handle->ping_common.nerrors) + break; + /* Check for and do special actions. */ + if(status_snapshot) + status(a_ping_handle); + + /* Send probes scheduled to this time. */ + do { + next = pinger(a_ping_handle, fset, sock); + next = schedule_exit(a_ping_handle, next); + } while(next <= 0); + + /* "next" is time to send next probe, if positive. + * If next<=0 send now or as soon as possible. */ + + /* Technical part. Looks wicked. Could be dropped, + * if everyone used the newest kernel. :-) + * Its purpose is: + * 1. Provide intervals less than resolution of scheduler. + * Solution: spinning. + * 2. Avoid use of poll(), when recvmsg() can provide + * timed waiting (SO_RCVTIMEO). */ + polling = 0; + recv_error = 0; + if((a_ping_handle->ping_common.options & (F_ADAPTIVE | F_FLOOD_POLL)) || next < SCHINT(a_ping_handle->ping_common.interval)) { + int recv_expected = in_flight(a_ping_handle); + + /* If we are here, recvmsg() is unable to wait for + * required timeout. */ + if(1000 % HZ == 0 ? next <= 1000 / HZ : (next < INT_MAX / HZ && next * HZ <= 1000)) { + /* Very short timeout... So, if we wait for + * something, we sleep for MININTERVAL. + * Otherwise, spin! */ + if(recv_expected) { + next = MININTERVAL; + } else { + next = 0; + /* When spinning, no reasons to poll. + * Use nonblocking recvmsg() instead. */ + polling = MSG_DONTWAIT; + /* But yield yet. */ + sched_yield(); + } + } + + if(!polling && + ((a_ping_handle->ping_common.options & (F_ADAPTIVE | F_FLOOD_POLL)) || a_ping_handle->ping_common.interval)) { + struct pollfd pset; + pset.fd = sock->fd; + pset.events = POLLIN; + pset.revents = 0; + if(poll(&pset, 1, next) < 1 || + !(pset.revents & (POLLIN | POLLERR))) + continue; + polling = MSG_DONTWAIT; + recv_error = pset.revents & POLLERR; + } + } + + for(;;) { + struct timeval *recv_timep = NULL; + struct timeval recv_time; + int not_ours = 0; /* Raw socket can receive messages + * destined to other running pings. */ + + iov.iov_len = packlen; + memset(&msg, 0, sizeof(msg)); + msg.msg_name = addrbuf; + msg.msg_namelen = sizeof(addrbuf); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = ans_data; + msg.msg_controllen = sizeof(ans_data); + + cc = recvmsg(sock->fd, &msg, polling); + //log_printf("**recvmsg(fd=%d,msg=0x%x,polling=%d)=%d\n",sock->fd,&msg,polling,cc); + polling = MSG_DONTWAIT; + + if(cc < 0) { + /* If there was a POLLERR and there is no packet + * on the socket, try to read the error queue. + * Otherwise, give up. + */ + if((errno == EAGAIN && !recv_error) || + errno == EINTR) + break; + recv_error = 0; + if(!fset->receive_error_msg(a_ping_handle, sock)) { + if(errno) { + error(0, errno, "recvmsg"); + break; + } + not_ours = 1; + } + } else { + +#ifdef SO_TIMESTAMP + for(c = CMSG_FIRSTHDR(&msg); c; c = CMSG_NXTHDR(&msg, c)) { + if(c->cmsg_level != SOL_SOCKET || + c->cmsg_type != SO_TIMESTAMP) + continue; + if(c->cmsg_len < CMSG_LEN(sizeof(struct timeval))) + continue; + recv_timep = (struct timeval*) CMSG_DATA(c); + } +#endif + + if((a_ping_handle->ping_common.options & F_LATENCY) || recv_timep == NULL) { + if((a_ping_handle->ping_common.options & F_LATENCY) || + ioctl(sock->fd, SIOCGSTAMP, &recv_time)) + gettimeofday(&recv_time, NULL); + recv_timep = &recv_time; + } + not_ours = fset->parse_reply(a_ping_handle, sock, &msg, cc, addrbuf, recv_timep); + } + + /* See? ... someone runs another ping on this host. */ + if(not_ours && sock->socktype == SOCK_RAW) + fset->install_filter(a_ping_handle, sock); + + /* If nothing is in flight, "break" returns us to pinger. */ + if(in_flight(a_ping_handle) == 0) + break; + + /* Otherwise, try to recvmsg() again. recvmsg() + * is nonblocking after the first iteration, so that + * if nothing is queued, it will receive EAGAIN + * and return to pinger. */ + } + } + // here present exit() from app + finish(a_ping_handle); +} + +int gather_statistics(ping_handle_t *a_ping_handle, uint8_t *icmph, int icmplen, + int cc, uint16_t seq, int hops, + int csfailed, struct timeval *tv, char *from, + void (*pr_reply)(uint8_t *icmph, int cc)) +{ + int dupflag = 0; + long triptime = 0; + uint8_t *ptr = icmph + icmplen; + + ++a_ping_handle->ping_common.nreceived; + if(!csfailed) + acknowledge(a_ping_handle, seq); + + if(a_ping_handle->ping_common.timing && cc >= (int) (8 + sizeof(struct timeval))) { + struct timeval tmp_tv; + memcpy(&tmp_tv, ptr, sizeof(tmp_tv)); + + restamp: + tvsub(tv, &tmp_tv); + triptime = tv->tv_sec * 1000000 + tv->tv_usec; + if(triptime < 0) { + error(0, 0, "Warning: time of day goes back (%ldus), taking countermeasures", triptime); + triptime = 0; + if(!(a_ping_handle->ping_common.options & F_LATENCY)) { + gettimeofday(tv, NULL); + a_ping_handle->ping_common.options |= F_LATENCY; + goto restamp; + } + } + if(!csfailed) { + a_ping_handle->ping_common.tsum += triptime; + a_ping_handle->ping_common.tsum2 += (long long) triptime * (long long) triptime; + if(triptime < a_ping_handle->ping_common.tmin) + a_ping_handle->ping_common.tmin = triptime; + if(triptime > a_ping_handle->ping_common.tmax) + a_ping_handle->ping_common.tmax = triptime; + if(!a_ping_handle->ping_common.rtt) + a_ping_handle->ping_common.rtt = triptime * 8; + else + a_ping_handle->ping_common.rtt += triptime - a_ping_handle->ping_common.rtt / 8; + if(a_ping_handle->ping_common.options & F_ADAPTIVE) + update_interval(a_ping_handle); + } + } + + if(csfailed) { + ++a_ping_handle->ping_common.nchecksum; + --a_ping_handle->ping_common.nreceived; + } else if(rcvd_test(a_ping_handle, seq)) { + ++a_ping_handle->ping_common.nrepeats; + --a_ping_handle->ping_common.nreceived; + dupflag = 1; + } else { + rcvd_set(a_ping_handle, seq); + dupflag = 0; + } + a_ping_handle->ping_common.confirm = a_ping_handle->ping_common.confirm_flag; + + if(a_ping_handle->ping_common.options & F_QUIET) + return 1; + + if(a_ping_handle->ping_common.options & F_FLOOD) { + if(!csfailed) + write_stdout("\b \b", 3); + else + write_stdout("\bC", 2); + } else { + int i; + uint8_t *cp, *dp; + + print_timestamp(a_ping_handle); + log_printf("%d bytes from %s:", cc, from); + + if(pr_reply) + pr_reply(icmph, cc); + + if(hops >= 0) + log_printf(" ttl=%d", hops); + + if(cc < a_ping_handle->ping_common.datalen + 8) { + log_printf(" (truncated)\n"); + return 1; + } + if(a_ping_handle->ping_common.timing) { + if(triptime >= 100000) + log_printf(" time=%ld ms", (triptime + 500) / 1000); + else if(triptime >= 10000) + log_printf(" time=%ld.%01ld ms", (triptime + 50) / 1000, + ((triptime + 50) % 1000) / 100); + else if(triptime >= 1000) + log_printf(" time=%ld.%02ld ms", (triptime + 5) / 1000, + ((triptime + 5) % 1000) / 10); + else + log_printf(" time=%ld.%03ld ms", triptime / 1000, + triptime % 1000); + log_printf(" tsum=%d ", a_ping_handle->ping_common.tsum); + } + if(dupflag) + log_printf(" (DUP!)"); + if(csfailed) + log_printf(" (BAD CHECKSUM!)"); + + /* check the data */ + cp = ((unsigned char*) ptr) + sizeof(struct timeval); + dp = &a_ping_handle->ping_common.outpack[8 + sizeof(struct timeval)]; + for(i = sizeof(struct timeval); i < a_ping_handle->ping_common.datalen; ++i, ++cp, ++dp) { + if(*cp != *dp) { + log_printf("\nwrong data byte #%d should be 0x%x but was 0x%x", + i, *dp, *cp); + cp = (unsigned char*) ptr + sizeof(struct timeval); + for(i = sizeof(struct timeval); i < a_ping_handle->ping_common.datalen; ++i, ++cp) { + if((i % 32) == sizeof(struct timeval)) + log_printf("\n#%d\t", i); + log_printf("%x ", *cp); + } + break; + } + } + } + return 0; +} +#ifdef PING_DBG +static long llsqrt(long long a) +{ + long long prev = LLONG_MAX; + long long x = a; + + if (x > 0) { + while (x < prev) { + prev = x; + x = (x+(a/x))/2; + } + } + + return (long)x; +} +#endif + +/* + * finish -- + * Print out statistics, and give up. + */ +void finish(ping_handle_t *a_ping_handle) +{ + struct timeval tv = a_ping_handle->ping_common.cur_time; +#ifdef PING_DBG + char *comma = ""; +#endif + + tvsub(&tv, &a_ping_handle->ping_common.start_time); +#ifdef PING_DBG + putchar('\n'); + fflush(stdout); + printf("--- %s ping statistics ---\n", hostname); + printf("%ld packets transmitted, ", ntransmitted); + printf("%ld received", nreceived); + if (nrepeats) + log_printf(", +%ld duplicates", nrepeats); + if (nchecksum) + printf(", +%ld corrupted", nchecksum); + if (nerrors) + printf(", +%ld errors", nerrors); + if (ntransmitted) { +#ifdef USE_IDN + setlocale(LC_ALL, "C"); +#endif + printf(", %g%% packet loss", + (float) ((((long long)(ntransmitted - nreceived)) * 100.0) / + ntransmitted)); + printf(", time %ldms", 1000*tv.tv_sec+(tv.tv_usec+500)/1000); + } + putchar('\n'); +#endif + + if(a_ping_handle->ping_common.nreceived && a_ping_handle->ping_common.timing) { + + a_ping_handle->ping_common.tsum /= a_ping_handle->ping_common.nreceived + a_ping_handle->ping_common.nrepeats; + a_ping_handle->ping_common.tsum2 /= a_ping_handle->ping_common.nreceived + a_ping_handle->ping_common.nrepeats; +#ifdef PING_DBG + long tmdev; + tmdev = llsqrt(tsum2 - tsum * tsum); + printf("rtt min/avg/max/mdev = %ld.%03ld/%lu.%03ld/%ld.%03ld/%ld.%03ld ms", + (long)tmin/1000, (long)tmin%1000, + (unsigned long)(tsum/1000), (long)(tsum%1000), + (long)tmax/1000, (long)tmax%1000, + (long)tmdev/1000, (long)tmdev%1000 + ); + comma = ", "; +#endif + } +#ifdef PING_DBG + if (pipesize > 1) { + printf("%spipe %d", comma, pipesize); + comma = ", "; + } + if (nreceived && (!interval || (a_ping_handle->ping_common.options&(F_FLOOD|F_ADAPTIVE))) && ntransmitted > 1) { + int ipg = (1000000*(long long)tv.tv_sec+tv.tv_usec)/(ntransmitted-1); + printf("%sipg/ewma %d.%03d/%d.%03d ms", + comma, ipg/1000, ipg%1000, rtt/8000, (rtt/8)%1000); + } + putchar('\n'); + //exit(!nreceived || (deadline && nreceived < npackets)); +#endif +} + +void status(ping_handle_t *a_ping_handle) +{ + int loss = 0; + long tavg = 0; + + status_snapshot = 0; + + if(a_ping_handle->ping_common.ntransmitted) + loss = (((long long) (a_ping_handle->ping_common.ntransmitted - a_ping_handle->ping_common.nreceived)) * 100) / a_ping_handle->ping_common.ntransmitted; + + fprintf(stderr, "\r%ld/%ld packets, %d%% loss", a_ping_handle->ping_common.nreceived, a_ping_handle->ping_common.ntransmitted, loss); + + if(a_ping_handle->ping_common.nreceived && a_ping_handle->ping_common.timing) { + tavg = a_ping_handle->ping_common.tsum / (a_ping_handle->ping_common.nreceived + a_ping_handle->ping_common.nrepeats); + + fprintf(stderr, ", min/avg/ewma/max = %ld.%03ld/%lu.%03ld/%d.%03d/%ld.%03ld ms", + (long) a_ping_handle->ping_common.tmin / 1000, (long) a_ping_handle->ping_common.tmin % 1000, + tavg / 1000, tavg % 1000, + a_ping_handle->ping_common.rtt / 8000, (a_ping_handle->ping_common.rtt / 8) % 1000, + (long) a_ping_handle->ping_common.tmax / 1000, (long) a_ping_handle->ping_common.tmax % 1000 + ); + } + fprintf(stderr, "\n"); +} + +inline int is_ours(ping_handle_t *a_ping_handle, socket_st *sock, uint16_t id) { + return sock->socktype == SOCK_DGRAM || id == a_ping_handle->ping_common.ident; +} diff --git a/modules/net/iputils/tracepath.c b/modules/net/iputils/tracepath.c new file mode 100755 index 0000000000..2dce76420c --- /dev/null +++ b/modules/net/iputils/tracepath.c @@ -0,0 +1,783 @@ +/* + * tracepath.c + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> + */ + +#include <arpa/inet.h> +#include <errno.h> +#include <limits.h> +#include <time.h> +#include <linux/errqueue.h> +#include <linux/icmp.h> +#include <linux/icmpv6.h> +#include <linux/types.h> +#include <netdb.h> +#include <netinet/in.h> +#include <resolv.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/time.h> +#include <sys/uio.h> +#include <unistd.h> +//#include <glib.h> + +#include "iputils.h" + +#ifdef USE_IDN +# include <locale.h> +# ifndef AI_IDN +# define AI_IDN 0x0040 +# endif +# ifndef NI_IDN +# define NI_IDN 32 +# endif +# define getnameinfo_flags NI_IDN +#else +# define getnameinfo_flags 0 +#endif + +#ifndef SOL_IPV6 +# define SOL_IPV6 IPPROTO_IPV6 +#endif + +#ifndef IP_PMTUDISC_DO +# define IP_PMTUDISC_DO 3 +#endif +#ifndef IPV6_PMTUDISC_DO +# define IPV6_PMTUDISC_DO 3 +#endif + +enum { + MAX_PROBES = 10, + + MAX_HOPS_DEFAULT = 30, + MAX_HOPS_LIMIT = 255, + + HOST_COLUMN_SIZE = 52, + + HIS_ARRAY_SIZE = 64, + + DEFAULT_OVERHEAD_IPV4 = 28, + DEFAULT_OVERHEAD_IPV6 = 48, + + DEFAULT_MTU_IPV4 = 65535, + DEFAULT_MTU_IPV6 = 128000, + + DEFAULT_BASEPORT = 44444, + + ANCILLARY_DATA_LEN = 512, +}; + +struct hhistory { + int hops; + struct timeval sendtime; + struct timeval deltatime; + int hop; + char *host_namea; + char *host_nameb; +}; + +struct probehdr { + uint32_t ttl; + struct timeval tv; +}; + +struct run_state { + struct hhistory his[HIS_ARRAY_SIZE]; + int hisptr; + struct sockaddr_storage target; + struct addrinfo *ai; + int socket_fd; + socklen_t targetlen; + uint16_t base_port; + uint8_t ttl; + int max_hops; + int overhead; + int mtu; + void *pktbuf; + int hops_to; + int hops_from; + unsigned int + no_resolve :1, + show_both :1, + mapped :1; +}; + +/* + * All includes, definitions, struct declarations, and global variables are + * above. After this comment all you can find is functions. + */ + +static void data_wait(struct run_state const * const ctl) +{ + fd_set fds; + struct timeval tv = { + .tv_sec = 1, + .tv_usec = 0 + }; + + FD_ZERO(&fds); + FD_SET(ctl->socket_fd, &fds); + select(ctl->socket_fd + 1, &fds, NULL, NULL, &tv); +} + +static void print_host(struct run_state const * const ctl, char const * const a, + char const * const b) +{ + int plen; + + plen = log_printf("%s", a); + if(ctl->show_both) + plen += log_printf(" (%s)", b); + if(plen >= HOST_COLUMN_SIZE) + plen = HOST_COLUMN_SIZE - 1; + log_printf("%*s", HOST_COLUMN_SIZE - plen, ""); +} + +static int recverr(struct run_state * const ctl) +{ + ssize_t recv_size; + struct probehdr rcvbuf; + char cbuf[ANCILLARY_DATA_LEN]; + struct cmsghdr *cmsg; + struct sock_extended_err *e; + struct sockaddr_storage addr; + struct timeval tv; + struct timeval *rettv; + struct timeval *deltatv; + int slot = 0; + int rethops; + int sndhops; + int progress = -1; + int broken_router; + char hnamebuf[NI_MAXHOST] = ""; + struct iovec iov = { + .iov_base = &rcvbuf, + .iov_len = sizeof(rcvbuf) + }; + struct msghdr msg; + const struct msghdr reset = { + .msg_name = (uint8_t *) &addr, + .msg_namelen = sizeof(addr), + .msg_iov = &iov, + .msg_iovlen = 1, + .msg_control = cbuf, + .msg_controllen = sizeof(cbuf), + 0 + }; + + restart: + memset(&rcvbuf, -1, sizeof(rcvbuf)); + msg = reset; + + gettimeofday(&tv, NULL); + recv_size = recvmsg(ctl->socket_fd, &msg, MSG_ERRQUEUE); + if(recv_size < 0) { + if(errno == EAGAIN) + return progress; + goto restart; + } + + progress = ctl->mtu; + + rethops = -1; + sndhops = -1; + e = NULL; + rettv = NULL; + deltatv = NULL; + broken_router = 0; + + slot = -ctl->base_port; + switch (ctl->ai->ai_family) { + case AF_INET6: + slot += ntohs(((struct sockaddr_in6 *) &addr)->sin6_port); + break; + case AF_INET: + slot += ntohs(((struct sockaddr_in *) &addr)->sin_port); + break; + } + + if(slot >= 0 && slot < (HIS_ARRAY_SIZE - 1) && ctl->his[slot].hops) { + sndhops = ctl->his[slot].hops; + rettv = &ctl->his[slot].sendtime; + deltatv = &ctl->his[slot].deltatime; + ctl->his[slot].hop = sndhops; + ctl->his[slot].hops = 0; + } + if(recv_size == sizeof(rcvbuf)) { + if(rcvbuf.ttl == 0 || rcvbuf.tv.tv_sec == 0) + broken_router = 1; + else { + sndhops = rcvbuf.ttl; + rettv = &rcvbuf.tv; + } + } + + for(cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { + switch (cmsg->cmsg_level) { + case SOL_IPV6: + switch (cmsg->cmsg_type) { + case IPV6_RECVERR: + e = (struct sock_extended_err *) CMSG_DATA(cmsg); + break; + case IPV6_HOPLIMIT: + #ifdef IPV6_2292HOPLIMIT + case IPV6_2292HOPLIMIT: + #endif + memcpy(&rethops, CMSG_DATA(cmsg), sizeof(rethops)); + break; + default: + log_printf("cmsg6:%d\n ", cmsg->cmsg_type); + } + break; + case SOL_IP: + switch (cmsg->cmsg_type) { + case IP_RECVERR: + e = (struct sock_extended_err *) CMSG_DATA(cmsg); + break; + case IP_TTL: + rethops = *(uint8_t *) CMSG_DATA(cmsg); + break; + default: + log_printf("cmsg4:%d\n ", cmsg->cmsg_type); + } + } + } + if(e == NULL) { + log_printf("no info\n"); + return 0; + } + if(e->ee_origin == SO_EE_ORIGIN_LOCAL) + log_printf("%2d?: %-32s ", ctl->ttl, "[LOCALHOST]"); + else if(e->ee_origin == SO_EE_ORIGIN_ICMP6 || + e->ee_origin == SO_EE_ORIGIN_ICMP) { + char abuf[NI_MAXHOST]; + struct sockaddr *sa = (struct sockaddr *) (e + 1); + socklen_t salen; + + if(sndhops > 0) + log_printf("%2d: ", sndhops); + else + log_printf("%2d?: ", ctl->ttl); + + switch (sa->sa_family) { + case AF_INET6: + salen = sizeof(struct sockaddr_in6); + break; + case AF_INET: + salen = sizeof(struct sockaddr_in); + break; + default: + salen = 0; + } + + if(ctl->no_resolve || ctl->show_both) + { + if(getnameinfo(sa, salen, abuf, sizeof(abuf), NULL, 0, + NI_NUMERICHOST)) + strcpy(abuf, "???"); + ctl->his[slot].host_namea = strdup(abuf); + } else + abuf[0] = 0; + + if(!ctl->no_resolve || ctl->show_both) + { + fflush(stdout); + if(getnameinfo(sa, salen, hnamebuf, sizeof hnamebuf, NULL, 0, + getnameinfo_flags)) + strcpy(hnamebuf, "???"); + ctl->his[slot].host_nameb = strdup(hnamebuf); + } else + hnamebuf[0] = 0; + + if(ctl->no_resolve) { + print_host(ctl, abuf, hnamebuf); + } + else { + print_host(ctl, hnamebuf, abuf); + } + } + + if(rettv) { + struct timeval res; + + timersub(&tv, rettv, &res); + if(deltatv) + memcpy(deltatv, &res, sizeof(struct timeval)); + log_printf("%3ld.%03ldms ", res.tv_sec * 1000 + res.tv_usec / 1000, res.tv_usec % 1000); + if(broken_router) + log_printf("(This broken router returned corrupted payload) "); + } + + if(rethops <= 64) + rethops = 65 - rethops; + else if(rethops <= 128) + rethops = 129 - rethops; + else + rethops = 256 - rethops; + + //log_printf("ERROR=%d ", e->ee_errno); + switch (e->ee_errno) { + case ETIMEDOUT: + log_printf("\n"); + break; + case EMSGSIZE: + log_printf("pmtu %d\n", e->ee_info); + ctl->mtu = e->ee_info; + progress = ctl->mtu; + break; + case ECONNREFUSED: + log_printf("reached\n"); + ctl->hops_to = sndhops < 0 ? ctl->ttl : sndhops; + ctl->hops_from = rethops; + return 0; + case EPROTO: + log_printf("!P\n"); + return 0; + case EHOSTUNREACH: + if((e->ee_origin == SO_EE_ORIGIN_ICMP && + e->ee_type == ICMP_TIME_EXCEEDED && + e->ee_code == ICMP_EXC_TTL) || + (e->ee_origin == SO_EE_ORIGIN_ICMP6 && + e->ee_type == ICMPV6_TIME_EXCEED && + e->ee_code == ICMPV6_EXC_HOPLIMIT)) { + if(rethops >= 0) { + if(sndhops >= 0 && rethops != sndhops) + log_printf("asymm %2d ", rethops); + else if(sndhops < 0 && rethops != ctl->ttl) + log_printf("asymm %2d ", rethops); + } + //log_printf("hops=->%2d, <-%2d ", sndhops, rethops); + log_printf("\n"); + break; + } + printf("!H\n"); + return 0; + case ENETUNREACH: + log_printf("!N\n"); + return 0; + case EACCES: + log_printf("!A\n"); + return 0; + default: + printf("\n"); + errno = e->ee_errno; + perror("NET ERROR"); + return 0; + } + goto restart; + return 0; +} + +static int probe_ttl(struct run_state * const ctl) +{ + int i; + struct probehdr *hdr = ctl->pktbuf; + + memset(ctl->pktbuf, 0, ctl->mtu); + restart: + for(i = 0; i < MAX_PROBES; i++) { + int res; + + hdr->ttl = ctl->ttl; + switch (ctl->ai->ai_family) { + case AF_INET6: + ((struct sockaddr_in6 *) &ctl->target)->sin6_port = + htons(ctl->base_port + ctl->hisptr); + break; + case AF_INET: + ((struct sockaddr_in *) &ctl->target)->sin_port = + htons(ctl->base_port + ctl->hisptr); + break; + } + gettimeofday(&hdr->tv, NULL); + ctl->his[ctl->hisptr].hops = ctl->ttl; + ctl->his[ctl->hisptr].sendtime = hdr->tv; + if(sendto(ctl->socket_fd, ctl->pktbuf, ctl->mtu - ctl->overhead, 0, + (struct sockaddr *) &ctl->target, ctl->targetlen) > 0) + break; + res = recverr(ctl); + ctl->his[ctl->hisptr].hops = 0; + if(res == 0) + return 0; + if(res > 0) + goto restart; + } + ctl->hisptr = (ctl->hisptr + 1) & (HIS_ARRAY_SIZE - 1); + + if(i < MAX_PROBES) { + data_wait(ctl); + if(recv(ctl->socket_fd, ctl->pktbuf, ctl->mtu, MSG_DONTWAIT) > 0) { + log_printf("%2d?: reply received 8)\n", ctl->ttl); + return 0; + } + return recverr(ctl); + } + + log_printf("%2d: send failed\n", ctl->ttl); + return 0; +} + +static void usage(void) +{ + fprintf(stderr, + "\nUsage\n" + " tracepath [options] <destination>\n" + "\nOptions:\n" + " -4 use IPv4\n" + " -6 use IPv6\n" + " -b print both name and ip\n" + " -l <length> use packet <length>\n" + " -m <hops> use maximum <hops>\n" + " -n no dns name resolution\n" + " -p <port> use destination <port>\n" + " -V print version and exit\n" + " <destination> dns name or ip address\n" + "\nFor more details see tracepath(8).\n"); + exit(-1); +} + +int tracepath_main(int argc, char **argv, struct run_state *ctl) +{ + int ret = -1; + struct addrinfo hints = { + .ai_family = AF_UNSPEC, + .ai_socktype = SOCK_DGRAM, + .ai_protocol = IPPROTO_UDP, +#ifdef USE_IDN + .ai_flags = AI_IDN | AI_CANONNAME, +#endif + }; + struct addrinfo *result; + int ch; + int status; + int on; + char *p; + char pbuf[NI_MAXSERV]; + +#ifdef USE_IDN + setlocale(LC_ALL, ""); +#endif + + /* Support being called using `tracepath4` or `tracepath6` symlinks */ + if(argv[0][strlen(argv[0]) - 1] == '4') + hints.ai_family = AF_INET; + else if(argv[0][strlen(argv[0]) - 1] == '6') + hints.ai_family = AF_INET6; + + while((ch = getopt(argc, argv, "46nbh?l:m:p:V")) != EOF) { + switch (ch) { + case '4': + if(hints.ai_family == AF_INET6) { + fprintf(stderr, + "tracepath: Only one -4 or -6 option may be specified\n"); + return -1; //exit(2); + } + hints.ai_family = AF_INET; + break; + case '6': + if(hints.ai_family == AF_INET) { + fprintf(stderr, + "tracepath: Only one -4 or -6 option may be specified\n"); + return -1; //exit(2); + } + hints.ai_family = AF_INET6; + break; + case 'n': + ctl->no_resolve = 1; + break; + case 'b': + ctl->show_both = 1; + break; + case 'l': + if((ctl->mtu = atoi(optarg)) <= ctl->overhead) { + fprintf(stderr, + "Error: pktlen must be > %d and <= %d.\n", + ctl->overhead, INT_MAX); + return -1; //exit(1); + } + break; + case 'm': + ctl->max_hops = atoi(optarg); + if(ctl->max_hops < 0 || ctl->max_hops > MAX_HOPS_LIMIT) { + fprintf(stderr, + "Error: max hops must be 0 .. %d (inclusive).\n", + MAX_HOPS_LIMIT); + return -1; //exit(1); + } + break; + case 'p': + ctl->base_port = atoi(optarg); + break; + case 'V': + printf(IPUTILS_VERSION("tracepath")); + return 0; + default: + usage(); + } + } + + argc -= optind; + argv += optind; + optind = 0; + + if(argc != 1) + usage(); + + /* Backward compatibility */ + if(!ctl->base_port) { + p = strchr(argv[0], '/'); + if(p) { + *p = 0; + ctl->base_port = atoi(p + 1); + } else + ctl->base_port = DEFAULT_BASEPORT; + } + sprintf(pbuf, "%u", ctl->base_port); + + status = getaddrinfo(argv[0], pbuf, &hints, &result); + if(status) { + fprintf(stderr, "tracepath: %s: %s\n", argv[0], + gai_strerror(status)); + return -EADDRNOTAVAIL;//exit(1); + } + + for(ctl->ai = result; ctl->ai; ctl->ai = ctl->ai->ai_next) { + if(ctl->ai->ai_family != AF_INET6 && ctl->ai->ai_family != AF_INET) + continue; + ctl->socket_fd = socket(ctl->ai->ai_family, ctl->ai->ai_socktype, ctl->ai->ai_protocol); + if(ctl->socket_fd < 0) + continue; + memcpy(&ctl->target, ctl->ai->ai_addr, ctl->ai->ai_addrlen); + ctl->targetlen = ctl->ai->ai_addrlen; + break; + } + if(ctl->socket_fd < 0) { + perror("socket/connect"); + return -ESOCKTNOSUPPORT;//exit(1); + } + + switch (ctl->ai->ai_family) { + case AF_INET6: + ctl->overhead = DEFAULT_OVERHEAD_IPV6; + if(!ctl->mtu) + ctl->mtu = DEFAULT_MTU_IPV6; + if(ctl->mtu <= ctl->overhead) + goto pktlen_error; + + on = IPV6_PMTUDISC_DO; + if(setsockopt(ctl->socket_fd, SOL_IPV6, IPV6_MTU_DISCOVER, &on, sizeof(on)) && + (on = IPV6_PMTUDISC_DO, setsockopt(ctl->socket_fd, SOL_IPV6, + IPV6_MTU_DISCOVER, &on, sizeof(on)))) { + perror("IPV6_MTU_DISCOVER"); + return -2;//exit(1); + } + on = 1; + if(setsockopt(ctl->socket_fd, SOL_IPV6, IPV6_RECVERR, &on, sizeof(on))) { + perror("IPV6_RECVERR"); + return -3;//exit(1); + } + if(setsockopt(ctl->socket_fd, SOL_IPV6, IPV6_HOPLIMIT, &on, sizeof(on)) + #ifdef IPV6_RECVHOPLIMIT + && setsockopt(ctl->socket_fd, SOL_IPV6, IPV6_2292HOPLIMIT, &on, sizeof(on)) + #endif + ) { + perror("IPV6_HOPLIMIT"); + return -4;//exit(1); + } + if(!IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 * )&ctl->target)->sin6_addr))) + break; + ctl->mapped = 1; + /*FALLTHROUGH*/ + case AF_INET: + ctl->overhead = DEFAULT_OVERHEAD_IPV4; + if(!ctl->mtu) + ctl->mtu = DEFAULT_MTU_IPV4; + if(ctl->mtu <= ctl->overhead) + goto pktlen_error; + + on = IP_PMTUDISC_DO; + if(setsockopt(ctl->socket_fd, SOL_IP, IP_MTU_DISCOVER, &on, sizeof(on))) { + perror("IP_MTU_DISCOVER"); + return -5;//exit(1); + } + on = 1; + if(setsockopt(ctl->socket_fd, SOL_IP, IP_RECVERR, &on, sizeof(on))) { + perror("IP_RECVERR"); + return -6;//exit(1); + } + if(setsockopt(ctl->socket_fd, SOL_IP, IP_RECVTTL, &on, sizeof(on))) { + perror("IP_RECVTTL"); + return -7;//exit(1); + } + } + + ctl->pktbuf = malloc(ctl->mtu); + if(!ctl->pktbuf) { + perror("malloc"); + return -8; //exit(1); + } + +// struct sockaddr sa; +// int salen6 = sizeof(struct sockaddr_in6); +// int salen = sizeof(struct sockaddr_in); + char target_ip[NI_MAXHOST]; + char *target_name = argv[0]; + memset(&target_ip, 0, sizeof(target_ip)); + getnameinfo((struct sockaddr *) &ctl->target, ctl->targetlen, target_ip, sizeof(target_ip), NULL, 0, + NI_NUMERICHOST); + log_printf("START target_name=%s target_ip=%s\n", target_name, target_ip); + + for(ctl->ttl = 1; ctl->ttl <= ctl->max_hops; ctl->ttl++) { + int res; + int i; + + on = ctl->ttl; + switch (ctl->ai->ai_family) { + case AF_INET6: + if(setsockopt(ctl->socket_fd, SOL_IPV6, IPV6_UNICAST_HOPS, &on, sizeof(on))) { + perror("IPV6_UNICAST_HOPS"); + return -9; //exit(1); + } + if(!ctl->mapped) + break; + /*FALLTHROUGH*/ + case AF_INET: + if(setsockopt(ctl->socket_fd, SOL_IP, IP_TTL, &on, sizeof(on))) { + perror("IP_TTL"); + return -10; //exit(1); + } + } + + restart: + for(i = 0; i < 2; i++) { + int old_mtu; + + old_mtu = ctl->mtu; + res = probe_ttl(ctl); + if(ctl->mtu != old_mtu) + goto restart; + if(res == 0) + goto done; + if(res > 0) + break; + } + // if already find need name, make ret>=0 and break + { + int i = ctl->hisptr - 1; + //for(int i = 0; i < MAX_HOPS_DEFAULT; i++) + { + char *host_namea = (ctl->his[i].host_namea); + char *host_nameb = (ctl->his[i].host_nameb); + if(host_namea) { + if(!strcmp(host_namea, target_name) || !strcmp(host_namea, target_ip)) { + ctl->ttl = ctl->max_hops; + ret = i; + break; + } + } + if(host_nameb) { + if(!strcmp(host_nameb, target_name) || !strcmp(host_nameb, target_ip)) { + ctl->ttl = ctl->max_hops; + ret = i; + break; + } + } + } + } + if(res < 0) + log_printf("%2d: no reply\n", ctl->ttl); + } + log_printf(" Too many hops: pmtu %d\n", ctl->mtu); + + done: + freeaddrinfo(result); + + log_printf(" Resume: pmtu %d ", ctl->mtu); + if(ctl->hops_to >= 0) + { + ret = ctl->hisptr - 1; + log_printf("hops %d ", ctl->hops_to); + } + if(ctl->hops_from >= 0) + log_printf("back %d ", ctl->hops_from); + log_printf("\n"); + return ret; //exit(0); + + pktlen_error: + fprintf(stderr, "Error: pktlen must be > %d and <= %d\n", + ctl->overhead, INT_MAX); + return -1; //exit(1); +} + +/** + * Tracepath host + * + * @addr[in] host name or IP address + * @hops[out] hops count + * @time_usec[out] latency in microseconds + * @return 0 Ok, -1 error + */ +int tracepath_util(const char *addr, int *hops, int *time_usec) +{ + int type = 4; // 4 or 6 + int total_hops = 0; + long int total_time_usec = 0; // latency in microseconds + int argc = 4; + const char *argv[argc]; + if(type != 4) + argv[0] = "tracepath6"; + else + argv[0] = "tracepath4"; + argv[1] = "-b"; // print both name and ip + argv[2] = "-m 26"; // -n -m 16 + argv[3] = addr; + struct run_state ctl = { + .max_hops = MAX_HOPS_DEFAULT, + .hops_to = -1, + .hops_from = -1, + 0 + }; + int ret = tracepath_main(argc, (char**) argv, &ctl); + for(int i = 0; i < MAX_HOPS_DEFAULT; i++) { + free(ctl.his[i].host_namea); + free(ctl.his[i].host_nameb); + } + if(ret >= 0) + { + struct timeval *deltatime = &(ctl.his[ret].deltatime); + total_hops = ctl.his[ret].hop; + total_time_usec = deltatime->tv_sec * 1000000 + deltatime->tv_usec; + } + else + for(int i = 0; i < MAX_HOPS_DEFAULT; i++) { + struct timeval *deltatime = &(ctl.his[i].deltatime); + if(ctl.his[i].hop) { //if(!ctl.his[i].hops && (deltatime->tv_sec > 0 || deltatime->tv_usec > 0)) { + total_hops = ctl.his[i].hop; + total_time_usec = deltatime->tv_sec * 1000000 + deltatime->tv_usec; + } + /*if(ctl.his[i].hop > 0) + { + char *host_name = (ctl.his[i].host_name) ? ctl.his[i].host_name : "-"; + printf("%d %d: %s %ld\n", ctl.his[i].hops, ctl.his[i].hop, host_name, + deltatime->tv_sec * 1000000 + deltatime->tv_usec); + }*/ + } + if(hops) { + *hops = total_hops; + } + if(time_usec) { + *time_usec = total_time_usec; + } + return (ret >= 0) ? 0 : ret; + +} + diff --git a/modules/net/iputils/traceroute/as_lookups.c b/modules/net/iputils/traceroute/as_lookups.c new file mode 100644 index 0000000000..8731803758 --- /dev/null +++ b/modules/net/iputils/traceroute/as_lookups.c @@ -0,0 +1,128 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. +*/ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <ctype.h> +#include <unistd.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netdb.h> + +#include "traceroute.h" + + +#define DEF_RADB_SERVER "whois.radb.net" +#define DEF_RADB_SERVICE "nicname" + + +static sockaddr_any ra_addr = {{ 0, }, }; +static char ra_buf[512] = { 0, }; + + +const char *get_as_path (const char *query) { + int sk, n; + FILE *fp; + char buf[1024]; + int prefix = 0, best_prefix = 0; + char *rb, *re = &ra_buf[sizeof (ra_buf) / sizeof (*ra_buf) - 1]; + + + if (!ra_addr.sa.sa_family) { + const char *server, *service; + struct addrinfo *res; + int ret; + + server = getenv ("RA_SERVER"); + if (!server) server = DEF_RADB_SERVER; + + service = getenv ("RA_SERVICE"); + if (!service) service = DEF_RADB_SERVICE; + + + ret = getaddrinfo (server, service, NULL, &res); + if (ret) { + fprintf (stderr, "%s/%s: %s\n", server, service, + gai_strerror(ret)); + exit (2); + } + + memcpy (&ra_addr, res->ai_addr, res->ai_addrlen); + + freeaddrinfo (res); + } + + + sk = socket (ra_addr.sa.sa_family, SOCK_STREAM, 0); + if (sk < 0) error ("socket"); + + if (connect (sk, &ra_addr.sa, sizeof (ra_addr)) < 0) + goto err_sk; + + n = snprintf (buf, sizeof (buf), "%s\r\n", query); + if (n >= (int)sizeof (buf)) goto err_sk; + + if (write (sk, buf, n) < n) + goto err_sk; + + fp = fdopen (sk, "r"); + if (!fp) goto err_sk; + + + strcpy (ra_buf, "*"); + rb = ra_buf; + + while (fgets (buf, sizeof (buf), fp) != NULL) { + + if (!strncmp (buf, "route:", sizeof ("route:") - 1) || + !strncmp (buf, "route6:", sizeof ("route6:") - 1) + ) { + char *p = strchr (buf, '/'); + + if (p) prefix = strtoul (++p, NULL, 10); + else prefix = 0; /* Hmmm... */ + + } + else if (!strncmp (buf, "origin:", sizeof ("origin:") -1)) { + char *p, *as; + + p = buf + (sizeof ("origin:") - 1); + + while (isspace (*p)) p++; + as = p; + while (*p && !isspace (*p)) p++; + *p = '\0'; + + if (prefix > best_prefix) { + best_prefix = prefix; + + rb = ra_buf; + while (rb < re && (*rb++ = *as++)) ; + } + else if (prefix == best_prefix) { + char *q = strstr (ra_buf, as); + + if (!q || (*(q += strlen (as)) != '\0' && *q != '/')) { + if (rb > ra_buf) rb[-1] = '/'; + while (rb < re && (*rb++ = *as++)) ; + } + } + /* else just ignore it */ + } + } + + fclose (fp); + + return ra_buf; + + +err_sk: + close (sk); + return "!!"; +} diff --git a/modules/net/iputils/traceroute/clif.c b/modules/net/iputils/traceroute/clif.c new file mode 100644 index 0000000000..4380e8ecd0 --- /dev/null +++ b/modules/net/iputils/traceroute/clif.c @@ -0,0 +1,1284 @@ +/* + Copyright (c) 2000, 2003 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: LGPL v2.1 or any later + + See COPYING.LIB for the status of this software. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdarg.h> + +#include "../iputils.h" +#include "clif.h" + +#if 1 /* Bad idea, anyway... */ +#define MAX_ARGC_NUMBER 256 +typedef unsigned char _CLIF_index; +#else +#define MAX_ARGC_NUMBER (4096 / 5 + 1) /* POSIX ARG_MAX >= 4096 ... */ +typedef unsigned short _CLIF_index; +#endif + +/* This is needed for some print info functions. + This is ugly for thread-safe (is it really actual on program invoking?), + and for several CLIF_parse_cmdline invoking... But foo on this. Yeah... + */ +static struct { + int argc; + char **argv; + CLIF_option *option_list; + CLIF_argument *argument_list; + unsigned int parse_flags; +} curr = { 0, }; + +static void err_report(const char *format, ...) { + va_list ap; + + if(curr.parse_flags & CLIF_SILENT) + return; + + va_start(ap, format); + + vfprintf(stderr, format, ap); + + va_end(ap); + + fprintf(stderr, "\n"); + + return; +} + +/* info generation stuff... */ + +#define SHORT_PLUS_MINUS "+/-" +#define LONG_PLUS_MINUS "++/--" +#define EXCL_DLM " | " + +static char *show_short(const CLIF_option *optn) { + static char buf[80]; + char *p = buf; + unsigned int flags = optn->flags | curr.parse_flags; + + if(optn->function_plus) { + if(!optn->function) + *p++ = '+'; + else { + strcpy(p, SHORT_PLUS_MINUS); + p += sizeof(SHORT_PLUS_MINUS) - 1; + } + } else + *p++ = '-'; + + *p++ = optn->short_opt[0]; + + if(optn->arg_name) { + char *endp = buf + sizeof(buf) - sizeof(",...]"); + const char *s; + + if(!(flags & _CLIF_STRICT_JOIN_ARG)) + *p++ = ' '; + if(flags & CLIF_OPTARG) + *p++ = '['; + + s = optn->arg_name; + while(*s && p < endp) + *p++ = *s++; + + if(flags & CLIF_SEVERAL) { + strcpy(p, ",..."); + p += sizeof(",...") - 1; /* last '\0' ... */ + } + + if(flags & CLIF_OPTARG) + *p++ = ']'; + } + + *p = '\0'; + + return buf; +} + +static char *show_long(const CLIF_option *optn) { + static char buf[80]; + char *p = buf; + char *endp; + const char *s; + unsigned int flags = optn->flags | curr.parse_flags; + + if(!(flags & _CLIF_STRICT_KEYWORD)) { + + if(!(flags & _CLIF_STRICT_ONEDASH)) { + if(optn->function_plus) { + if(!optn->function) { + *p++ = '+'; + *p++ = '+'; + } + else { + strcpy(p, LONG_PLUS_MINUS); + p += sizeof(LONG_PLUS_MINUS) - 1; + } + } else { + *p++ = '-'; + *p++ = '-'; + } + + } else { + if(optn->function_plus) { + if(!optn->function) + *p++ = '+'; + else { + strcpy(p, SHORT_PLUS_MINUS); + p += sizeof(SHORT_PLUS_MINUS) - 1; + } + } else + *p++ = '-'; + } + } + + s = optn->long_opt; + endp = buf + sizeof(buf) - sizeof(" ["); + while(*s && p < endp) + *p++ = *s++; + + if(optn->arg_name) { + + if(flags & _CLIF_STRICT_NOEQUAL) { + *p++ = ' '; + if(flags & CLIF_OPTARG) + *p++ = '['; + } else { + if(flags & CLIF_OPTARG) + *p++ = '['; + *p++ = '='; + } + + s = optn->arg_name; + endp = buf + sizeof(buf) - sizeof(",...]"); + while(*s && p < endp) + *p++ = *s++; + + if(flags & CLIF_SEVERAL) { + strcpy(p, ",..."); + p += sizeof(",...") - 1; /* last '\0' ... */ + } + + if(flags & CLIF_OPTARG) + *p++ = ']'; + } + + *p = '\0'; + + return buf; +} + +static char *show_excl(const CLIF_option *option_list, int *cnt_p) { + static char buf[256]; + const CLIF_option *optn; + char *p = buf; + char *endp = buf + sizeof(buf) - sizeof(EXCL_DLM); + int excl_cnt = 0; + + *p = '\0'; + if(cnt_p) + *cnt_p = 0; + if(!option_list) + return buf; + + for(optn = option_list; optn->short_opt || optn->long_opt; optn++) { + char *s; + + if(!(optn->flags & CLIF_EXCL)) + continue; + + if(optn->short_opt) + s = show_short(optn); + else + s = show_long(optn); + + if(excl_cnt > 0) { /* i.e., second etc... */ + strcpy(p, EXCL_DLM); + p += sizeof(EXCL_DLM) - 1; + } + + while(*s && p < endp) + *p++ = *s++; + + excl_cnt++; + } + + *p = '\0'; + + if(cnt_p) + *cnt_p = excl_cnt; + + return buf; +} + +static int is_keyword(const CLIF_option *optn) { + unsigned int flags = optn->flags | curr.parse_flags; + + return (flags & _CLIF_STRICT_KEYWORD) != 0; +} + +static void err_bad_opt(const char *arg, char c, int n) { + char sym = (*arg == '+') ? '+' : '-'; + + if(c) + err_report("Bad option `%c%c' (argc %d)", sym, c, n); + else { + char *p = strchr(arg, '='); + const char *type = (*arg == sym) ? "option" : "keyword"; + + if(p) + err_report("Bad %s `%s' (with arg `%s') (argc %d)", + type, arg, p + 1, n); + else + err_report("Bad %s `%s' (argc %d)", type, arg, n); + } +} + +static void err_bad_arg(const CLIF_option *optn, char c, int n) { + CLIF_option tmp = *optn; + char ss[80]; + char *s; + + tmp.arg_name = NULL; + + if(c) { + s = show_short(&tmp); /* always without arg... */ + strncpy(ss, s, sizeof(ss)); + s = show_short(optn); + } else { + s = show_long(&tmp); /* always without arg... */ + strncpy(ss, s, sizeof(ss)); + s = show_long(optn); + } + + err_report("%s `%s' (argc %d) requires an argument: `%s'", + (c || !is_keyword(optn)) ? "Option" : "Keyword", ss, n, s); +} + +static void err_bad_res(const CLIF_option *optn, char c, + const char *opt_arg, int n) { + CLIF_option tmp = *optn; + char *ss; + const char *type; + + tmp.arg_name = NULL; + + if(c) { + ss = show_short(&tmp); + type = "option"; + } else { + ss = show_long(&tmp); + type = is_keyword(optn) ? "keyword" : "option"; + } + + if(optn->arg_name) + err_report("Cannot handle `%s' %s with arg `%s' (argc %d)", + ss, type, opt_arg, n); + else + err_report("Cannot handle `%s' %s (argc %d)", ss, type, n); +} + +static void err_bad_excl(const CLIF_option *optn, char c, int n) { + CLIF_option tmp = *optn; + char *ss; + char *excl = show_excl(curr.option_list, 0); + /* Note: show_(short|long)() nested!!! */ + + tmp.arg_name = NULL; + + if(c) + ss = show_short(&tmp); + else + ss = show_long(&tmp); + + err_report("%s `%s' (argc %d): Only one of:\n %s\n" + "may be specified.", + (c || !is_keyword(optn)) ? "Option" : "Keyword", + ss, n, excl); +} + +static CLIF_option *find_long(char *arg, char **arg_p, + unsigned int match, unsigned int nomatch) { + CLIF_option *optn; + CLIF_option *abbrev = NULL; + char *abbrev_arg = NULL; + int abbrev_found = 0; + + for(optn = curr.option_list; + optn->short_opt || optn->long_opt; + optn++ + ) { + char *a; + const char *o; + unsigned int flags; + + if(!optn->long_opt) + continue; + + flags = curr.parse_flags | optn->flags; + if(flags & nomatch) + continue; + if(match && !(flags & match)) + continue; /* XXX: optimize it */ + + for(a = arg, o = optn->long_opt; *o && *a == *o; a++, o++) + ; + + if(*a == '\0' || + (*a == '=' && optn->arg_name && !(flags & _CLIF_STRICT_NOEQUAL)) + ) { /* looks like end of option... */ + + if(!*o) { /* explicit match found */ + if(*a == '=' && arg_p) + *arg_p = a + 1; + return optn; + } + + if((flags & CLIF_ABBREV) && + (a - arg >= CLIF_MIN_ABBREV) + ) { + if(!abbrev_found) { + abbrev_found = 1; + abbrev = optn; + if(*a == '=') + abbrev_arg = a + 1; + } else + /* several possibility case... */ + abbrev = NULL; + } + } + } + + if(abbrev) { /* implicit match found */ + if(abbrev_arg && arg_p) + *arg_p = abbrev_arg; + return abbrev; + } else + /* no match found */ + return NULL; +} + +static int check_sym(const CLIF_option *optn, char sym) { + + if(sym == '+') { + if(!optn->function_plus) + return -1; + } + else if(sym == '-') { + if(!optn->function && optn->function_plus) + return -1; + } + + return 0; +} + +static int call_function(CLIF_option *optn, char *opt_arg, char sym) { + int (*function)(CLIF_option *, char *); + + function = (sym == '+') ? optn->function_plus : optn->function; + + if(!function) + return 0; + + if(opt_arg && ((optn->flags | curr.parse_flags) & CLIF_SEVERAL)) { + char tmp[80]; + char *t; + char *endt = tmp + sizeof(tmp); + + while(*opt_arg) { + + t = tmp; + while(t < endt && *opt_arg && + *opt_arg != ' ' && *opt_arg != '\t' && *opt_arg != ',' + ) + *t++ = *opt_arg++; + + if(t >= endt) + return -1; + + *t = '\0'; + + if(function(optn, tmp) < 0) + return -1; + + while(*opt_arg == ' ' || *opt_arg == '\t' || *opt_arg == ',') + opt_arg++; + } + + return 0; + } + + return function(optn, opt_arg); +} + +int CLIF_parse_cmdline (int argc, char *argv[], + CLIF_option *option_list, + CLIF_argument *argument_list, + unsigned int parse_flags){ +int i, j; +CLIF_option *optn; +CLIF_argument *argm; +int num_args = 0; +int num_argm = 0, strict_beg = 0, strict_end = 0; +_CLIF_index arg_n[MAX_ARGC_NUMBER]; +unsigned int dirty_flags = 0; +int dirty_plus = 0; +int exclusive_cnt = 0; +int posix = getenv ("POSIXLY_CORRECT") != NULL || +(parse_flags & CLIF_POSIX); + +curr.argc = argc; +curr.argv = argv; +curr.option_list = option_list; +curr.argument_list = argument_list; +curr.parse_flags = parse_flags; + +if (argc <= 1 && (parse_flags & CLIF_HELP_EMPTY)) { + CLIF_current_help (); + exit (0); +} + +/* Scan argument_list for check and some info. */ + +if (argument_list) { + enum stages {STRICT_BEG, OPTIONAL, STRICT_END}; + int stage = STRICT_BEG; + + for (argm = argument_list; argm->name; argm++) { + + if (argm->flags & CLIF_STRICT) { + + if (stage == STRICT_BEG) strict_beg++; + else if (stage == OPTIONAL) { + stage = STRICT_END; + strict_end++; + } + else if (stage == STRICT_END) + strict_end++; + } else { + if (stage == STRICT_BEG) stage = OPTIONAL; + else if (stage == STRICT_END) { + err_report ("Incorrect argument list set in program " + "source: more than one optional area."); + return -1; + } + } + + num_argm++; + } +} + +/* Scan option_list for some info. */ +if (option_list) { + + dirty_flags = parse_flags; + + for (optn = option_list; + optn->short_opt || optn->long_opt; + optn++ + ) { + dirty_flags |= optn->flags; + if (optn->function_plus) dirty_plus = 1; + } +} + +if (dirty_flags & CLIF_EXCL) +exclusive_cnt = 1; /* only one is allowed... */ + +/* Go ! Store arguments, parse options. */ + +for (i = 1; i < argc; i++) { + char *arg = argv[i]; + char *opt_arg = NULL; + char sym = '-'; + + if (!option_list) + goto handle_arg; + + if (*arg == '+' && dirty_plus) + sym = '+'; + + if (*arg != sym) { /* argument or keyword */ + + if (dirty_flags & CLIF_MAY_KEYWORD) { + optn = find_long (arg, &opt_arg, CLIF_MAY_KEYWORD, 0); + if (optn) goto long_found; + } + + if (num_args == 0 && (parse_flags & CLIF_FIRST_GROUP)) { + /* ugly... */ + parse_flags &= ~CLIF_FIRST_GROUP; + dirty_flags &= ~CLIF_FIRST_GROUP; /* to be correct */ + + goto handle_short; + } + + /* else it is an argument */ + goto handle_arg; + + } + else if (*++arg == sym) { /* `--' - long option */ + arg++; + + if (*arg == sym || /* `---' - let it be not option... */ + (parse_flags & (_CLIF_STRICT_KEYWORD|_CLIF_STRICT_ONEDASH)) + ) { + arg -= 2; + goto handle_arg; /* not option anyway */ + } + + optn = find_long (arg, &opt_arg, 0, + _CLIF_STRICT_KEYWORD | _CLIF_STRICT_ONEDASH); + if (optn) goto long_found; + + /* XXX: May be allow only for `--', not `++' too... */ + if (!*arg && sym == '-') { /* `--' and no empty longoption */ + option_list = NULL; /* POSIX way... */ + continue; + } + + /* XXX: or treat as an argument sometimes??? */ + err_bad_opt (argv[i], 0, i); + return -1; + } + else { /* short option, or several short options... */ + + if (dirty_flags & CLIF_MAY_ONEDASH) { + optn = find_long (arg, &opt_arg, CLIF_MAY_ONEDASH, 0); + if (optn) goto long_found; + } + + if (!*arg) { /* POSIX say: only "stdout specification"... */ + arg--; + goto handle_arg; + } + + goto handle_short; + } + + long_found: + if (check_sym (optn, sym) < 0) { /* Oops... */ + err_bad_opt (argv[i], 0, i); + return -1; + } + + if (optn->flags & CLIF_EXCL) { + if (!exclusive_cnt) { + err_bad_excl (optn, 0, i); + return -1; + } + exclusive_cnt--; + } + + if (optn->arg_name && !opt_arg) { + unsigned int flags = optn->flags | parse_flags; + + if (++i >= argc || + !(flags & CLIF_MAY_NOEQUAL) + ) { /* missing opt arg */ + i--; + + if (!(flags & CLIF_OPTARG)) { + err_bad_arg (optn, 0, i); + return -1; + } + + opt_arg = NULL; + } else + opt_arg = argv[i]; + + } + + if (call_function (optn, opt_arg, sym) < 0) { + err_bad_res (optn, 0, opt_arg, i); + return -1; + } + + if (optn->flags & CLIF_EXIT) + exit (0); + + continue; + + handle_arg: + if (argument_list) { + if (i < MAX_ARGC_NUMBER) /* XXX: ugly, better report */ + arg_n[num_args++] = i; + } else { + err_report ("`%s' (argc %d): arguments are not allowed", + argv[i], i); + return -1; + } + + /* POSIX say: No more options after args... */ + if (posix) option_list = NULL; /* geniously... */ + + continue; + + handle_short: + + opt_arg = NULL; + + do { + + for (optn = option_list; + optn->short_opt || optn->long_opt; + optn++ + ) { + if (optn->short_opt && optn->short_opt[0] == *arg) + break; + } + if (!optn->short_opt || + check_sym (optn, sym) < 0 + ) { + err_bad_opt (argv[i], *arg, i); + return -1; + } + + if (optn->flags & CLIF_EXCL) { + if (!exclusive_cnt) { + err_bad_excl (optn, *arg, i); + return -1; + } + exclusive_cnt--; + } + + if (optn->arg_name) { + unsigned int flags = parse_flags | optn->flags; + + if (arg[1] == '\0') { /* a last one */ + + /* POSIX say: an option with arg cannot be grouped. */ + if (posix && arg != argv[i] && arg[-1] != sym) { + err_bad_arg (optn, *arg, i); /* good way? */ + return -1; + } + + if (++i >= argc || + (flags & _CLIF_STRICT_JOIN_ARG) + ) { + i--; + + if (!(flags & CLIF_OPTARG)) { + err_bad_arg (optn, *arg, i); + return -1; + } + + opt_arg = NULL; + } else + opt_arg = argv[i]; + } + else if ((arg == argv[i] || arg[-1] == sym) && + (flags & CLIF_MAY_JOIN_ARG) + ) { + opt_arg = ++arg; + } + else { /* inside a group... */ + if (!(flags & CLIF_OPTARG) || + (flags & CLIF_MAY_JOIN_ARG) + ) { + err_bad_arg (optn, *arg, i); + return -1; + } + + opt_arg = NULL; + } + } + + if (call_function (optn, opt_arg, sym) < 0) { + err_bad_res (optn, optn->short_opt[0], opt_arg, i); + return -1; + } + + if (optn->flags & CLIF_EXIT) + exit (0); + + }while (!opt_arg && *++arg); + +} /* for ( ... ) */ + +if ((parse_flags & CLIF_STRICT_EXCL) && exclusive_cnt != 0) { + err_report ("One of these must be specified:\n %s\n", + show_excl (option_list, 0)); + return -1; +} + +/* Now, after *ALL* options, handle arguments, if any. */ + +if (num_args < strict_beg + strict_end) { + /* Missing some needed arguments. */ + + if (num_args < strict_beg) argm = argument_list + num_args; + else + argm = argument_list + + ((num_args - strict_beg) + (num_argm - strict_end)); + + if (num_args == strict_beg + strict_end - 1) + err_report ("Specify \"%s\" missing argument.", argm->name); + else + err_report ("Specify \"%s\" and other missing arguments.", + argm->name); + return -1; +} + +if (num_args > 0) { + _CLIF_index argm_index[MAX_ARGC_NUMBER]; + + /* assing argm (by index) for each arg... */ + + for (i = 0, j = 0; i < strict_beg; i++, j++) + argm_index[i] = j; + for (i = num_args - strict_end, j = num_argm - strict_end; + i < num_args; i++, j++ + ) argm_index[i] = j; + for (i = strict_beg, j = strict_beg; + i < num_args - strict_end && j < num_argm - strict_end; + i++ + ) { + argm_index[i] = j; + if (!(argument_list[j].flags & CLIF_MORE)) + j++; + } + + if (i < num_args - strict_end) { /* there are extra args... */ + err_report ("Extra arg `%s' (position %d, argc %d)", + argv[arg_n[i]], i + 1, arg_n[i]); + return -1; + } + + if (j < num_argm - strict_end && + !(argument_list[j].flags & CLIF_MORE) && + /* ...i.e, there are some missing optional args... */ + (argument_list[j].flags & CLIF_ACC_PREV) + ) { + if (j == 0) + err_report ("Incorrect argument list set: first arg " + "cannot be `accompanied with previous'."); + else + err_report ("Arg \"%s\" must be specified because " + "\"%s\" `%s' is used.", argument_list[j].name, + argument_list[j - 1].name, argv[arg_n[i - 1]]); + return -1; + } + + if (argm_index[--i] == j && + /* above is true only after OPTIONAL area scan + and when `j' is stopped on CLIF_MORE */ + ++j < num_argm - strict_end + /* i.e: there is a *last* one (after CLIF_MORE) + in the OPTIONAL area */ + ) argm_index[i] = j; /* *last* is better than *more* */ + + /* ...and work now */ + + for (i = 0; i < num_args; i++) { + argm = argument_list + argm_index[i]; + + if (argm->function && + argm->function (argm, argv[arg_n[i]], i) < 0 + ) { + err_report ("Cannot handle \"%s\" cmdline arg `%s' " + "on position %d (argc %d)", + argm->name, argv[arg_n[i]], i + 1, arg_n[i]); + return -1; + } + } + + /* That`s all. */ +} + +return 0; +} + +static void box_output(int start, int left, int width, const char *str, + const char *arg_name) { + char *p, *endp, *s; + int l; + char buf[1024]; + char spacer[128]; /* assume it is enough */ + + if(left > (int) sizeof(spacer) - 2) + left = (int) sizeof(spacer) - 2; + if(width > (int) sizeof(buf) - 1) + width = (int) sizeof(buf) - 1; + + spacer[0] = '\n'; + memset(spacer + 1, ' ', left); + spacer[left + 1] = '\0'; + + l = left - start; + if(l > 0) { + memset(buf, ' ', l); + buf[l] = '\0'; + fprintf(stderr, "%s", buf); + } else + fprintf(stderr, "%s", spacer); + + endp = buf + width; + + p = buf; + + while(*str) { + + while(*str && p < endp) { + + if(*str == '%' && arg_name) { + if(str[1] == '%') { + *p++ = '%'; + str += 2; + continue; + } + else if(str[1] == 's') { + const char *a = arg_name; + + while(*a && p < endp) + *p++ = *a++; + str += 2; + continue; + } + } + + *p++ = *str++; + } + + *p = '\0'; + + if(p < endp) + break; + + while(p > buf && *p != ' ' && *p != '\t') + p--; + if(p <= buf) + return; /* foo on you */ + + *p = '\0'; + fprintf(stderr, "%s", buf); + fprintf(stderr, "%s", spacer); + + p++; + for(s = buf; *p; *s++ = *p++) + ; + *s = '\0'; + p = s; + } + + fprintf(stderr, "%s", buf); + + return; +} + +#define SHORT_LONG_DLM " " +#define OPT_START_DLM " " +#define OPT_FIELD_WIDTH 30 + +#define ARG_MARK_STRICT "+ " +#define ARG_MARK_GROUP0 " . " +#define ARG_MARK_GROUP " ' " +#define ARG_MARK_OPT " " +#define ARG_FIELD_WIDTH 20 + +#define SCREEN_WIDTH 80 + +void CLIF_print_options(const char *header, + const CLIF_option *option_list) { + const CLIF_option *optn; + char *excl; + int excl_cnt = 0; + + /* Print a header string, if present... */ + if(header) + fprintf(stderr, "%s\n", header); + + if(!option_list) + return; + + for(optn = option_list; optn->short_opt || optn->long_opt; optn++) { + int len; + + /* generate and print an option usage */ + + if(optn->short_opt) { + if(optn->long_opt) + len = fprintf(stderr, OPT_START_DLM "%s" + SHORT_LONG_DLM "%s", + show_short(optn), show_long(optn)); + else + len = fprintf(stderr, OPT_START_DLM "%s", + show_short(optn)); + } else + len = fprintf(stderr, OPT_START_DLM "%s", show_long(optn)); + + /* print a help string, if present */ + + if(optn->help_string) + box_output(len, OPT_FIELD_WIDTH, + SCREEN_WIDTH - OPT_FIELD_WIDTH, + optn->help_string, optn->arg_name); + + fprintf(stderr, "\n"); /* a last one */ + } + + excl = show_excl(option_list, &excl_cnt); + if(excl_cnt > 0) { + + if(excl_cnt == 1) { + if((curr.parse_flags & CLIF_STRICT_EXCL) && + curr.option_list == option_list + ) + fprintf(stderr, "Anyway `%s' must be specified.\n", excl); + //else /* simple ordinary option, because excl_cnt == 1 ... */ + } else + fprintf(stderr, "Only one of these may be specified:\n" + " %s\n", excl); + } + + return; +} + +void CLIF_print_arguments(const char *header, + const CLIF_argument *argument_list) { + const CLIF_argument *argm; + + if(!argument_list) + return; + + /* Print a header string, if present... */ + if(header) + fprintf(stderr, "%s\n", header); + + for(argm = argument_list; argm->name; argm++) { + int len; + + if(argm->flags & CLIF_STRICT) + len = fprintf(stderr, ARG_MARK_STRICT "%s", argm->name); + else if(argm->flags & CLIF_MORE) + len = fprintf(stderr, ARG_MARK_OPT "%s ...", argm->name); + else if(argm->flags & CLIF_ACC_PREV) + len = fprintf(stderr, ARG_MARK_GROUP "%s", argm->name); + else if((argm + 1)->name && ((argm + 1)->flags & CLIF_ACC_PREV)) + len = fprintf(stderr, ARG_MARK_GROUP0 "%s", argm->name); + else + len = fprintf(stderr, ARG_MARK_OPT "%s", argm->name); + + if(argm->help_string) + box_output(len, ARG_FIELD_WIDTH, + SCREEN_WIDTH - ARG_FIELD_WIDTH, + argm->help_string, argm->name); + + fprintf(stderr, "\n"); + } + + return; +} + +void CLIF_print_usage(const char *header, const char *progname, + const CLIF_option *option_list, + const CLIF_argument *argument_list) { + + if(!progname && curr.argv) + progname = curr.argv[0]; + + if(!header) { + if(progname) + fprintf(stderr, "Usage: %s", progname); + else + fprintf(stderr, "Command line options:"); + } else { + if(progname) + fprintf(stderr, "%s\n" OPT_START_DLM "%s", header, progname); + else + fprintf(stderr, "%s", header); + } + + if(option_list) { + const CLIF_option *optn; + char m_buf[256], p_buf[256], mp_buf[256]; + char *m = m_buf, *p = p_buf, *mp = mp_buf; + char *end_m = m_buf + sizeof(m_buf) - 1; + char *end_p = p_buf + sizeof(p_buf) - 1; + char *end_mp = mp_buf + sizeof(mp_buf) - 1; + char *excl; + int excl_cnt = 0; + + /* first, show exclusive option list, if any... */ + + excl = show_excl(option_list, &excl_cnt); + if(excl_cnt > 0) { + if((curr.parse_flags & CLIF_STRICT_EXCL) && + curr.option_list == option_list + ) { + if(excl_cnt == 1) + fprintf(stderr, " %s", excl); + else + fprintf(stderr, " { %s }", excl); + } else + fprintf(stderr, " [ %s ]", excl); + } + + /* second, find short options without arguments... */ + + for(optn = option_list; + optn->short_opt || optn->long_opt; + optn++ + ) { + /* We don`t exclude CLIF_EXTRA hear: + simple one char don`t eat a lot of space... + */ + + if(!optn->short_opt || + optn->arg_name || + (optn->flags & CLIF_EXCL) + ) + continue; + + if(optn->function_plus) { + if(optn->function) { + if(mp < end_mp) + *mp++ = optn->short_opt[0]; + } else { + if(p < end_p) + *p++ = optn->short_opt[0]; + } + } else { + if(m < end_m) + *m++ = optn->short_opt[0]; + } + } + + if(m > (char *) m_buf) { + *m = '\0'; + fprintf(stderr, " [ -%s ]", m_buf); + } + if(p > (char *) p_buf) { + *p = '\0'; + fprintf(stderr, " [ +%s ]", p_buf); + } + if(mp > (char *) mp_buf) { + *mp = '\0'; + fprintf(stderr, " [ " SHORT_PLUS_MINUS "%s ]", mp_buf); + } + + /* third, print all another... */ + + for(optn = option_list; + optn->short_opt || optn->long_opt; + optn++ + ) { + if(optn->flags & CLIF_EXTRA) + continue; + + if(optn->flags & CLIF_EXCL) + continue; /* already handled */ + + if(optn->short_opt) { + if(optn->arg_name) + fprintf(stderr, " [ %s ]", show_short(optn)); + //else + /* already handled */ + } else + fprintf(stderr, " [ %s ]", show_long(optn)); + } + } + + if(argument_list) { + const CLIF_argument *argm; + int deep = 0; + + for(argm = argument_list; argm->name; argm++) { + + if(argm->flags & CLIF_STRICT) { + if(deep > 0) { + fputc(' ', stderr); + while(deep--) + fputc(']', stderr); + deep = 0; + } + + fprintf(stderr, " %s", argm->name); + } else { + if(argm->flags & CLIF_MORE) + fprintf(stderr, " [ %s ...", argm->name); + else if(argm->flags & CLIF_ACC_PREV) { + fprintf(stderr, " %s", argm->name); + --deep; /* ugly, but easy */ + } else + fprintf(stderr, " [ %s", argm->name); + + deep++; + } + } + + if(deep > 0) { + fputc(' ', stderr); + while(deep--) + fputc(']', stderr); + } + } + + fprintf(stderr, "\n"); +} + +int CLIF_current_help(void) { + + if(!curr.argc) + return -1; /* i.e., not inited... */ + + CLIF_print_usage("Usage:", curr.argv[0], curr.option_list, + curr.argument_list); + + if(curr.option_list) + CLIF_print_options("Options:", curr.option_list); + + if(curr.argument_list) + CLIF_print_arguments("\nArguments:", curr.argument_list); + + return 0; +} + +/* Common useful option handlers. */ + +int CLIF_version_handler(CLIF_option *optn, char *arg) { + UNUSED(arg); + if(!optn->data) + return -1; + + fprintf(stderr, "%s\n", ((char *) optn->data)); + + return 0; /* be happy */ +} + +int CLIF_set_flag(CLIF_option *optn, char *arg) { + UNUSED(arg); + if(!optn->data) + return -1; + + *((int *) optn->data) = 1; + + return 0; +} + +int CLIF_unset_flag(CLIF_option *optn, char *arg) { + UNUSED(arg); + if(!optn->data) + return -1; + + *((int *) optn->data) = 0; + + return 0; +} + +static int set_string(char **data, char *arg) { + + if(!data) + return -1; + + *data = arg; + + return 0; +} + +int CLIF_set_string(CLIF_option *optn, char *arg) { + + return set_string(optn->data, arg); +} + +int CLIF_arg_string(CLIF_argument *argm, char *arg, int index) { + UNUSED(index); + return set_string(argm->data, arg); +} + +static int set_int(int *data, char *arg) { + char *q; + + if(!data) + return -1; + + *data = (int) strtol(arg, &q, 0); + + return (q == arg || *q) ? -1 : 0; +} + +static int set_uint(unsigned int *data, char *arg) { + char *q; + + if(!data) + return -1; + + *data = (unsigned int) strtoul(arg, &q, 0); + + return (q == arg || *q) ? -1 : 0; +} + +static int set_double(double *data, char *arg) { + char *q; + + if(!data) + return -1; + + *data = strtod(arg, &q); + + return (q == arg || *q) ? -1 : 0; +} + +int CLIF_set_int(CLIF_option *optn, char *arg) { + + return set_int(optn->data, arg); +} + +int CLIF_set_uint(CLIF_option *optn, char *arg) { + + return set_uint(optn->data, arg); +} + +int CLIF_set_double(CLIF_option *optn, char *arg) { + + return set_double(optn->data, arg); +} + +int CLIF_arg_int(CLIF_argument *argm, char *arg, int index) { + UNUSED(index); + return set_int(argm->data, arg); +} + +int CLIF_arg_uint(CLIF_argument *argm, char *arg, int index) { + UNUSED(index); + return set_uint(argm->data, arg); +} + +int CLIF_arg_double(CLIF_argument *argm, char *arg, int index) { + UNUSED(index); + return set_double(argm->data, arg); +} + +int CLIF_call_func(CLIF_option *optn, char *arg) { + + if(!optn->data) + return -1; + + if(optn->arg_name) { + int (*func)(char *) = optn->data; + + return func(arg); + } else { + int (*func)(void) = optn->data; + + return func(); + } +} + +int CLIF_arg_func(CLIF_argument *argm, char *arg, int index) { + int (*func)(char *, int); + + if(!argm->data) + return -1; + + func = (int (*)(char *, int)) argm->data; + + return func(arg, index); +} + diff --git a/modules/net/iputils/traceroute/clif.h b/modules/net/iputils/traceroute/clif.h new file mode 100644 index 0000000000..c798a8df8f --- /dev/null +++ b/modules/net/iputils/traceroute/clif.h @@ -0,0 +1,121 @@ +/* + Copyright (c) 2000, 2003 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: LGPL v2.1 or any later + + See COPYING.LIB for the status of this software. +*/ + +#ifndef _CLIF_H +#define _CLIF_H + + +typedef struct CLIF_option_struct CLIF_option; +struct CLIF_option_struct { + const char *short_opt; + const char *long_opt; + const char *arg_name; + const char *help_string; + int (*function) (CLIF_option *optn, char *arg); + void *data; + int (*function_plus) (CLIF_option *optn, char *arg); + unsigned int flags; +}; +#define CLIF_END_OPTION { 0, 0, 0, 0, 0, 0, 0, 0 } + +typedef struct CLIF_argument_struct CLIF_argument; +struct CLIF_argument_struct { + const char *name; + const char *help_string; + int (*function) (CLIF_argument *argm, char *arg, int index); + void *data; + unsigned int flags; +}; +#define CLIF_END_ARGUMENT { 0, 0, 0, 0, 0 } + +/* Argument flag bits. */ +#define CLIF_MORE (0x01) /* null or several */ +#define CLIF_STRICT (0x02) /* arg must be present */ +#define CLIF_ACC_PREV (0x04) /* arg must be accompanied with previous */ + + +/* Option flag bits. */ + +/* affected only by per-option flags */ +#define CLIF_EXTRA (0x0001) /* don`t show in usage line */ +#define CLIF_EXIT (0x0002) /* exit after handler return */ +#define CLIF_EXCL (0x0004) /* at exclusive area */ + +/* affected by per-option flags and by common `parse_flags' argument + of CLIF_parse_cmdline(). In last case appropriate bits are translated + for all the options. +*/ +#define CLIF_MAY_JOIN_ARG (0x0010) +#define _CLIF_STRICT_JOIN_ARG (0x0020) +#define CLIF_JOIN_ARG (CLIF_MAY_JOIN_ARG|_CLIF_STRICT_JOIN_ARG) +#define CLIF_MAY_NOEQUAL (0x0040) +#define _CLIF_STRICT_NOEQUAL (0x0080) +#define CLIF_NOEQUAL (CLIF_MAY_NOEQUAL|_CLIF_STRICT_NOEQUAL) +#define CLIF_MAY_KEYWORD (0x0100) +#define _CLIF_STRICT_KEYWORD (0x0200) +#define CLIF_KEYWORD (CLIF_MAY_KEYWORD|_CLIF_STRICT_KEYWORD) +#define CLIF_MAY_ONEDASH (0x0400) +#define _CLIF_STRICT_ONEDASH (0x0800) +#define CLIF_ONEDASH (CLIF_MAY_ONEDASH|_CLIF_STRICT_ONEDASH) +#define CLIF_OPTARG (0x1000) /* allow missing optarg */ +#define CLIF_ABBREV (0x2000) /* allow long opt abbreviation */ +#define CLIF_SEVERAL (0x4000) /* several args in one opt`s arg */ + +/* affected only by common `parse_flags' arg of CLIF_parse_cmdline() . */ +#define CLIF_HELP_EMPTY (0x10000) /* print help on empty cmdline */ +#define CLIF_POSIX (0x20000) /* follow POSIX standard */ +#define CLIF_FIRST_GROUP (0x40000) /* first arg - options` group */ +#define CLIF_STRICT_EXCL (0x80000) /* at least one exclusive */ +#define CLIF_SILENT (0x100000) /* no errors on stderr */ + +#define CLIF_MIN_ABBREV 2 /* a minimal match length in abbrev */ + + +extern int CLIF_parse (int argc, char **argv, CLIF_option *option_list, + CLIF_argument *arg_list, unsigned int parse_flags); +/* history compatibility... */ +#define CLIF_parse_cmdline(ARGC,ARGV,OPTN,ARGS,FLAGS) \ + CLIF_parse (ARGC, ARGV, OPTN, ARGS, FLAGS) + +extern void CLIF_print_options (const char *header, + const CLIF_option *option_list); +extern void CLIF_print_arguments (const char *header, + const CLIF_argument *argument_list); +extern void CLIF_print_usage (const char *header, const char *progname, + const CLIF_option *option_list, + const CLIF_argument *argument_list); + +extern int CLIF_current_help (void); + +/* Common useful option handlers. */ +extern int CLIF_version_handler (CLIF_option *optn, char *arg); +extern int CLIF_set_flag (CLIF_option *optn, char *arg); +extern int CLIF_unset_flag (CLIF_option *optn, char *arg); +extern int CLIF_set_string (CLIF_option *optn, char *arg); +extern int CLIF_set_int (CLIF_option *optn, char *arg); +extern int CLIF_set_uint (CLIF_option *optn, char *arg); +extern int CLIF_set_double (CLIF_option *optn, char *arg); +extern int CLIF_call_func (CLIF_option *optn, char *arg); + +extern int CLIF_arg_string (CLIF_argument *argm, char *arg, int index); +extern int CLIF_arg_int (CLIF_argument *argm, char *arg, int index); +extern int CLIF_arg_uint (CLIF_argument *argm, char *arg, int index); +extern int CLIF_arg_double (CLIF_argument *argm, char *arg, int index); +extern int CLIF_arg_func (CLIF_argument *argm, char *arg, int index); + + +/* Some useful macros. */ + +#define CLIF_HELP_OPTION \ + { 0, "help", 0, "Read this help and exit", \ + CLIF_call_func, CLIF_current_help, 0, CLIF_EXTRA | CLIF_EXIT } +#define CLIF_VERSION_OPTION(STR) \ + { "V", "version", 0, "Print version info and exit", \ + CLIF_version_handler, STR, 0, CLIF_EXTRA | CLIF_EXIT } + +#endif /* _CLIF_H */ diff --git a/modules/net/iputils/traceroute/csum.c b/modules/net/iputils/traceroute/csum.c new file mode 100644 index 0000000000..ea3a50da04 --- /dev/null +++ b/modules/net/iputils/traceroute/csum.c @@ -0,0 +1,34 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. +*/ + +#include <stdlib.h> +#include <unistd.h> + +#include "traceroute.h" + + +uint16_t in_csum (const void *ptr, size_t len) { + const uint16_t *p = (const uint16_t *) ptr; + size_t nw = len / 2; + unsigned int sum = 0; + uint16_t res; + + while (nw--) sum += *p++; + + if (len & 0x1) + sum += htons (*((unsigned char *) p) << 8); + + sum = (sum >> 16) + (sum & 0xffff); + sum += (sum >> 16); + + res = ~sum; + if (!res) res = ~0; + + return res; +} + diff --git a/modules/net/iputils/traceroute/extension.c b/modules/net/iputils/traceroute/extension.c new file mode 100644 index 0000000000..515a8dbed7 --- /dev/null +++ b/modules/net/iputils/traceroute/extension.c @@ -0,0 +1,132 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "traceroute.h" + + +struct icmp_ext_header { +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int version:4; + unsigned int reserved:4; +#else + unsigned int reserved:4; + unsigned int version:4; +#endif + uint8_t reserved1; + uint16_t checksum; +} __attribute__ ((packed)); + + +struct icmp_ext_object { + uint16_t length; + uint8_t class; + uint8_t c_type; + uint8_t data[0]; +}; + +#define MPLS_CLASS 1 +#define MPLS_C_TYPE 1 + + +#define do_snprintf(CURR, END, FMT, ARGS...) \ + do { \ + CURR += snprintf (CURR, END - CURR, (FMT), ## ARGS);\ + if (CURR > END) CURR = END; \ + } while (0) + + +static int try_extension (probe *pb, char *buf, size_t len) { + struct icmp_ext_header *iext = (struct icmp_ext_header *) buf; + char str[1024]; + char *curr = str; + char *end = str + sizeof (str) / sizeof (*str); + + + /* a check for len >= 8 already done for all cases */ + + if (iext->version != 2) return -1; + + if (iext->checksum && + in_csum (iext, len) != (uint16_t) ~0 + ) return -1; + + buf += sizeof (*iext); + len -= sizeof (*iext); + + + while (len >= sizeof (struct icmp_ext_object)) { + struct icmp_ext_object *obj = (struct icmp_ext_object *) buf; + size_t objlen = ntohs (obj->length); + size_t data_len; + uint32_t *ui = (uint32_t *) obj->data; + int i, n; + + if (objlen < sizeof (*obj) || + objlen > len + ) return -1; + + data_len = objlen - sizeof (*obj); + if (data_len % sizeof (uint32_t)) + return -1; /* must be 32bit rounded... */ + + n = data_len / sizeof (*ui); + + + if (curr > (char *) str && curr < end) + *curr++ = ';'; /* a separator */ + + if (obj->class == MPLS_CLASS && + obj->c_type == MPLS_C_TYPE && + n >= 1 + ) { /* people prefer MPLS to be parsed... */ + + do_snprintf (curr, end, "MPLS:"); + + for (i = 0; i < n; i++, ui++) { + uint32_t mpls = ntohl (*ui); + + do_snprintf (curr, end, "%sL=%u,E=%u,S=%u,T=%u", + i ? "/" : "", + mpls >> 12, + (mpls >> 9) & 0x7, + (mpls >> 8) & 0x1, + mpls & 0xff); + } + + } + else { /* common case... */ + + do_snprintf (curr, end, "%u/%u:", obj->class, obj->c_type); + + for (i = 0; i < n && curr < end; i++, ui++) + do_snprintf (curr, end, "%s%08x", i ? "," : "", ntohl(*ui)); + } + + buf += objlen; + len -= objlen; + } + + if (len) return -1; + + + pb->ext = strdup (str); + + return 0; +} + + +void handle_extensions (probe *pb, char *buf, int len, int step) { + + if (!step) + try_extension (pb, buf, len); + else { + for ( ; len >= 8; buf += step, len -= step) + if (try_extension (pb, buf, len) == 0) + break; + } + + return; +} + diff --git a/modules/net/iputils/traceroute/flowlabel.h b/modules/net/iputils/traceroute/flowlabel.h new file mode 100755 index 0000000000..e6241c4f8e --- /dev/null +++ b/modules/net/iputils/traceroute/flowlabel.h @@ -0,0 +1,40 @@ +/* + It is just a stripped copy of the kernel header "linux/in6.h" + + "Flow label" things are still not defined in "netinet/in*.h" headers, + but we cannot use "linux/in6.h" immediately because it currently + conflicts with "netinet/in.h" . +*/ + +struct in6_flowlabel_req_ +{ + struct in6_addr flr_dst; + __u32 flr_label; + __u8 flr_action; + __u8 flr_share; + __u16 flr_flags; + __u16 flr_expires; + __u16 flr_linger; + __u32 __flr_pad; + /* Options in format of IPV6_PKTOPTIONS */ +}; + +#define IPV6_FL_A_GET 0 +#define IPV6_FL_A_PUT 1 +#define IPV6_FL_A_RENEW 2 + +#define IPV6_FL_F_CREATE 1 +#define IPV6_FL_F_EXCL 2 + +#define IPV6_FL_S_NONE 0 +#define IPV6_FL_S_EXCL 1 +#define IPV6_FL_S_PROCESS 2 +#define IPV6_FL_S_USER 3 +#define IPV6_FL_S_ANY 255 + +#define IPV6_FLOWINFO_FLOWLABEL 0x000fffff +#define IPV6_FLOWINFO_PRIORITY 0x0ff00000 + +#define IPV6_FLOWLABEL_MGR 32 +#define IPV6_FLOWINFO_SEND 33 + diff --git a/modules/net/iputils/traceroute/mod-dccp.c b/modules/net/iputils/traceroute/mod-dccp.c new file mode 100644 index 0000000000..26f2c653bf --- /dev/null +++ b/modules/net/iputils/traceroute/mod-dccp.c @@ -0,0 +1,295 @@ +/* + Copyright (c) 2012 Samuel Jero <sj323707@ohio.edu> + License: GPL v2 or any later + + See COPYING for the status of this software. +*/ + +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/socket.h> +#include <poll.h> +#include <netinet/ip.h> +#include <netinet/ip6.h> +#include <linux/dccp.h> + + +#include "traceroute.h" + + +#define DEF_SERVICE_CODE 1885957735 + +#define DCCP_HEADER_LEN (sizeof (struct dccp_hdr) + \ + sizeof (struct dccp_hdr_ext) \ + + sizeof (struct dccp_hdr_request)) + +static sockaddr_any dest_addr = {{ 0, }, }; +static unsigned int dest_port = 0; + +static int raw_sk = -1; +static int last_ttl = 0; + +static uint8_t buf[1024]; /* enough, enough... */ +static size_t csum_len = 0; +static struct dccp_hdr *dh = NULL; +static struct dccp_hdr_ext *dhe = NULL; +static struct dccp_hdr_request *dhr = NULL; +static unsigned int service_code = DEF_SERVICE_CODE; + + +static CLIF_option dccp_options[] = { + { 0, "service", "NUM", "Set DCCP service code to %s (default is " + _TEXT (DEF_SERVICE_CODE) ")", + CLIF_set_uint, &service_code, 0, CLIF_ABBREV }, + CLIF_END_OPTION +}; + + +static int dccp_init (const sockaddr_any *dest, + unsigned int port_seq, size_t *packet_len_p) { + int af = dest->sa.sa_family; + sockaddr_any src; + socklen_t len; + uint8_t *ptr; + uint16_t *lenp; + + + dest_addr = *dest; + dest_addr.sin.sin_port = 0; /* raw sockets can be confused */ + + if (!port_seq) port_seq = DEF_DCCP_PORT; + dest_port = htons (port_seq); + + + /* Create raw socket for DCCP */ + raw_sk = socket (af, SOCK_RAW, IPPROTO_DCCP); + if (raw_sk < 0) + error_or_perm ("socket"); + + tune_socket (raw_sk); /* including bind, if any */ + + if (connect (raw_sk, &dest_addr.sa, sizeof (dest_addr)) < 0) + error ("connect"); + + len = sizeof (src); + if (getsockname (raw_sk, &src.sa, &len) < 0) + error ("getsockname"); + + + if (!raw_can_connect ()) { /* work-around for buggy kernels */ + close (raw_sk); + raw_sk = socket (af, SOCK_RAW, IPPROTO_DCCP); + if (raw_sk < 0) error ("socket"); + tune_socket (raw_sk); + /* but do not connect it... */ + } + + + use_recverr (raw_sk); + + add_poll (raw_sk, POLLIN | POLLERR); + + + /* Now create the sample packet. */ + + /* For easy checksum computing: + saddr + daddr + length + protocol + dccphdr + */ + + ptr = buf; + + if (af == AF_INET) { + len = sizeof (src.sin.sin_addr); + memcpy (ptr, &src.sin.sin_addr, len); + ptr += len; + memcpy (ptr, &dest_addr.sin.sin_addr, len); + ptr += len; + } else { + len = sizeof (src.sin6.sin6_addr); + memcpy (ptr, &src.sin6.sin6_addr, len); + ptr += len; + memcpy (ptr, &dest_addr.sin6.sin6_addr, len); + ptr += len; + } + + lenp = (uint16_t *) ptr; + ptr += sizeof (uint16_t); + *((uint16_t *) ptr) = htons ((uint16_t) IPPROTO_DCCP); + ptr += sizeof (uint16_t); + + + /* Construct DCCP header */ + dh = (struct dccp_hdr *) ptr; + + dh->dccph_ccval = 0; + dh->dccph_checksum = 0; + dh->dccph_cscov = 0; + dh->dccph_dport = dest_port; + dh->dccph_reserved = 0; + dh->dccph_sport = 0; /* temporary */ + dh->dccph_x = 1; + dh->dccph_type = DCCP_PKT_REQUEST; + dh->dccph_seq2 = 0; /* reserved if using 48 bit sequence numbers */ + /* high 16 bits of sequence number. Always make 0 for simplicity. */ + dh->dccph_seq = 0; + ptr += sizeof (struct dccp_hdr); + + dhe = (struct dccp_hdr_ext *) ptr; + dhe->dccph_seq_low = 0; /* temporary */ + ptr += sizeof (struct dccp_hdr_ext); + + dhr = (struct dccp_hdr_request *) ptr; + dhr->dccph_req_service = htonl (service_code); + ptr += sizeof (struct dccp_hdr_request); + + + csum_len = ptr - buf; + + if (csum_len > sizeof (buf)) + error ("impossible"); /* paranoia */ + + len = ptr - (uint8_t *) dh; + if (len & 0x03) error ("impossible"); /* as >>2 ... */ + + *lenp = htons (len); + dh->dccph_doff = len >> 2; + + + *packet_len_p = len; + + return 0; +} + + +static void dccp_send_probe (probe *pb, int ttl) { + int sk; + int af = dest_addr.sa.sa_family; + sockaddr_any addr; + socklen_t len = sizeof (addr); + + + /* To make sure we have chosen a free unused "source port", + just create, (auto)bind and hold a socket while the port is needed. + */ + + sk = socket (af, SOCK_DCCP, IPPROTO_DCCP); + if (sk < 0) error ("socket"); + + bind_socket (sk); + + if (getsockname (sk, &addr.sa, &len) < 0) + error ("getsockname"); + + /* When we reach the target host, it can send us either Reset or Response. + For Reset all is OK (we and kernel just answer nothing), but + for Response we should reply with our Close. + It is well-known "half-open technique", used by port scanners etc. + This way we do not touch remote applications at all, unlike + the ordinary connect(2) call. + As the port-holding socket neither connect() nor listen(), + it means "no such port yet" for remote ends, and kernel always + send Reset in such a situation automatically (we have to do nothing). + */ + + + dh->dccph_sport = addr.sin.sin_port; + + dhe->dccph_seq_low = random_seq (); + + dh->dccph_checksum = 0; + dh->dccph_checksum = in_csum (buf, csum_len); + + + if (ttl != last_ttl) { + set_ttl (raw_sk, ttl); + last_ttl = ttl; + } + + + pb->send_time = get_time (); + + if (do_send (raw_sk, dh, dh->dccph_doff << 2, &dest_addr) < 0) { + close (sk); + pb->send_time = 0; + return; + } + + + pb->seq = dh->dccph_sport; + + pb->sk = sk; + + return; +} + + +static probe *dccp_check_reply (int sk, int err, sockaddr_any *from, + char *buf, size_t len) { + UNUSED(sk); + probe *pb; + struct dccp_hdr *ndh = (struct dccp_hdr *) buf; + uint16_t sport, dport; + + + if (len < 8) return NULL; /* too short */ + + + if (err) { + sport = ndh->dccph_sport; + dport = ndh->dccph_dport; + } else { + sport = ndh->dccph_dport; + dport = ndh->dccph_sport; + } + + + if (dport != dest_port) + return NULL; + + if (!equal_addr (&dest_addr, from)) + return NULL; + + pb = probe_by_seq (sport); + if (!pb) return NULL; + + if (!err) pb->final = 1; + + return pb; +} + + +static void dccp_recv_probe (int sk, int revents) { + + if (!(revents & (POLLIN | POLLERR))) + return; + + recv_reply (sk, !!(revents & POLLERR), dccp_check_reply); +} + + +static void dccp_expire_probe (probe *pb) { + + probe_done (pb); +} + + +static tr_module dccp_ops = { + .name = "dccp", + .init = dccp_init, + .send_probe = dccp_send_probe, + .recv_probe = dccp_recv_probe, + .expire_probe = dccp_expire_probe, + .options = dccp_options, +}; + +TR_MODULE (dccp_ops); + +void tr_module_dccp_insert() +{ + +} diff --git a/modules/net/iputils/traceroute/mod-icmp.c b/modules/net/iputils/traceroute/mod-icmp.c new file mode 100644 index 0000000000..e2194d9aa4 --- /dev/null +++ b/modules/net/iputils/traceroute/mod-icmp.c @@ -0,0 +1,240 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. + */ + +#include <stdlib.h> +#include <unistd.h> +#include <sys/socket.h> +#include <poll.h> +#include <netinet/icmp6.h> +#include <netinet/ip_icmp.h> +#include <netinet/in.h> +#include <netinet/ip.h> +#include <netinet/ip6.h> + +#include "traceroute.h" + +static sockaddr_any dest_addr = { { 0, }, }; +static uint16_t seq = 1; +static uint16_t ident = 0; + +static char *data; +static size_t *length_p; + +static int icmp_sk = -1; +static int last_ttl = 0; + +static int raw = 0; +static int dgram = 0; + +static CLIF_option icmp_options[] = { + { 0, "raw", 0, "Use raw sockets way only. Default is try this way " + "first (probably not allowed for unprivileged users), " + "then try dgram", + CLIF_set_flag, &raw, 0, CLIF_EXCL }, + { 0, "dgram", 0, "Use dgram sockets way only. May be not implemented " + "by old kernels or restricted by sysadmins", + CLIF_set_flag, &dgram, 0, CLIF_EXCL }, + CLIF_END_OPTION + }; + +static int icmp_init(const sockaddr_any *dest, + unsigned int port_seq, size_t *packet_len_p) { + int i; + int af = dest->sa.sa_family; + int protocol; + + dest_addr = *dest; + dest_addr.sin.sin_port = 0; + + if(port_seq) + seq = port_seq; + + length_p = packet_len_p; + if(*length_p < sizeof(struct icmphdr)) + *length_p = sizeof(struct icmphdr); + + data = malloc(*length_p); + if(!data) + error("malloc"); + + for(i = (int) sizeof(struct icmphdr); i < (int)*length_p; i++) + data[i] = 0x40 + (i & 0x3f); + + protocol = (af == AF_INET) ? IPPROTO_ICMP : IPPROTO_ICMPV6; + + if(!raw) { + icmp_sk = socket(af, SOCK_DGRAM, protocol); + if(icmp_sk < 0 && dgram) + error("socket"); + } + + if(!dgram) { + int raw_sk = socket(af, SOCK_RAW, protocol); + if(raw_sk < 0) { + if(raw || icmp_sk < 0) + error_or_perm("socket"); + dgram = 1; + } else { + /* prefer the traditional "raw" way when possible */ + close(icmp_sk); + icmp_sk = raw_sk; + } + } + + tune_socket(icmp_sk); + + /* Don't want to catch packets from another hosts */ + if(raw_can_connect() && + connect(icmp_sk, &dest_addr.sa, sizeof(dest_addr)) < 0 + ) + error("connect"); + + use_recverr(icmp_sk); + + if(dgram) { + sockaddr_any addr; + socklen_t len = sizeof(addr); + + if(getsockname(icmp_sk, &addr.sa, &len) < 0) + error("getsockname"); + ident = ntohs(addr.sin.sin_port); /* both IPv4 and IPv6 */ + + } else + ident = getpid() & 0xffff; + + add_poll(icmp_sk, POLLIN | POLLERR); + + return 0; +} + +static void icmp_send_probe(probe *pb, int ttl) { + int af = dest_addr.sa.sa_family; + + if(ttl != last_ttl) { + + set_ttl(icmp_sk, ttl); + + last_ttl = ttl; + } + + if(af == AF_INET) { + struct icmp *icmp = (struct icmp *) data; + + icmp->icmp_type = ICMP_ECHO; + icmp->icmp_code = 0; + icmp->icmp_cksum = 0; + icmp->icmp_id = htons(ident); + icmp->icmp_seq = htons(seq); + + icmp->icmp_cksum = in_csum(data, *length_p); + } + else if(af == AF_INET6) { + struct icmp6_hdr *icmp6 = (struct icmp6_hdr *) data; + + icmp6->icmp6_type = ICMP6_ECHO_REQUEST; + icmp6->icmp6_code = 0; + icmp6->icmp6_cksum = 0; + icmp6->icmp6_id= htons (ident); + icmp6->icmp6_seq= htons(seq); + + /* icmp6->icmp6_cksum always computed by kernel internally */ + } + + pb->send_time = get_time(); + + if(do_send(icmp_sk, data, *length_p, &dest_addr) < 0) { + pb->send_time = 0; + return; + } + + pb->seq = seq; + + seq++; + + return; +} + +static probe *icmp_check_reply(int sk, int err, sockaddr_any *from, + char *buf, size_t len) { + UNUSED(sk); + UNUSED(from); + int af = dest_addr.sa.sa_family; + int type; + uint16_t recv_id, recv_seq; + probe *pb; + + if(len < sizeof(struct icmphdr)) + return NULL; + + if(af == AF_INET) { + struct icmp *icmp = (struct icmp *) buf; + + type = icmp->icmp_type; + + recv_id = ntohs(icmp->icmp_id); + recv_seq = ntohs(icmp->icmp_seq); + + } + else { /* AF_INET6 */ + struct icmp6_hdr *icmp6 = (struct icmp6_hdr *) buf; + + type = icmp6->icmp6_type; + + recv_id = ntohs(icmp6->icmp6_id); + recv_seq = ntohs(icmp6->icmp6_seq); + } + + if(recv_id != ident) + return NULL; + + pb = probe_by_seq(recv_seq); + if(!pb) + return NULL; + + if(!err) { + + if(!(af == AF_INET && type == ICMP_ECHOREPLY) && + !(af == AF_INET6 && type == ICMP6_ECHO_REPLY) + ) + return NULL; + + pb->final = 1; + } + + return pb; +} + +static void icmp_recv_probe(int sk, int revents) { + + if(!(revents & (POLLIN | POLLERR))) + return; + + recv_reply(sk, !!(revents & POLLERR), icmp_check_reply); +} + +static void icmp_expire_probe(probe *pb) { + + probe_done(pb); +} + +static tr_module icmp_ops = { + .name = "icmp", + .init = icmp_init, + .send_probe = icmp_send_probe, + .recv_probe = icmp_recv_probe, + .expire_probe = icmp_expire_probe, + .options = icmp_options, +}; + +TR_MODULE(icmp_ops); + +void tr_module_icmp_insert() +{ + +} + diff --git a/modules/net/iputils/traceroute/mod-raw.c b/modules/net/iputils/traceroute/mod-raw.c new file mode 100644 index 0000000000..bd9f05ba61 --- /dev/null +++ b/modules/net/iputils/traceroute/mod-raw.c @@ -0,0 +1,172 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. +*/ + +#include <stdlib.h> +#include <unistd.h> +#include <sys/socket.h> +#include <poll.h> +#include <netinet/icmp6.h> +#include <netinet/ip_icmp.h> +#include <netinet/in.h> +#include <netinet/ip.h> +#include <netinet/ip6.h> +#include <netdb.h> + +#include "traceroute.h" + + +static sockaddr_any dest_addr = {{ 0, }, }; +static int protocol = DEF_RAW_PROT; + +static char *data = NULL; +static size_t *length_p; + +static int raw_sk = -1; +static int last_ttl = 0; +static int seq = 0; + + +static int set_protocol (CLIF_option *optn, char *arg) { + UNUSED(optn); + char *q; + + protocol = strtoul (arg, &q, 0); + if (q == arg) { + struct protoent *p = getprotobyname (arg); + + if (!p) return -1; + protocol = p->p_proto; + } + + return 0; +} + + +static CLIF_option raw_options[] = { + { 0, "protocol", "PROT", "Use protocol %s (default is " + _TEXT (DEF_RAW_PROT) ")", + set_protocol, 0, 0, CLIF_ABBREV }, + CLIF_END_OPTION +}; + + +static int raw_init (const sockaddr_any *dest, + unsigned int port_seq, size_t *packet_len_p) { + int i; + int af = dest->sa.sa_family; + + dest_addr = *dest; + dest_addr.sin.sin_port = 0; + + if (port_seq) protocol = port_seq; + + + length_p = packet_len_p; + + if (*length_p && + !(data = malloc (*length_p)) + ) error ("malloc"); + + for (i = 0; i < (int)*length_p; i++) + data[i] = 0x40 + (i & 0x3f); + + + raw_sk = socket (af, SOCK_RAW, protocol); + if (raw_sk < 0) + error_or_perm ("socket"); + + tune_socket (raw_sk); + + /* Don't want to catch packets from another hosts */ + if (raw_can_connect () && + connect (raw_sk, &dest_addr.sa, sizeof (dest_addr)) < 0 + ) error ("connect"); + + use_recverr (raw_sk); + + + add_poll (raw_sk, POLLIN | POLLERR); + + return 0; +} + + +static void raw_send_probe (probe *pb, int ttl) { + + if (ttl != last_ttl) { + + set_ttl (raw_sk, ttl); + + last_ttl = ttl; + } + + + pb->send_time = get_time (); + + if (do_send (raw_sk, data, *length_p, &dest_addr) < 0) { + pb->send_time = 0; + return; + } + + + pb->seq = ++seq; + + return; +} + + +static probe *raw_check_reply (int sk, int err, sockaddr_any *from, + char *buf, size_t len) { + UNUSED(sk); + UNUSED(len); + UNUSED(buf); + probe *pb; + + if (!equal_addr (&dest_addr, from)) + return NULL; + + pb = probe_by_seq (seq); + if (!pb) return NULL; + + if (!err) pb->final = 1; + + return pb; +} + + +static void raw_recv_probe (int sk, int revents) { + + if (!(revents & (POLLIN | POLLERR))) + return; + + recv_reply (sk, !!(revents & POLLERR), raw_check_reply); +} + + +static void raw_expire_probe (probe *pb) { + + probe_done (pb); +} + + +static tr_module raw_ops = { + .name = "raw", + .init = raw_init, + .send_probe = raw_send_probe, + .recv_probe = raw_recv_probe, + .expire_probe = raw_expire_probe, + .options = raw_options, + .one_per_time = 1, +}; + +TR_MODULE (raw_ops); + +void tr_module_raw_insert() +{ + +} diff --git a/modules/net/iputils/traceroute/mod-tcp.c b/modules/net/iputils/traceroute/mod-tcp.c new file mode 100644 index 0000000000..32d2f1027e --- /dev/null +++ b/modules/net/iputils/traceroute/mod-tcp.c @@ -0,0 +1,515 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. +*/ + +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/socket.h> +#include <poll.h> +#include <netinet/icmp6.h> +#include <netinet/ip_icmp.h> +#include <netinet/in.h> +#include <netinet/ip.h> +#include <netinet/ip6.h> +#include <netinet/tcp.h> + + +#include "traceroute.h" + + +#ifndef IP_MTU +#define IP_MTU 14 +#endif + + +static sockaddr_any dest_addr = {{ 0, }, }; +static unsigned int dest_port = 0; + +static int raw_sk = -1; +static int last_ttl = 0; + +static uint8_t buf[1024]; /* enough, enough... */ +static size_t csum_len = 0; +static struct tcphdr *th = NULL; + +#define TH_FLAGS(TH) (((uint8_t *) (TH))[13]) +#define TH_FIN 0x01 +#define TH_SYN 0x02 +#define TH_RST 0x04 +#define TH_PSH 0x08 +#define TH_ACK 0x10 +#define TH_URG 0x20 +#define TH_ECE 0x40 +#define TH_CWR 0x80 + + +static int flags = 0; /* & 0xff == tcp_flags ... */ +static int sysctl = 0; +static int reuse = 0; +static unsigned int mss = 0; +static int info = 0; + +#define FL_FLAGS 0x0100 +#define FL_ECN 0x0200 +#define FL_SACK 0x0400 +#define FL_TSTAMP 0x0800 +#define FL_WSCALE 0x1000 + + +static struct { + const char *name; + unsigned int flag; +} tcp_flags[] = { + { "fin", TH_FIN }, + { "syn", TH_SYN }, + { "rst", TH_RST }, + { "psh", TH_PSH }, + { "ack", TH_ACK }, + { "urg", TH_URG }, + { "ece", TH_ECE }, + { "cwr", TH_CWR }, +}; + +static char *names_by_flags (unsigned int flags) { + int i; + char str[64]; /* enough... */ + char *curr = str; + char *end = str + sizeof (str) / sizeof (*str); + + for (i = 0; i < (int)(sizeof (tcp_flags) / sizeof (*tcp_flags)); i++) { + const char *p; + + if (!(flags & tcp_flags[i].flag)) continue; + + if (curr > str && curr < end) *curr++ = ','; + for (p = tcp_flags[i].name; *p && curr < end; *curr++ = *p++) ; + } + + *curr = '\0'; + + return strdup (str); +} + +static int set_tcp_flag (CLIF_option *optn, char *arg) { + UNUSED(arg); + int i; + + for (i = 0; i < (int)(sizeof (tcp_flags) / sizeof (*tcp_flags)); i++) { + if (!strcmp (optn->long_opt, tcp_flags[i].name)) { + flags |= tcp_flags[i].flag; + return 0; + } + } + + return -1; +} + +static int set_tcp_flags (CLIF_option *optn, char *arg) { + UNUSED(optn); + char *q; + unsigned long value; + + value = strtoul (arg, &q, 0); + if (q == arg) return -1; + + flags = (flags & ~0xff) | (value & 0xff) | FL_FLAGS; + return 0; +} + +static int set_flag (CLIF_option *optn, char *arg) { + UNUSED(arg); + flags |= (unsigned long) optn->data; + + return 0; +} + +static CLIF_option tcp_options[] = { + { 0, "syn", 0, "Set tcp flag SYN (default if no other " + "tcp flags specified)", set_tcp_flag, 0, 0, 0 }, + { 0, "ack", 0, "Set tcp flag ACK,", set_tcp_flag, 0, 0, 0 }, + { 0, "fin", 0, "FIN,", set_tcp_flag, 0, 0, 0 }, + { 0, "rst", 0, "RST,", set_tcp_flag, 0, 0, 0 }, + { 0, "psh", 0, "PSH,", set_tcp_flag, 0, 0, 0 }, + { 0, "urg", 0, "URG,", set_tcp_flag, 0, 0, 0 }, + { 0, "ece", 0, "ECE,", set_tcp_flag, 0, 0, 0 }, + { 0, "cwr", 0, "CWR", set_tcp_flag, 0, 0, 0 }, + { 0, "flags", "NUM", "Set tcp flags exactly to value %s", + set_tcp_flags, 0, 0, CLIF_ABBREV }, + { 0, "ecn", 0, "Send syn packet with tcp flags ECE and CWR " + "(for Explicit Congestion Notification, rfc3168)", + set_flag, (void *) FL_ECN, 0, 0 }, + { 0, "sack", 0, "Use sack,", + set_flag, (void *) FL_SACK, 0, 0 }, + { 0, "timestamps", 0, "timestamps,", + set_flag, (void *) FL_TSTAMP, 0, CLIF_ABBREV }, + { 0, "window_scaling", 0, "window_scaling option for tcp", + set_flag, (void *) FL_WSCALE, 0, CLIF_ABBREV }, + { 0, "sysctl", 0, "Use current sysctl (/proc/sys/net/*) setting " + "for the tcp options and ecn. Always set by default " + "(with \"syn\") if nothing else specified", + CLIF_set_flag, &sysctl, 0, 0 }, + { 0, "reuse", 0, "Allow to reuse local port numbers " + "for the huge workloads (SO_REUSEADDR)", + CLIF_set_flag, &reuse, 0, 0 }, + { 0, "mss", "NUM", "Use value of %s for maxseg tcp option (when syn)", + CLIF_set_uint, &mss, 0, 0 }, + { 0, "info", 0, "Print tcp flags of final tcp replies when target " + "host is reached. Useful to determine whether " + "an application listens the port etc.", + CLIF_set_flag, &info, 0, 0 }, + CLIF_END_OPTION +}; + + +#define SYSCTL_PREFIX "/proc/sys/net/ipv4/tcp_" +static int check_sysctl (const char *name) { + int fd, res; + char buf[sizeof (SYSCTL_PREFIX) + strlen (name) + 1]; + uint8_t ch; + + strcpy (buf, SYSCTL_PREFIX); + strcat (buf, name); + + fd = open (buf, O_RDONLY, 0); + if (fd < 0) return 0; + + res = read (fd, &ch, sizeof (ch)); + close (fd); + + if (res != sizeof (ch)) + return 0; + + /* since kernel 2.6.31 "tcp_ecn" can have value of '2'... */ + if (ch == '1') return 1; + + return 0; +} + + +static int tcp_init (const sockaddr_any *dest, + unsigned int port_seq, size_t *packet_len_p) { + int af = dest->sa.sa_family; + sockaddr_any src; + int mtu; + socklen_t len; + uint8_t *ptr; + uint16_t *lenp; + + + dest_addr = *dest; + dest_addr.sin.sin_port = 0; /* raw sockets can be confused */ + + if (!port_seq) port_seq = DEF_TCP_PORT; + dest_port = htons (port_seq); + + + /* Create raw socket for tcp */ + + raw_sk = socket (af, SOCK_RAW, IPPROTO_TCP); + if (raw_sk < 0) + error_or_perm ("socket"); + + tune_socket (raw_sk); /* including bind, if any */ + + if (connect (raw_sk, &dest_addr.sa, sizeof (dest_addr)) < 0) + error ("connect"); + + len = sizeof (src); + if (getsockname (raw_sk, &src.sa, &len) < 0) + error ("getsockname"); + + + len = sizeof (mtu); + if (getsockopt (raw_sk, af == AF_INET ? SOL_IP : SOL_IPV6, + af == AF_INET ? IP_MTU : IPV6_MTU, + &mtu, &len) < 0 || mtu < 576 + ) mtu = 576; + + /* mss = mtu - headers */ + mtu -= af == AF_INET ? sizeof (struct iphdr) : sizeof (struct ip6_hdr); + mtu -= sizeof (struct tcphdr); + + + if (!raw_can_connect ()) { /* work-around for buggy kernels */ + close (raw_sk); + raw_sk = socket (af, SOCK_RAW, IPPROTO_TCP); + if (raw_sk < 0) error ("socket"); + tune_socket (raw_sk); + /* but do not connect it... */ + } + + + use_recverr (raw_sk); + + add_poll (raw_sk, POLLIN | POLLERR); + + + /* Now create the sample packet. */ + + if (!flags) sysctl = 1; + + if (sysctl) { + if (check_sysctl ("ecn")) flags |= FL_ECN; + if (check_sysctl ("sack")) flags |= FL_SACK; + if (check_sysctl ("timestamps")) flags |= FL_TSTAMP; + if (check_sysctl ("window_scaling")) flags |= FL_WSCALE; + } + + if (!(flags & (FL_FLAGS | 0xff))) { /* no any tcp flag set */ + flags |= TH_SYN; + if (flags & FL_ECN) + flags |= TH_ECE | TH_CWR; + } + + + /* For easy checksum computing: + saddr + daddr + length + protocol + tcphdr + tcpoptions + */ + + ptr = buf; + + if (af == AF_INET) { + len = sizeof (src.sin.sin_addr); + memcpy (ptr, &src.sin.sin_addr, len); + ptr += len; + memcpy (ptr, &dest_addr.sin.sin_addr, len); + ptr += len; + } else { + len = sizeof (src.sin6.sin6_addr); + memcpy (ptr, &src.sin6.sin6_addr, len); + ptr += len; + memcpy (ptr, &dest_addr.sin6.sin6_addr, len); + ptr += len; + } + + lenp = (uint16_t *) ptr; + ptr += sizeof (uint16_t); + *((uint16_t *) ptr) = htons ((uint16_t) IPPROTO_TCP); + ptr += sizeof (uint16_t); + + + /* Construct TCP header */ + + th = (struct tcphdr *) ptr; + + th->source = 0; /* temporary */ + th->dest = dest_port; + th->seq = 0; /* temporary */ + th->ack_seq = 0; + th->doff = 0; /* later... */ + TH_FLAGS(th) = flags & 0xff; + th->window = htons (4 * mtu); + th->check = 0; + th->urg_ptr = 0; + + + /* Build TCP options */ + + ptr = (uint8_t *) (th + 1); + + if (flags & TH_SYN) { + *ptr++ = TCPOPT_MAXSEG; /* 2 */ + *ptr++ = TCPOLEN_MAXSEG; /* 4 */ + *((uint16_t *) ptr) = htons (mss ? mss : (unsigned int)mtu); + ptr += sizeof (uint16_t); + } + + if (flags & FL_TSTAMP) { + + if (flags & FL_SACK) { + *ptr++ = TCPOPT_SACK_PERMITTED; /* 4 */ + *ptr++ = TCPOLEN_SACK_PERMITTED;/* 2 */ + } else { + *ptr++ = TCPOPT_NOP; /* 1 */ + *ptr++ = TCPOPT_NOP; /* 1 */ + } + *ptr++ = TCPOPT_TIMESTAMP; /* 8 */ + *ptr++ = TCPOLEN_TIMESTAMP; /* 10 */ + + *((uint32_t *) ptr) = random_seq (); /* really! */ + ptr += sizeof (uint32_t); + *((uint32_t *) ptr) = (flags & TH_ACK) ? random_seq () : 0; + ptr += sizeof (uint32_t); + } + else if (flags & FL_SACK) { + *ptr++ = TCPOPT_NOP; /* 1 */ + *ptr++ = TCPOPT_NOP; /* 1 */ + *ptr++ = TCPOPT_SACK_PERMITTED; /* 4 */ + *ptr++ = TCPOLEN_SACK_PERMITTED; /* 2 */ + } + + if (flags & FL_WSCALE) { + *ptr++ = TCPOPT_NOP; /* 1 */ + *ptr++ = TCPOPT_WINDOW; /* 3 */ + *ptr++ = TCPOLEN_WINDOW; /* 3 */ + *ptr++ = 2; /* assume some corect value... */ + } + + + csum_len = ptr - buf; + + if (csum_len > sizeof (buf)) + error ("impossible"); /* paranoia */ + + len = ptr - (uint8_t *) th; + if (len & 0x03) error ("impossible"); /* as >>2 ... */ + + *lenp = htons (len); + th->doff = len >> 2; + + + *packet_len_p = len; + + return 0; +} + + +static void tcp_send_probe (probe *pb, int ttl) { + int sk; + int af = dest_addr.sa.sa_family; + sockaddr_any addr; + socklen_t len = sizeof (addr); + + + /* To make sure we have chosen a free unused "source port", + just create, (auto)bind and hold a socket while the port is needed. + */ + + sk = socket (af, SOCK_STREAM, 0); + if (sk < 0) error ("socket"); + + if (reuse && setsockopt (sk, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) + error ("setsockopt SO_REUSEADDR"); + + bind_socket (sk); + + if (getsockname (sk, &addr.sa, &len) < 0) + error ("getsockname"); + + /* When we reach the target host, it can send us either RST or SYN+ACK. + For RST all is OK (we and kernel just answer nothing), but + for SYN+ACK we should reply with our RST. + It is well-known "half-open technique", used by port scanners etc. + This way we do not touch remote applications at all, unlike + the ordinary connect(2) call. + As the port-holding socket neither connect() nor listen(), + it means "no such port yet" for remote ends, and kernel always + send RST in such a situation automatically (we have to do nothing). + */ + + + th->source = addr.sin.sin_port; + + th->seq = random_seq (); + + th->check = 0; + th->check = in_csum (buf, csum_len); + + + if (ttl != last_ttl) { + + set_ttl (raw_sk, ttl); + + last_ttl = ttl; + } + + + pb->send_time = get_time (); + + if (do_send (raw_sk, th, th->doff << 2, &dest_addr) < 0) { + close (sk); + pb->send_time = 0; + return; + } + + + pb->seq = th->source; + + pb->sk = sk; + + return; +} + + +static probe *tcp_check_reply (int sk, int err, sockaddr_any *from, + char *buf, size_t len) { + UNUSED(sk); + probe *pb; + struct tcphdr *tcp = (struct tcphdr *) buf; + uint16_t sport, dport; + + + if (len < 8) return NULL; /* too short */ + + + if (err) { + sport = tcp->source; + dport = tcp->dest; + } else { + sport = tcp->dest; + dport = tcp->source; + } + + + if (dport != dest_port) + return NULL; + + if (!equal_addr (&dest_addr, from)) + return NULL; + + pb = probe_by_seq (sport); + if (!pb) return NULL; + + + if (!err) { + + pb->final = 1; + + if (info) + pb->ext = names_by_flags (TH_FLAGS(tcp)); + } + + return pb; +} + + +static void tcp_recv_probe (int sk, int revents) { + + if (!(revents & (POLLIN | POLLERR))) + return; + + recv_reply (sk, !!(revents & POLLERR), tcp_check_reply); +} + + +static void tcp_expire_probe (probe *pb) { + + probe_done (pb); +} + + +static tr_module tcp_ops = { + .name = "tcp", + .init = tcp_init, + .send_probe = tcp_send_probe, + .recv_probe = tcp_recv_probe, + .expire_probe = tcp_expire_probe, + .options = tcp_options, +}; + +TR_MODULE (tcp_ops); + +void tr_module_tcp_insert() +{ + +} diff --git a/modules/net/iputils/traceroute/mod-tcpconn.c b/modules/net/iputils/traceroute/mod-tcpconn.c new file mode 100644 index 0000000000..13e2398647 --- /dev/null +++ b/modules/net/iputils/traceroute/mod-tcpconn.c @@ -0,0 +1,237 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. +*/ + +#include <stdlib.h> +#include <unistd.h> +#include <sys/socket.h> +#include <poll.h> +#include <netinet/icmp6.h> +#include <netinet/ip_icmp.h> +#include <netinet/in.h> +#include <netinet/ip.h> +#include <netinet/ip6.h> +#include <netinet/tcp.h> +#include <errno.h> + +#include "traceroute.h" + + +static sockaddr_any dest_addr = {{ 0, }, }; + +static int icmp_sk = -1; + + +static int tcp_init (const sockaddr_any *dest, + unsigned int port_seq, size_t *packet_len_p) { + UNUSED(packet_len_p); + int af = dest->sa.sa_family; + + dest_addr = *dest; + dest_addr.sin.sin_port = htons (DEF_TCP_PORT); + + if (port_seq) + dest_addr.sin.sin_port = htons (port_seq); + + + /* Currently an ICMP socket is the only way + to obtain the needed info... + */ + icmp_sk = socket (af, SOCK_RAW, (af == AF_INET) ? IPPROTO_ICMP + : IPPROTO_ICMPV6); + if (icmp_sk < 0) + error_or_perm ("socket"); + + /* icmp_sk not need full tune_socket() here, just a receiving one */ + bind_socket (icmp_sk); + use_timestamp (icmp_sk); + use_recv_ttl (icmp_sk); + + add_poll (icmp_sk, POLLIN); + + return 0; +} + + +static void tcp_send_probe (probe *pb, int ttl) { + int sk; + int af = dest_addr.sa.sa_family; + sockaddr_any addr; + socklen_t length = sizeof (addr); + + + sk = socket (af, SOCK_STREAM, 0); + if (sk < 0) error ("socket"); + + tune_socket (sk); /* common stuff */ + + set_ttl (sk, ttl); + + + pb->send_time = get_time (); + + if (connect (sk, &dest_addr.sa, sizeof (dest_addr)) < 0) { + if (errno != EINPROGRESS) + error ("connect"); + } + + + if (getsockname (sk, &addr.sa, &length) < 0) + error ("getsockname"); + + pb->seq = addr.sin.sin_port; /* both ipv4/ipv6 */ + + pb->sk = sk; + + add_poll (sk, POLLERR | POLLHUP | POLLOUT); + + return; +} + + +static probe *tcp_check_reply (int sk, int err, sockaddr_any *from, + char *buf, size_t len) { + UNUSED(sk); + UNUSED(err); + UNUSED(from); + int af = dest_addr.sa.sa_family; + int type, code, info; + probe *pb; + struct tcphdr *tcp; + + + if (len < sizeof (struct icmphdr)) + return NULL; + + + if (af == AF_INET) { + struct icmp *icmp = (struct icmp *) buf; + struct iphdr *ip; + int hlen; + + type = icmp->icmp_type; + code = icmp->icmp_code; + info = icmp->icmp_void; + + if (type != ICMP_TIME_EXCEEDED && type != ICMP_DEST_UNREACH) + return NULL; + + if (len < sizeof (struct icmphdr) + sizeof (struct iphdr) + 8) + /* `8' - rfc1122: 3.2.2 */ + return NULL; + + ip = (struct iphdr *) (((char *)icmp) + sizeof(struct icmphdr)); + hlen = ip->ihl << 2; + + if (len < sizeof (struct icmphdr) + hlen + 8) + return NULL; + if (ip->protocol != IPPROTO_TCP) + return NULL; + + tcp = (struct tcphdr *) (((char *) ip) + hlen); + + } + else { /* AF_INET6 */ + struct icmp6_hdr *icmp6 = (struct icmp6_hdr *) buf; + struct ip6_hdr *ip6; + + type = icmp6->icmp6_type; + code = icmp6->icmp6_code; + info = icmp6->icmp6_mtu; + + if (type != ICMP6_TIME_EXCEEDED && + type != ICMP6_DST_UNREACH && + type != ICMP6_PACKET_TOO_BIG + ) return NULL; + + if (len < sizeof(struct icmp6_hdr) + sizeof(struct ip6_hdr) + 8) + return NULL; + + ip6 = (struct ip6_hdr *) (icmp6 + 1); + if (ip6->ip6_nxt != IPPROTO_TCP) + return NULL; + + tcp = (struct tcphdr *) (ip6 + 1); + + } + + + if (tcp->dest != dest_addr.sin.sin_port) + return NULL; + + pb = probe_by_seq (tcp->source); + if (!pb) return NULL; + + + /* here only, high level has no data to do this */ + parse_icmp_res (pb, type, code, info); + + return pb; +} + + +static void tcp_recv_probe (int sk, int revents) { + + if (sk != icmp_sk) { /* a tcp socket */ + probe *pb; + + pb = probe_by_sk (sk); + if (!pb) { + del_poll (sk); + return; + } + + + /* do connect() again and check errno, regardless of revents */ + if (connect (sk, &dest_addr.sa, sizeof (dest_addr)) < 0) { + if (errno != EISCONN && errno != ECONNREFUSED) + return; /* ICMP say more */ + } + + /* we have reached the dest host (either connected or refused) */ + + memcpy (&pb->res, &dest_addr, sizeof (pb->res)); + + pb->final = 1; + + pb->recv_time = get_time (); + + probe_done (pb); + + return; + } + + + /* ICMP stuff */ + + if (!(revents & POLLIN)) + return; + + recv_reply (icmp_sk, 0, tcp_check_reply); +} + + +static void tcp_expire_probe (probe *pb) { + + probe_done (pb); +} + + +static tr_module tcp_ops = { + .name = "tcpconn", + .init = tcp_init, + .send_probe = tcp_send_probe, + .recv_probe = tcp_recv_probe, + .expire_probe = tcp_expire_probe, +}; + +TR_MODULE (tcp_ops); + +void tr_module_tcpconn_insert() +{ + +} diff --git a/modules/net/iputils/traceroute/mod-udp.c b/modules/net/iputils/traceroute/mod-udp.c new file mode 100644 index 0000000000..e24d0271c8 --- /dev/null +++ b/modules/net/iputils/traceroute/mod-udp.c @@ -0,0 +1,241 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. +*/ + +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/socket.h> +#include <poll.h> +#include <netinet/in.h> +#include <netinet/udp.h> + +#include "traceroute.h" + + +#ifndef IPPROTO_UDPLITE +#define IPPROTO_UDPLITE 136 +#endif + +#ifndef UDPLITE_SEND_CSCOV +#define UDPLITE_SEND_CSCOV 10 +#define UDPLITE_RECV_CSCOV 11 +#endif + + +static sockaddr_any dest_addr = {{ 0, }, }; +static unsigned int curr_port = 0; +static unsigned int protocol = IPPROTO_UDP; + + +static char *data = NULL; +static size_t *length_p; + +static void fill_data (size_t *packet_len_p) { + int i; + + length_p = packet_len_p; + + if (*length_p && + !(data = malloc (*length_p)) + ) error ("malloc"); + + for (i = 0; i < (int)*length_p; i++) + data[i] = 0x40 + (i & 0x3f); + + return; +} + + +static int udp_default_init (const sockaddr_any *dest, + unsigned int port_seq, size_t *packet_len_p) { + + curr_port = port_seq ? port_seq : DEF_START_PORT; + + dest_addr = *dest; + dest_addr.sin.sin_port = htons (curr_port); + + fill_data (packet_len_p); + + return 0; +} + + +static int udp_init (const sockaddr_any *dest, + unsigned int port_seq, size_t *packet_len_p) { + + dest_addr = *dest; + + if (!port_seq) port_seq = DEF_UDP_PORT; + dest_addr.sin.sin_port = htons ((uint16_t) port_seq); + + fill_data (packet_len_p); + + return 0; +} + + +static unsigned int coverage = 0; +#define MIN_COVERAGE (sizeof (struct udphdr)) + +static void set_coverage (int sk) { + int val = MIN_COVERAGE; + + if (setsockopt (sk, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, + &coverage, sizeof (coverage)) < 0 + ) error ("UDPLITE_SEND_CSCOV"); + + if (setsockopt (sk, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, + &val, sizeof (val)) < 0 + ) error ("UDPLITE_RECV_CSCOV"); +} + +static CLIF_option udplite_options[] = { + { 0, "coverage", "NUM", "Set udplite send coverage to %s (default is " + _TEXT(MIN_COVERAGE) ")", + CLIF_set_uint, &coverage, 0, CLIF_ABBREV }, + CLIF_END_OPTION +}; + +static int udplite_init (const sockaddr_any *dest, + unsigned int port_seq, size_t *packet_len_p) { + + dest_addr = *dest; + + if (!port_seq) port_seq = DEF_UDP_PORT; /* XXX: Hmmm... */ + dest_addr.sin.sin_port = htons ((uint16_t) port_seq); + + protocol = IPPROTO_UDPLITE; + + if (!coverage) coverage = MIN_COVERAGE; + + fill_data (packet_len_p); + + return 0; +} + + +static void udp_send_probe (probe *pb, int ttl) { + int sk; + int af = dest_addr.sa.sa_family; + + + sk = socket (af, SOCK_DGRAM, protocol); + if (sk < 0) error ("socket"); + + tune_socket (sk); /* common stuff */ + + if (coverage) set_coverage (sk); /* udplite case */ + + set_ttl (sk, ttl); + + + if (connect (sk, &dest_addr.sa, sizeof (dest_addr)) < 0) + error ("connect"); + + use_recverr (sk); + + + pb->send_time = get_time (); + + if (do_send (sk, data, *length_p, NULL) < 0) { + close (sk); + pb->send_time = 0; + return; + } + + + pb->sk = sk; + + add_poll (sk, POLLIN | POLLERR); + + pb->seq = dest_addr.sin.sin_port; + + if (curr_port) { /* traditional udp method */ + curr_port++; + dest_addr.sin.sin_port = htons (curr_port); /* both ipv4 and ipv6 */ + } + + return; +} + + +static probe *udp_check_reply (int sk, int err, sockaddr_any *from, + char *buf, size_t len) { + UNUSED(buf); + UNUSED(len); + probe *pb; + + pb = probe_by_sk (sk); + if (!pb) return NULL; + + if (pb->seq != from->sin.sin_port) + return NULL; + + if (!err) pb->final = 1; + + return pb; +} + + +static void udp_recv_probe (int sk, int revents) { + + if (!(revents & (POLLIN | POLLERR))) + return; + + recv_reply (sk, !!(revents & POLLERR), udp_check_reply); +} + + +static void udp_expire_probe (probe *pb) { + + probe_done (pb); +} + + +/* All three modules share the same methods except the init... */ + +static tr_module default_ops = { + .name = "default", + .init = udp_default_init, + .send_probe = udp_send_probe, + .recv_probe = udp_recv_probe, + .expire_probe = udp_expire_probe, + .header_len = sizeof (struct udphdr), +}; + +TR_MODULE (default_ops); + + +static tr_module udp_ops = { + .name = "udp", + .init = udp_init, + .send_probe = udp_send_probe, + .recv_probe = udp_recv_probe, + .expire_probe = udp_expire_probe, + .header_len = sizeof (struct udphdr), +}; + +TR_MODULE (udp_ops); + + +static tr_module udplite_ops = { + .name = "udplite", + .init = udplite_init, + .send_probe = udp_send_probe, + .recv_probe = udp_recv_probe, + .expire_probe = udp_expire_probe, + .header_len = sizeof (struct udphdr), + .options = udplite_options, +}; + +TR_MODULE (udplite_ops); + +void tr_module_udp_insert() +{ + +} diff --git a/modules/net/iputils/traceroute/module.c b/modules/net/iputils/traceroute/module.c new file mode 100644 index 0000000000..f8f228ef63 --- /dev/null +++ b/modules/net/iputils/traceroute/module.c @@ -0,0 +1,51 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. + */ + +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <stdio.h> + +#include "traceroute.h" + +void tr_module_icmp_insert(); +void tr_module_udp_insert(); +void tr_module_tcp_insert(); +void tr_module_tcpconn_insert(); +void tr_module_raw_insert(); +void tr_module_dccp_insert(); + +static tr_module *base = NULL; + +void tr_register_module(tr_module *ops) { + + ops->next = base; + base = ops; +// printf("tr_register_module name=%s\n", ops->name); +} + +const tr_module *tr_get_module(const char *name) { + const tr_module *ops; + + tr_module_icmp_insert(); + tr_module_udp_insert(); + tr_module_tcp_insert(); + tr_module_tcpconn_insert(); + tr_module_raw_insert(); + tr_module_dccp_insert(); + + if(!name) + return 0; + + for(ops = base; ops; ops = ops->next) { + if(!strcasecmp(name, ops->name)) + return ops; + } + + return NULL; +} diff --git a/modules/net/iputils/traceroute/poll.c b/modules/net/iputils/traceroute/poll.c new file mode 100644 index 0000000000..232a83395b --- /dev/null +++ b/modules/net/iputils/traceroute/poll.c @@ -0,0 +1,93 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. +*/ + +#include <stdlib.h> +#include <unistd.h> +#include <poll.h> +#include <errno.h> +#include <math.h> + +#include "traceroute.h" + + +static struct pollfd *pfd = NULL; +static unsigned int num_polls = 0; + + +void add_poll (int fd, int events) { + int i; + + for (i = 0; i < (int)num_polls && pfd[i].fd > 0; i++) ; + + if (i == (int)num_polls) { + pfd = realloc (pfd, ++num_polls * sizeof (*pfd)); + if (!pfd) error ("realloc"); + } + + pfd[i].fd = fd; + pfd[i].events = events; +} + + +void del_poll (int fd) { + int i; + + for (i = 0; i < (int)num_polls && pfd[i].fd != fd; i++) ; + + if (i < (int)num_polls) pfd[i].fd = -1; /* or just zero it... */ +} + + +static int cleanup_polls (void) { + int i; + + for (i = 0; i < (int)num_polls && pfd[i].fd > 0; i++) ; + + if (i < (int)num_polls) { /* a hole have found */ + int j; + + for (j = i + 1; j < (int)num_polls; j++) { + if (pfd[j].fd > 0) { + pfd[i++] = pfd[j]; + pfd[j].fd = -1; + } + } + } + + return i; +} + + +void do_poll (double timeout, void (*callback) (int fd, int revents)) { + int nfds; + int msecs = ceil (timeout * 1000); + + while ((nfds = cleanup_polls ()) > 0) { + int i, n; + + n = poll (pfd, nfds, msecs); + + if (n <= 0) { + if (n == 0 || errno == EINTR) + return; + error ("poll"); + } + + for (i = 0; n && i < (int)num_polls; i++) { + if (pfd[i].revents) { + callback (pfd[i].fd, pfd[i].revents); + n--; + } + } + + msecs = 0; /* no more wait, just eat all the pending */ + } + + return; +} + diff --git a/modules/net/iputils/traceroute/random.c b/modules/net/iputils/traceroute/random.c new file mode 100644 index 0000000000..5a8f911e14 --- /dev/null +++ b/modules/net/iputils/traceroute/random.c @@ -0,0 +1,28 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. +*/ + +#include <stdlib.h> +#include <unistd.h> +#include <sys/times.h> + +#include "traceroute.h" + + +static void __init_random_seq (void) __attribute__ ((constructor)); +static void __init_random_seq (void) { + + srand (times (NULL) + getpid ()); +} + + +unsigned int random_seq (void) { + + /* To not worry about RANDOM_MAX and precision... */ + return (rand () << 16) ^ (rand () << 8) ^ rand () ^ (rand () >> 8); +} + diff --git a/modules/net/iputils/traceroute/time.c b/modules/net/iputils/traceroute/time.c new file mode 100644 index 0000000000..16ea82483c --- /dev/null +++ b/modules/net/iputils/traceroute/time.c @@ -0,0 +1,27 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. +*/ + +#include <stdlib.h> +#include <unistd.h> +#include <sys/time.h> + +#include "traceroute.h" + + +/* Just returns current time as double, with most possible precision... */ + +double get_time (void) { + struct timeval tv; + double d; + + gettimeofday (&tv, NULL); + + d = ((double) tv.tv_usec) / 1000000. + (unsigned long) tv.tv_sec; + + return d; +} diff --git a/modules/net/iputils/traceroute/traceroute.c b/modules/net/iputils/traceroute/traceroute.c new file mode 100755 index 0000000000..a0dbeb2e23 --- /dev/null +++ b/modules/net/iputils/traceroute/traceroute.c @@ -0,0 +1,1758 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/socket.h> +#include <poll.h> +#include <netinet/icmp6.h> +#include <netinet/ip_icmp.h> +#include <netinet/in.h> +#include <netinet/ip6.h> +#include <netdb.h> +#include <errno.h> +#include <locale.h> +#include <sys/utsname.h> +#include <linux/types.h> +#include <linux/errqueue.h> + +/* XXX: Remove this when things will be defined properly in netinet/ ... */ +#include "flowlabel.h" + +//#include "version.h" +#include <stdbool.h> +//#include <glib.h> +#include "traceroute.h" + +#ifndef ICMP6_DST_UNREACH_BEYONDSCOPE +#ifdef ICMP6_DST_UNREACH_NOTNEIGHBOR +#define ICMP6_DST_UNREACH_BEYONDSCOPE ICMP6_DST_UNREACH_NOTNEIGHBOR +#else +#define ICMP6_DST_UNREACH_BEYONDSCOPE 2 +#endif +#endif + +#ifndef IPV6_RECVHOPLIMIT +#define IPV6_RECVHOPLIMIT IPV6_HOPLIMIT +#endif + +#ifndef IP_PMTUDISC_PROBE +#define IP_PMTUDISC_PROBE 3 +#endif + +#ifndef IPV6_PMTUDISC_PROBE +#define IPV6_PMTUDISC_PROBE 3 +#endif + +#ifndef AI_IDN +#define AI_IDN 0 +#endif + +#ifndef NI_IDN +#define NI_IDN 0 +#endif + +#define MAX_HOPS 255 +#define MAX_PROBES 10 +#define MAX_GATEWAYS_4 8 +#define MAX_GATEWAYS_6 127 +#define DEF_HOPS 30 +#define DEF_SIM_PROBES 16 /* including several hops */ +#define DEF_NUM_PROBES 3 //1 +#define DEF_WAIT_SECS 5.0 +#define DEF_HERE_FACTOR 3 +#define DEF_NEAR_FACTOR 10 +#ifndef DEF_WAIT_PREC +#define DEF_WAIT_PREC 0.001 /* +1 ms to avoid precision issues */ +#endif +#define DEF_SEND_SECS 0 +#define DEF_DATA_LEN 40 /* all but IP header... */ +#define MAX_PACKET_LEN 65000 +#ifndef DEF_AF +#define DEF_AF AF_INET +#endif + +#define ttl2hops(X) (((X) <= 64 ? 65 : ((X) <= 128 ? 129 : 256)) - (X)) + +static char version_string[] = "Modern traceroute for Linux, " + "version " _TEXT(VERSION) +"\nCopyright (c) 2016 Dmitry Butskoy, " +" License: GPL v2 or any later"; +static int debug = 0; +static unsigned int first_hop = 1; +static unsigned int max_hops = DEF_HOPS; +static unsigned int sim_probes = DEF_SIM_PROBES; +static unsigned int probes_per_hop = DEF_NUM_PROBES; + +static char **gateways = NULL; +static int num_gateways = 0; +static unsigned char *rtbuf = NULL; +static size_t rtbuf_len = 0; +static unsigned int ipv6_rthdr_type = 2; /* IPV6_RTHDR_TYPE_2 */ + +static size_t header_len = 0; +static size_t data_len = 0; + +static int dontfrag = 0; +static int noresolve = 0; +static int extension = 0; +static int as_lookups = 0; +static unsigned int dst_port_seq = 0; +static unsigned int tos = 0; +static unsigned int flow_label = 0; +static int noroute = 0; +static unsigned int fwmark = 0; +static int packet_len = -1; +static double wait_secs = DEF_WAIT_SECS; +static double here_factor = DEF_HERE_FACTOR; +static double near_factor = DEF_NEAR_FACTOR; +static double send_secs = DEF_SEND_SECS; +static int mtudisc = 0; +static int backward = 0; + +static sockaddr_any dst_addr = { { 0, }, }; +static char *dst_name = NULL; +static char *device = NULL; +static sockaddr_any src_addr = { { 0, }, }; +static unsigned int src_port = 0; + +static const char *module = "default"; +static const tr_module *ops = NULL; + +static char *opts[16] = { NULL, }; /* assume enough */ +static unsigned int opts_idx = 1; /* first one reserved... */ + +static int af = 0; + +static probe *probes = NULL; +static unsigned int num_probes = 0; + +static void ex_error(const char *format, ...) { + va_list ap; + + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + + fprintf(stderr, "\n"); + + //exit(2); +} + +void error(const char *str) { + + fprintf(stderr, "\n"); + + perror(str); + + exit(1); +} + +void error_or_perm(const char *str) { + + if(errno == EPERM) + fprintf(stderr, "You do not have enough privileges to use " + "this traceroute method."); + error(str); +} + +/* Set initial parameters according to how we was called */ + +static void check_progname(const char *name) { + const char *p; + int l; + + p = strrchr(name, '/'); + if(p) + p++; + else + p = name; + + l = strlen(p); + if(l <= 0) + return; + l--; + + if(p[l] == '6') + af = AF_INET6; + else if(p[l] == '4') + af = AF_INET; + + if(!strncmp(p, "tcp", 3)) + module = "tcp"; + if(!strncmp(p, "tracert", 7)) + module = "icmp"; + + return; +} + +static int getaddr(const char *name, sockaddr_any *addr) { + int ret; + struct addrinfo hints, *ai, *res = NULL; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = af; + hints.ai_flags = AI_IDN; + + ret = getaddrinfo(name, NULL, &hints, &res); + if(ret) { + fprintf(stderr, "%s: %s\n", name, gai_strerror(ret)); + return -1; + } + + for(ai = res; ai; ai = ai->ai_next) { + if(ai->ai_family == af) + break; + /* when af not specified, choose DEF_AF if present */ + if(!af && ai->ai_family == DEF_AF) + break; + } + if(!ai) + ai = res; /* anything... */ + + if(ai->ai_addrlen > sizeof(*addr)) + return -1; /* paranoia */ + memcpy(addr, ai->ai_addr, ai->ai_addrlen); + + freeaddrinfo(res); + + return 0; +} + +static void make_fd_used(int fd) { + int nfd; + + if(fcntl(fd, F_GETFL) != -1) + return; + + if(errno != EBADF) + error("fcntl F_GETFL"); + + nfd = open("/dev/null", O_RDONLY); + if(nfd < 0) + error("open /dev/null"); + + if(nfd != fd) { + dup2(nfd, fd); + close(nfd); + } + + return; +} + +static char addr2str_buf[INET6_ADDRSTRLEN]; + +static const char *addr2str(const sockaddr_any *addr) { + + getnameinfo(&addr->sa, sizeof(*addr), + addr2str_buf, sizeof(addr2str_buf), 0, 0, NI_NUMERICHOST); + + return addr2str_buf; +} + +/* IP options stuff */ + +static int init_ip_options(void) { + sockaddr_any *gates; + int i, max; + + if(!num_gateways) + return 0; + + /* check for TYPE,ADDR,ADDR... form */ + if(af == AF_INET6 && num_gateways > 1 && gateways[0]) { + char *q; + unsigned int value = strtoul(gateways[0], &q, 0); + + if(!*q) { + ipv6_rthdr_type = value; + num_gateways--; + for(i = 0; i < num_gateways; i++) + gateways[i] = gateways[i + 1]; + } + } + + max = af == AF_INET ? MAX_GATEWAYS_4 : MAX_GATEWAYS_6; + if(num_gateways > max) { + ex_error("Too many gateways specified. No more than %d", max); + return -1; + } + + gates = alloca(num_gateways * sizeof(*gates)); + + for(i = 0; i < num_gateways; i++) { + + if(!gateways[i]) + error("strdup"); + + if(getaddr(gateways[i], &gates[i]) < 0) { + ex_error(""); /* already reported */ + return -1; + } + if(gates[i].sa.sa_family != af) { + ex_error("IP versions mismatch in gateway addresses"); + return -1; + } + + free(gateways[i]); + } + + free(gateways); + gateways = NULL; + + if(af == AF_INET) { + struct in_addr *in; + + rtbuf_len = 4 + (num_gateways + 1) * sizeof(*in); + rtbuf = malloc(rtbuf_len); + if(!rtbuf) + error("malloc"); + + in = (struct in_addr *) &rtbuf[4]; + for(i = 0; i < num_gateways; i++) + memcpy(&in[i], &gates[i].sin.sin_addr, sizeof(*in)); + /* final hop */ + memcpy(&in[i], &dst_addr.sin.sin_addr, sizeof(*in)); + i++; + + rtbuf[0] = IPOPT_NOP; + rtbuf[1] = IPOPT_LSRR; + rtbuf[2] = (i * sizeof(*in)) + 3; + rtbuf[3] = IPOPT_MINOFF; + + } + else if(af == AF_INET6) { + struct in6_addr *in6; + struct ip6_rthdr *rth; + + /* IPV6_RTHDR_TYPE_0 length is 8 */ + rtbuf_len = 8 + num_gateways * sizeof(*in6); + rtbuf = malloc(rtbuf_len); + if(!rtbuf) + error("malloc"); + + rth = (struct ip6_rthdr *) rtbuf; + rth->ip6r_nxt = 0; + rth->ip6r_len = 2 * num_gateways; + rth->ip6r_type = ipv6_rthdr_type; + rth->ip6r_segleft = num_gateways; + + *((uint32_t *) (rth + 1)) = 0; + + in6 = (struct in6_addr *) (rtbuf + 8); + for(i = 0; i < num_gateways; i++) + memcpy(&in6[i], &gates[i].sin6.sin6_addr, sizeof(*in6)); + } + + return 0; +} + +/* Command line stuff */ +__attribute__((unused)) +static int set_af(CLIF_option *optn, char *arg) { + UNUSED(arg); + int vers = (long) optn->data; + + if(vers == 4) + af = AF_INET; + else if(vers == 6) + af = AF_INET6; + else + return -1; + + return 0; +} + +static int add_gateway(CLIF_option *optn, char *arg) { + UNUSED(optn); + if(num_gateways >= MAX_GATEWAYS_6) { /* 127 > 8 ... :) */ + fprintf(stderr, "Too many gateways specified."); + return -1; + } + + gateways = realloc(gateways, (num_gateways + 1) * sizeof(*gateways)); + if(!gateways) + error("malloc"); + gateways[num_gateways++] = strdup(arg); + + return 0; +} + +static int set_source(CLIF_option *optn, char *arg) { + UNUSED(optn); + return getaddr(arg, &src_addr); +} + +static int set_port(CLIF_option *optn, char *arg) { + unsigned int *up = (unsigned int *) optn->data; + char *q; + + *up = strtoul(arg, &q, 0); + if(q == arg) { + struct servent *s = getservbyname(arg, NULL); + + if(!s) + return -1; + *up = ntohs(s->s_port); + } + + return 0; +} + +static int set_module(CLIF_option *optn, char *arg) { + UNUSED(arg); + module = (char *) optn->data; + + return 0; +} + +static int set_mod_option(CLIF_option *optn, char *arg) { + UNUSED(optn); + if(!strcmp(arg, "help")) { + const tr_module *mod = tr_get_module(module); + + if(mod && mod->options) { + /* just to set common keyword flag... */ + CLIF_parse(1, &arg, 0, 0, CLIF_KEYWORD); + CLIF_print_options(NULL, mod->options); + } else + fprintf(stderr, "No options for module `%s'\n", module); + + exit(0); + } + + if(opts_idx >= sizeof(opts) / sizeof(*opts)) { + fprintf(stderr, "Too many module options\n"); + return -1; + } + + opts[opts_idx] = strdup(arg); + if(!opts[opts_idx]) + error("strdup"); + opts_idx++; + + return 0; +} + +static int set_raw(CLIF_option *optn, char *arg) { + char buf[1024]; + + module = "raw"; + + snprintf(buf, sizeof(buf), "protocol=%s", arg); + return set_mod_option(optn, buf); +} + +static int set_wait_specs(CLIF_option *optn, char *arg) { + UNUSED(optn); + char *p, *q; + + here_factor = near_factor = 0; + + wait_secs = strtod(p = arg, &q); + if(q == p) + return -1; + if(!*q++) + return 0; + + here_factor = strtod(p = q, &q); + if(q == p) + return -1; + if(!*q++) + return 0; + + near_factor = strtod(p = q, &q); + if(q == p || *q) + return -1; + + return 0; +} + +static int set_host(CLIF_argument *argm, char *arg, int index) { + UNUSED(argm); + UNUSED(index); + if(getaddr(arg, &dst_addr) < 0) + return -1; + + dst_name = arg; + + /* i.e., guess it by the addr in cmdline... */ + if(!af) + af = dst_addr.sa.sa_family; + + return 0; +} + +static CLIF_option option_list[] = { + { "4", 0, 0, "Use IPv4", set_af, (void *) 4, 0, CLIF_EXTRA }, + { "6", 0, 0, "Use IPv6", set_af, (void *) 6, 0, 0 }, + { "d", "debug", 0, "Enable socket level debugging", + CLIF_set_flag, &debug, 0, 0 }, + { "F", "dont-fragment", 0, "Do not fragment packets", + CLIF_set_flag, &dontfrag, 0, CLIF_ABBREV }, + { "f", "first", "first_ttl", "Start from the %s hop (instead from 1)", + CLIF_set_uint, &first_hop, 0, 0 }, + { "g", "gateway", "gate", "Route packets through the specified gateway " + "(maximum " _TEXT(MAX_GATEWAYS_4) " for IPv4 and " + _TEXT(MAX_GATEWAYS_6) " for IPv6)", + add_gateway, 0, 0, CLIF_SEVERAL }, + { "I", "icmp", 0, "Use ICMP ECHO for tracerouting", + set_module, "icmp", 0, 0 }, + { "T", "tcp", 0, "Use TCP SYN for tracerouting (default " + "port is " _TEXT(DEF_TCP_PORT) ")", + set_module, "tcp", 0, 0 }, + { "i", "interface", "device", "Specify a network interface " + "to operate with", + CLIF_set_string, &device, 0, 0 }, + { "m", "max-hops", "max_ttl", "Set the max number of hops (max TTL " + "to be reached). Default is " _TEXT(DEF_HOPS), + CLIF_set_uint, &max_hops, 0, 0 }, + { "N", "sim-queries", "squeries", "Set the number of probes " + "to be tried simultaneously (default is " + _TEXT(DEF_SIM_PROBES) ")", + CLIF_set_uint, &sim_probes, 0, 0 }, + { "n", 0, 0, "Do not resolve IP addresses to their domain names", + CLIF_set_flag, &noresolve, 0, 0 }, + { "p", "port", "port", "Set the destination port to use. " + "It is either initial udp port value for " + "\"default\" method (incremented by each probe, " + "default is " _TEXT(DEF_START_PORT) "), " + "or initial seq for \"icmp\" (incremented as well, " + "default from 1), or some constant destination port" + " for other methods (with default of " + _TEXT(DEF_TCP_PORT) " for \"tcp\", " + _TEXT(DEF_UDP_PORT) " for \"udp\", etc.)", + set_port, &dst_port_seq, 0, 0 }, + { "t", "tos", "tos", "Set the TOS (IPv4 type of service) or TC " + "(IPv6 traffic class) value for outgoing packets", + CLIF_set_uint, &tos, 0, 0 }, + { "l", "flowlabel", "flow_label", "Use specified %s for IPv6 packets", + CLIF_set_uint, &flow_label, 0, 0 }, + { "w", "wait", "MAX,HERE,NEAR", "Wait for a probe no more than HERE " + "(default " _TEXT(DEF_HERE_FACTOR) ") times longer " + "than a response from the same hop, or no more " + "than NEAR (default " _TEXT(DEF_NEAR_FACTOR) ") " + "times than some next hop, or MAX (default " + _TEXT(DEF_WAIT_SECS) ") seconds " + "(float point values allowed too)", + set_wait_specs, 0, 0, 0 }, + { "q", "queries", "nqueries", "Set the number of probes per each hop. " + "Default is " _TEXT(DEF_NUM_PROBES), + CLIF_set_uint, &probes_per_hop, 0, 0 }, + { "r", 0, 0, "Bypass the normal routing and send directly to a host " + "on an attached network", + CLIF_set_flag, &noroute, 0, 0 }, + { "s", "source", "src_addr", "Use source %s for outgoing packets", + set_source, 0, 0, 0 }, + { "z", "sendwait", "sendwait", "Minimal time interval between probes " + "(default " _TEXT(DEF_SEND_SECS) "). If the value " + "is more than 10, then it specifies a number " + "in milliseconds, else it is a number of seconds " + "(float point values allowed too)", + CLIF_set_double, &send_secs, 0, 0 }, + { "e", "extensions", 0, "Show ICMP extensions (if present), " + "including MPLS", + CLIF_set_flag, &extension, 0, CLIF_ABBREV }, + { "A", "as-path-lookups", 0, "Perform AS path lookups in routing " + "registries and print results directly after " + "the corresponding addresses", + CLIF_set_flag, &as_lookups, 0, 0 }, + { "M", "module", "name", "Use specified module (either builtin or " + "external) for traceroute operations. Most methods " + "have their shortcuts (`-I' means `-M icmp' etc.)", + CLIF_set_string, &module, 0, CLIF_EXTRA }, + { "O", "options", "OPTS", "Use module-specific option %s for the " + "traceroute module. Several %s allowed, separated " + "by comma. If %s is \"help\", print info about " + "available options", + set_mod_option, 0, 0, CLIF_SEVERAL | CLIF_EXTRA }, + { 0, "sport", "num", "Use source port %s for outgoing packets. " + "Implies `-N 1'", + set_port, &src_port, 0, CLIF_EXTRA }, + #ifdef SO_MARK + { 0, "fwmark", "num", "Set firewall mark for outgoing packets", + CLIF_set_uint, &fwmark, 0, 0 }, + #endif + { "U", "udp", 0, "Use UDP to particular port for tracerouting " + "(instead of increasing the port per each probe), " + "default port is " _TEXT(DEF_UDP_PORT), + set_module, "udp", 0, CLIF_EXTRA }, + { 0, "UL", 0, "Use UDPLITE for tracerouting (default dest port is " + _TEXT(DEF_UDP_PORT) ")", + set_module, "udplite", 0, CLIF_ONEDASH | CLIF_EXTRA }, + { "D", "dccp", 0, "Use DCCP Request for tracerouting (default " + "port is " _TEXT(DEF_DCCP_PORT) ")", + set_module, "dccp", 0, CLIF_EXTRA }, + { "P", "protocol", "prot", "Use raw packet of protocol %s " + "for tracerouting", + set_raw, 0, 0, CLIF_EXTRA }, + { 0, "mtu", 0, "Discover MTU along the path being traced. " + "Implies `-F -N 1'", + CLIF_set_flag, &mtudisc, 0, CLIF_EXTRA }, + { 0, "back", 0, "Guess the number of hops in the backward path " + "and print if it differs", + CLIF_set_flag, &backward, 0, CLIF_EXTRA }, + CLIF_VERSION_OPTION (version_string), + CLIF_HELP_OPTION, + CLIF_END_OPTION + }; + +static CLIF_argument arg_list[] = { + { "host", "The host to traceroute to", + set_host, 0, CLIF_STRICT }, + { "packetlen", "The full packet length (default is the length of " + "an IP header plus " _TEXT(DEF_DATA_LEN) "). Can be " + "ignored or increased to a minimal allowed value", + CLIF_arg_int, &packet_len, 0 }, + CLIF_END_ARGUMENT + }; + +static void do_it(void); + +int traceroute_main(int argc, char *argv[]) { + + setlocale(LC_ALL, ""); + setlocale(LC_NUMERIC, "C"); /* avoid commas in msec printed */ + + check_progname(argv[0]); + + if(CLIF_parse(argc, argv, option_list, arg_list, + CLIF_MAY_JOIN_ARG | CLIF_HELP_EMPTY) < 0 + ) + return -EADDRNOTAVAIL; //exit(2); + + ops = tr_get_module(module); + if(!ops) { + ex_error("Unknown traceroute module %s", module); + return -2; + } + + if(!first_hop || first_hop > max_hops) { + ex_error("first hop out of range"); + return -3; + } + if(max_hops > MAX_HOPS) { + ex_error("max hops cannot be more than " _TEXT(MAX_HOPS)); + return -4; + } + if(!probes_per_hop || probes_per_hop > MAX_PROBES) { + ex_error("no more than " _TEXT(MAX_PROBES) " probes per hop"); + return -5; + } + if(wait_secs < 0 || here_factor < 0 || near_factor < 0) { + ex_error("bad wait specifications `%g,%g,%g' used", + wait_secs, here_factor, near_factor); + return -6; + } + if(packet_len > MAX_PACKET_LEN) { + ex_error("too big packetlen %d specified", packet_len); + return -7; + } + if(src_addr.sa.sa_family && src_addr.sa.sa_family != af) { + ex_error("IP version mismatch in addresses specified"); + return -8; + } + if(send_secs < 0) { + ex_error("bad sendtime `%g' specified", send_secs); + return -9; + } + if(send_secs >= 10) /* it is milliseconds */ + send_secs /= 1000; + + if(af == AF_INET6 && (tos || flow_label)) + dst_addr.sin6.sin6_flowinfo = + htonl(((tos & 0xff) << 20) | (flow_label & 0x000fffff)); + + if(src_port) { + src_addr.sin.sin_port = htons((uint16_t) src_port); + src_addr.sa.sa_family = af; + } + + if(src_port || ops->one_per_time) { + sim_probes = 1; + here_factor = near_factor = 0; + } + + /* make sure we don't std{in,out,err} to open sockets */ + make_fd_used(0); + make_fd_used(1); + make_fd_used(2); + + if(init_ip_options() == -1) + return -10; + + header_len = (af == AF_INET ? sizeof(struct iphdr) + : + sizeof(struct ip6_hdr)) + + rtbuf_len + ops->header_len; + + if(mtudisc) { + dontfrag = 1; + sim_probes = 1; + if(packet_len < 0) + packet_len = MAX_PACKET_LEN; + } + + if(packet_len < 0) { + if(DEF_DATA_LEN >= ops->header_len) + data_len = DEF_DATA_LEN - ops->header_len; + } else { + if(packet_len >= (int) header_len) + data_len = packet_len - header_len; + } + + num_probes = max_hops * probes_per_hop; + probes = calloc(num_probes, sizeof(*probes)); + if(!probes) { + error("calloc"); + return -11; + } + + if(ops->options && opts_idx > 1) { + opts[0] = strdup(module); /* aka argv[0] ... */ + if(CLIF_parse(opts_idx, opts, ops->options, 0, CLIF_KEYWORD) < 0) + return -12; //exit(2); + } + + if(ops->init(&dst_addr, dst_port_seq, &data_len) < 0) { + ex_error("trace method's init failed"); + return -13; + } + + do_it(); + return 0; +} + +/* PRINT STUFF */ + +static void print_header(void) { + + /* Note, without ending new-line! */ + log_printf("traceroute to %s (%s), %u hops max, %zu byte packets", + dst_name, addr2str(&dst_addr), max_hops, + header_len + data_len); + fflush(stdout); +} + +static bool print_addr(sockaddr_any *res) { + bool is_final = false; + const char *str; + + if(!res->sa.sa_family) + return is_final; + + str = addr2str(res); + + if(noresolve) { + log_printf("%s", str); + if(str && !strcmp(dst_name, str)) + is_final = true; + } + else { + char buf[1024]; + + buf[0] = '\0'; + getnameinfo(&res->sa, sizeof(*res), buf, sizeof(buf), + 0, 0, NI_IDN); + log_printf(" %s (%s)", buf[0] ? buf : str, str); + if(buf[0] && !strcmp(dst_name, buf)) + is_final = true; + else + if(str && !strcmp(dst_name, str)) + is_final = true; + } + + if(as_lookups) + log_printf(" [%s]", get_as_path(str)); + + return is_final; +} + +static bool print_probe(probe *pb) { + bool is_final = false; + unsigned int idx = (pb - probes); + unsigned int ttl = idx / probes_per_hop + 1; + unsigned int np = idx % probes_per_hop; + + if(np == 0) + log_printf("\n%2u ", ttl); + + if(!pb->res.sa.sa_family) + log_printf(" *"); + else { + int prn = !np; /* print if the first... */ + + if(np) { /* ...and if differs with previous */ + probe *p; + + /* skip expired */ + for(p = pb - 1; np && !p->res.sa.sa_family; p--, np--) + ; + + if(!np || + !equal_addr(&p->res, &pb->res) || + (p->ext != pb->ext && + !(p->ext && pb->ext && !strcmp(p->ext, pb->ext))) || + (backward && p->recv_ttl != pb->recv_ttl) + ) + prn = 1; + } + + if(prn) { + is_final = print_addr(&pb->res); + if(pb->ext) + log_printf(" <%s>", pb->ext); + + if(backward && pb->recv_ttl) { + int hops = ttl2hops(pb->recv_ttl); + if(hops != (int) ttl) + log_printf(" '-%d'", hops); + } + } + } + + if(pb->recv_time) { + double diff = pb->recv_time - pb->send_time; + + log_printf(" %.3f ms", diff * 1000); + } + + if(pb->err_str[0]) + log_printf(" %s", pb->err_str); + + fflush(stdout); + + return is_final; +} + +static void print_end(void) { + + log_printf("\n"); +} + +/* Compute timeout stuff */ + +static double get_timeout(probe *pb) { + double value; + + if(here_factor) { + /* check for already replied from the same hop */ + int i, idx = (pb - probes); + probe *p = &probes[idx - (idx % probes_per_hop)]; + + for(i = 0; i < (int) probes_per_hop; i++, p++) { + /* `p == pb' skipped since !pb->done */ + + if(p->done && (value = p->recv_time - p->send_time) > 0) { + value += DEF_WAIT_PREC; + value *= here_factor; + return value < wait_secs ? value : wait_secs; + } + } + } + + if(near_factor) { + /* check forward for already replied */ + probe *p, *endp = probes + num_probes; + + for(p = pb + 1; p < endp && p->send_time; p++) { + + if(p->done && (value = p->recv_time - p->send_time) > 0) { + value += DEF_WAIT_PREC; + value *= near_factor; + return value < wait_secs ? value : wait_secs; + } + } + } + + return wait_secs; +} + +/* Check expiration stuff */ + +static void check_expired(probe *pb) { + int idx = (pb - probes); + probe *p, *endp = probes + num_probes; + probe *fp = NULL, *pfp = NULL; + + if(!pb->done) /* an ops method still not release it */ + return; + + /* check all the previous in the same hop */ + for(p = &probes[idx - (idx % probes_per_hop)]; p < pb; p++) { + + if(!p->done || /* too early to decide something */ + !p->final /* already ttl-exceeded in the same hop */ + ) + return; + + pfp = p; /* some of the previous probes is final */ + } + + /* check forward all the sent probes */ + for(p = pb + 1; p < endp && p->send_time; p++) { + + if(p->done) { /* some next probe already done... */ + if(!p->final) /* ...was ttl-exceeded. OK, we are expired. */ + return; + else { + fp = p; + break; + } + } + } + + if(!fp) /* no any final probe found. Assume expired. */ + return; + + /* Well. There is a situation "*(this) * * * * ... * * final" + We cannot guarantee that "final" is in its right place. + We've sent "sim_probes" simultaneously, and the final hop + can drop some of them and answer only for latest ones. + If we can detect/assume that it so, then just put "final" + to the (pseudo-expired) "this" place. + */ + + /* It seems that the case of "answers for latest ones only" + occurs mostly with icmp_unreach error answers ("!H" etc.). + Icmp_echoreply, tcp_reset and even icmp_port_unreach looks + like going in the right order. + */ + if(!fp->err_str[0]) /* not an icmp_unreach error report... */ + return; + + if(pfp || + (idx % probes_per_hop) + (fp - pb) < probes_per_hop + ) { + /* Either some previous (pfp) or some next probe + in this hop is final. It means that the whole hop is final. + Do the replace (it also causes further "final"s to be shifted + here too). + */ + goto replace_by_final; + } + + /* If the final probe is an icmp_unreachable report + (either in a case of some error, like "!H", or just port_unreach), + it could follow the "time-exceed" report from the *same* hop. + */ + for(p = pb - 1; p >= probes; p--) { + if(equal_addr(&p->res, &fp->res)) { + /* ...Yes. Put "final" to the "this" place. */ + goto replace_by_final; + } + } + + if(fp->recv_ttl) { + /* Consider the ttl value of the report packet and guess where + the "final" should be. If it seems that it should be + in the same hop as "this", then do replace. + */ + int back_hops, ttl; + + /* We assume that the reporting one has an initial ttl value + of either 64, or 128, or 255. It is most widely used + in the modern routers and computers. + The idea comes from tracepath(1) routine. + */ + back_hops = ttl2hops(fp->recv_ttl); + + /* It is possible that the back path differs from the forward + and therefore has different number of hops. To minimize + such an influence, get the nearest previous time-exceeded + probe and compare with it. + */ + for(p = pb - 1; p >= probes; p--) { + if(p->done && !p->final && p->recv_ttl) { + int hops = ttl2hops(p->recv_ttl); + + if(hops < back_hops) { + ttl = (p - probes) / probes_per_hop + 1; + back_hops = (back_hops - hops) + ttl; + break; + } + } + } + + ttl = idx / probes_per_hop + 1; + if(back_hops == ttl) + /* Yes! It seems that "final" should be at "this" place */ + goto replace_by_final; + else if(back_hops < ttl) + /* Hmmm... Assume better to replace here too... */ + goto replace_by_final; + + } + + /* No idea what to do. Assume expired. */ + + return; + + replace_by_final: + + *pb = *fp; + + memset(fp, 0, sizeof(*fp)); + /* block extra re-send */ + fp->send_time = 1.; + + return; +} + +probe *probe_by_seq(int seq) { + int n; + + if(seq <= 0) + return NULL; + + for(n = 0; n < (int) num_probes; n++) { + if(probes[n].seq == seq) + return &probes[n]; + } + + return NULL; +} + +probe *probe_by_sk(int sk) { + int n; + + if(sk <= 0) + return NULL; + + for(n = 0; n < (int) num_probes; n++) { + if(probes[n].sk == sk) + return &probes[n]; + } + + return NULL; +} + +static void poll_callback(int fd, int revents) { + + ops->recv_probe(fd, revents); +} + +static void do_it(void) { + int start = (first_hop - 1) * probes_per_hop; + int end = num_probes; + double last_send = 0; + + print_header(); + + while(start < end) { + int n, num = 0; + double next_time = 0; + double now_time = get_time(); + + for(n = start; n < end; n++) { + probe *pb = &probes[n]; + + if(n == start && /* probably time to print... */ + !pb->done && pb->send_time /* ...but yet not replied */ + ) { + double expire_time = pb->send_time + get_timeout(pb); + + if(expire_time > now_time) + next_time = expire_time; + else { + ops->expire_probe(pb); + check_expired(pb); + } + } + + if(pb->done) { + + if(n == start) { /* can print it now */ + if(print_probe(pb)) { + pb->final = 1; + } + //log_printf("(host=%s,%s recv_ttl=%d)", dst_name, (host) ? host : "-", pb->recv_ttl); + start++; + } + + /* { + char buf[1024]; + buf[0] = '\0'; + getnameinfo(&(pb->res.sa), sizeof((pb->res)), buf, sizeof(buf),0, 0, NI_IDN); + if(buf[0] && !strcmp(dst_name, buf)) + pb->real_final = true; + //else + //if(str && !strcmp(dst_name, str)) + // pb->real_final = true; + }*/ + + if(pb->final) + end = (n / probes_per_hop + 1) * probes_per_hop; + + continue; + } + + if(!pb->send_time) { + int ttl; + double next; + + if(send_secs && (next = last_send + send_secs) > now_time) { + next_time = next; + break; + } + + ttl = n / probes_per_hop + 1; + + ops->send_probe(pb, ttl); + + if(!pb->send_time) { + if(next_time) + break; /* have chances later */ + else + error("send probe"); + } + + last_send = pb->send_time; + } + + if(!next_time) + next_time = pb->send_time + get_timeout(pb); + + num++; + if(num >= (int) sim_probes) + break; + } + + if(next_time) { + double timeout = next_time - get_time(); + + if(timeout < 0) + timeout = 0; + + do_poll(timeout, poll_callback); + } + + } + + print_end(); + + return; +} + +void tune_socket(int sk) { + int i = 0; + + if(debug) { + i = 1; + if(setsockopt(sk, SOL_SOCKET, SO_DEBUG, &i, sizeof(i)) < 0) + error("setsockopt SO_DEBUG"); + } + +#ifdef SO_MARK + if(fwmark) { + if(setsockopt(sk, SOL_SOCKET, SO_MARK, + &fwmark, sizeof(fwmark)) < 0 + ) + error("setsockopt SO_MARK"); + } +#endif + + if(rtbuf && rtbuf_len) { + if(af == AF_INET) { + if(setsockopt(sk, IPPROTO_IP, IP_OPTIONS, + rtbuf, rtbuf_len) < 0 + ) + error("setsockopt IP_OPTIONS"); + } + else if(af == AF_INET6) { + if(setsockopt(sk, IPPROTO_IPV6, IPV6_RTHDR, + rtbuf, rtbuf_len) < 0 + ) + error("setsockopt IPV6_RTHDR"); + } + } + + bind_socket(sk); + + if(af == AF_INET) { + + i = dontfrag ? IP_PMTUDISC_PROBE : IP_PMTUDISC_DONT; + if(setsockopt(sk, SOL_IP, IP_MTU_DISCOVER, &i, sizeof(i)) < 0 && + (!dontfrag || (i = IP_PMTUDISC_DO, + setsockopt(sk, SOL_IP, IP_MTU_DISCOVER, &i, sizeof(i)) < 0)) + ) + error("setsockopt IP_MTU_DISCOVER"); + + if(tos) { + i = tos; + if(setsockopt(sk, SOL_IP, IP_TOS, &i, sizeof(i)) < 0) + error("setsockopt IP_TOS"); + } + + } + else if(af == AF_INET6) { + + i = dontfrag ? IPV6_PMTUDISC_PROBE : IPV6_PMTUDISC_DONT; + if(setsockopt(sk, SOL_IPV6, IPV6_MTU_DISCOVER, &i, sizeof(i)) < 0 && + (!dontfrag || (i = IPV6_PMTUDISC_DO, + setsockopt(sk, SOL_IPV6, IPV6_MTU_DISCOVER, &i, sizeof(i)) < 0)) + ) + error("setsockopt IPV6_MTU_DISCOVER"); + + if(flow_label) { + struct in6_flowlabel_req_ flr; + + memset(&flr, 0, sizeof(flr)); + flr.flr_label = htonl(flow_label & 0x000fffff); + flr.flr_action = IPV6_FL_A_GET; + flr.flr_flags = IPV6_FL_F_CREATE; + flr.flr_share = IPV6_FL_S_ANY; + memcpy(&flr.flr_dst, &dst_addr.sin6.sin6_addr, + sizeof(flr.flr_dst)); + + if(setsockopt(sk, IPPROTO_IPV6, IPV6_FLOWLABEL_MGR, + &flr, sizeof(flr)) < 0 + ) + error("setsockopt IPV6_FLOWLABEL_MGR"); + } + + if(tos) { + i = tos; + if(setsockopt(sk, IPPROTO_IPV6, IPV6_TCLASS, + &i, sizeof(i)) < 0 + ) + error("setsockopt IPV6_TCLASS"); + } + + if(tos || flow_label) { + i = 1; + if(setsockopt(sk, IPPROTO_IPV6, IPV6_FLOWINFO_SEND, + &i, sizeof(i)) < 0 + ) + error("setsockopt IPV6_FLOWINFO_SEND"); + } + } + + if(noroute) { + i = noroute; + if(setsockopt(sk, SOL_SOCKET, SO_DONTROUTE, &i, sizeof(i)) < 0) + error("setsockopt SO_DONTROUTE"); + } + + use_timestamp(sk); + + use_recv_ttl(sk); + + fcntl(sk, F_SETFL, O_NONBLOCK); + + return; +} + +void parse_icmp_res(probe *pb, int type, int code, int info) { + char *str = NULL; + char buf[sizeof(pb->err_str)]; + + if(af == AF_INET) { + + if(type == ICMP_TIME_EXCEEDED) { + if(code == ICMP_EXC_TTL) + return; + } + else if(type == ICMP_DEST_UNREACH) { + + switch (code) { + case ICMP_UNREACH_NET: + case ICMP_UNREACH_NET_UNKNOWN: + case ICMP_UNREACH_ISOLATED: + case ICMP_UNREACH_TOSNET: + str = "!N"; + break; + + case ICMP_UNREACH_HOST: + case ICMP_UNREACH_HOST_UNKNOWN: + case ICMP_UNREACH_TOSHOST: + str = "!H"; + break; + + case ICMP_UNREACH_NET_PROHIB: + case ICMP_UNREACH_HOST_PROHIB: + case ICMP_UNREACH_FILTER_PROHIB: + str = "!X"; + break; + + case ICMP_UNREACH_PORT: + /* dest host is reached */ + str = ""; + break; + + case ICMP_UNREACH_PROTOCOL: + str = "!P"; + break; + + case ICMP_UNREACH_NEEDFRAG: + snprintf(buf, sizeof(buf), "!F-%d", info); + str = buf; + break; + + case ICMP_UNREACH_SRCFAIL: + str = "!S"; + break; + + case ICMP_UNREACH_HOST_PRECEDENCE: + str = "!V"; + break; + + case ICMP_UNREACH_PRECEDENCE_CUTOFF: + str = "!C"; + break; + + default: + snprintf(buf, sizeof(buf), "!<%u>", code); + str = buf; + break; + } + } + + } + else if(af == AF_INET6) { + + if(type == ICMP6_TIME_EXCEEDED) { + if(code == ICMP6_TIME_EXCEED_TRANSIT) + return; + } + else if(type == ICMP6_DST_UNREACH) { + + switch (code) { + + case ICMP6_DST_UNREACH_NOROUTE: + str = "!N"; + break; + + case ICMP6_DST_UNREACH_BEYONDSCOPE: + case ICMP6_DST_UNREACH_ADDR: + str = "!H"; + break; + + case ICMP6_DST_UNREACH_ADMIN: + str = "!X"; + break; + + case ICMP6_DST_UNREACH_NOPORT: + /* dest host is reached */ + str = ""; + break; + + default: + snprintf(buf, sizeof(buf), "!<%u>", code); + str = buf; + break; + } + } + else if(type == ICMP6_PACKET_TOO_BIG) { + snprintf(buf, sizeof(buf), "!F-%d", info); + str = buf; + } + } + + if(!str) { + snprintf(buf, sizeof(buf), "!<%u-%u>", type, code); + str = buf; + } + + if(*str) { + strncpy(pb->err_str, str, sizeof(pb->err_str)); + pb->err_str[sizeof(pb->err_str) - 1] = '\0'; + } + // final present + pb->final = 1; + + return; +} + +static void parse_local_res(probe *pb, int ee_errno, int info) { + + if(ee_errno == EMSGSIZE && info != 0) { + snprintf(pb->err_str, sizeof(pb->err_str) - 1, "!F-%d", info); + pb->final = 1; + return; + } + + errno = ee_errno; + error("local recverr"); +} + +void probe_done(probe *pb) { + + if(pb->sk) { + del_poll(pb->sk); + close(pb->sk); + pb->sk = 0; + } + + pb->seq = 0; + + pb->done = 1; +} + +void recv_reply(int sk, int err, check_reply_t check_reply) { + struct msghdr msg; + sockaddr_any from; + struct iovec iov; + int n; + probe *pb; + char buf[1280]; /* min mtu for ipv6 ( >= 576 for ipv4) */ + char *bufp = buf; + char control[1024]; + struct cmsghdr *cm; + double recv_time = 0; + int recv_ttl = 0; + struct sock_extended_err *ee = NULL; + + memset(&msg, 0, sizeof(msg)); + msg.msg_name = &from; + msg.msg_namelen = sizeof(from); + msg.msg_control = control; + msg.msg_controllen = sizeof(control); + iov.iov_base = buf; + iov.iov_len = sizeof(buf); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + n = recvmsg(sk, &msg, err ? MSG_ERRQUEUE : 0); + if(n < 0) + return; + + /* when not MSG_ERRQUEUE, AF_INET returns full ipv4 header + on raw sockets... + */ + + if(!err && + af == AF_INET && + /* XXX: Assume that the presence of an extra header means + that it is not a raw socket... + */ + ops->header_len == 0 + ) { + struct iphdr *ip = (struct iphdr *) bufp; + int hlen; + + if(n < (int) sizeof(struct iphdr)) + return; + + hlen = ip->ihl << 2; + if(n < hlen) + return; + + bufp += hlen; + n -= hlen; + } + + pb = check_reply(sk, err, &from, bufp, n); + if(!pb) { + + /* for `frag needed' case at the local host, + kernel >= 3.13 sends local error (no more icmp) + */ + if(!n && err && dontfrag) { + pb = &probes[(first_hop - 1) * probes_per_hop]; + if(pb->done) + return; + } else + return; + } + + /* Parse CMSG stuff */ + + for(cm = CMSG_FIRSTHDR(&msg); cm; cm = CMSG_NXTHDR(&msg, cm)) { + void *ptr = CMSG_DATA(cm); + + if(cm->cmsg_level == SOL_SOCKET) { + + if(cm->cmsg_type == SO_TIMESTAMP) { + struct timeval *tv = (struct timeval *) ptr; + + recv_time = tv->tv_sec + tv->tv_usec / 1000000.; + } + } + else if(cm->cmsg_level == SOL_IP) { + + if(cm->cmsg_type == IP_TTL) + recv_ttl = *((int *) ptr); + else if(cm->cmsg_type == IP_RECVERR) { + + ee = (struct sock_extended_err *) ptr; + + if(ee->ee_origin != SO_EE_ORIGIN_ICMP && + ee->ee_origin != SO_EE_ORIGIN_LOCAL + ) + return; + + /* dgram icmp sockets might return extra things... */ + if(ee->ee_origin == SO_EE_ORIGIN_ICMP && + (ee->ee_type == ICMP_SOURCE_QUENCH || + ee->ee_type == ICMP_REDIRECT) + ) + return; + } + } + else if(cm->cmsg_level == SOL_IPV6) { + + if(cm->cmsg_type == IPV6_HOPLIMIT) + recv_ttl = *((int *) ptr); + else if(cm->cmsg_type == IPV6_RECVERR) { + + ee = (struct sock_extended_err *) ptr; + + if(ee->ee_origin != SO_EE_ORIGIN_ICMP6 && + ee->ee_origin != SO_EE_ORIGIN_LOCAL + ) + return; + } + } + } + + if(!recv_time) + recv_time = get_time(); + + if(!err) + memcpy(&pb->res, &from, sizeof(pb->res)); + + pb->recv_time = recv_time; + + pb->recv_ttl = recv_ttl; + + if(ee && ee->ee_origin != SO_EE_ORIGIN_LOCAL) { /* icmp or icmp6 */ + memcpy(&pb->res, SO_EE_OFFENDER(ee), sizeof(pb->res)); + parse_icmp_res(pb, ee->ee_type, ee->ee_code, ee->ee_info); + } + + if(ee && ee->ee_origin == SO_EE_ORIGIN_LOCAL) + parse_local_res(pb, ee->ee_errno, ee->ee_info); + + if(ee && + mtudisc && + ee->ee_info >= header_len && + ee->ee_info < header_len + data_len + ) { + data_len = ee->ee_info - header_len; + + probe_done(pb); + + /* clear this probe (as actually the previous hop answers here) + but fill its `err_str' by the info obtained. Ugly, but easy... + */ + memset(pb, 0, sizeof(*pb)); + snprintf(pb->err_str, sizeof(pb->err_str) - 1, "F=%d", ee->ee_info); + + return; + } + + if(ee && + extension && + header_len + n >= (128 + 8) && /* at least... (rfc4884) */ + header_len <= 128 && /* paranoia */ + ((af == AF_INET && (ee->ee_type == ICMP_TIME_EXCEEDED || + ee->ee_type == ICMP_DEST_UNREACH || + ee->ee_type == ICMP_PARAMETERPROB)) || + (af == AF_INET6 && (ee->ee_type == ICMP6_TIME_EXCEEDED || + ee->ee_type == ICMP6_DST_UNREACH)) + ) + ) { + int step; + int offs = 128 - header_len; + + if(n > (int) data_len) + step = 0; /* guaranteed at 128 ... */ + else + step = af == AF_INET ? 4 : 8; + + handle_extensions(pb, bufp + offs, n - offs, step); + } + + probe_done(pb); +} + +int equal_addr(const sockaddr_any *a, const sockaddr_any *b) { + + if(!a->sa.sa_family) + return 0; + + if(a->sa.sa_family != b->sa.sa_family) + return 0; + + if(a->sa.sa_family == AF_INET6) + return !memcmp(&a->sin6.sin6_addr, &b->sin6.sin6_addr, + sizeof(a->sin6.sin6_addr)); + else + return !memcmp(&a->sin.sin_addr, &b->sin.sin_addr, + sizeof(a->sin.sin_addr)); + return 0; /* not reached */ +} + +void bind_socket(int sk) { + sockaddr_any *addr, tmp; + + if(device) { + if(setsockopt(sk, SOL_SOCKET, SO_BINDTODEVICE, + device, strlen(device) + 1) < 0 + ) + error("setsockopt SO_BINDTODEVICE"); + } + + if(!src_addr.sa.sa_family) { + memset(&tmp, 0, sizeof(tmp)); + tmp.sa.sa_family = af; + addr = &tmp; + } else + addr = &src_addr; + + if(bind(sk, &addr->sa, sizeof(*addr)) < 0) + error("bind"); + + return; +} + +void use_timestamp(int sk) { + int n = 1; + + setsockopt(sk, SOL_SOCKET, SO_TIMESTAMP, &n, sizeof(n)); + /* foo on errors... */ +} + +void use_recv_ttl(int sk) { + int n = 1; + + if(af == AF_INET) + setsockopt(sk, SOL_IP, IP_RECVTTL, &n, sizeof(n)); + else if(af == AF_INET6) + setsockopt(sk, SOL_IPV6, IPV6_RECVHOPLIMIT, &n, sizeof(n)); + /* foo on errors */ +} + +void use_recverr(int sk) { + int val = 1; + + if(af == AF_INET) { + if(setsockopt(sk, SOL_IP, IP_RECVERR, &val, sizeof(val)) < 0) + error("setsockopt IP_RECVERR"); + } + else if(af == AF_INET6) { + if(setsockopt(sk, SOL_IPV6, IPV6_RECVERR, &val, sizeof(val)) < 0) + error("setsockopt IPV6_RECVERR"); + } +} + +void set_ttl(int sk, int ttl) { + + if(af == AF_INET) { + if(setsockopt(sk, SOL_IP, IP_TTL, &ttl, sizeof(ttl)) < 0) + error("setsockopt IP_TTL"); + } + else if(af == AF_INET6) { + if(setsockopt(sk, SOL_IPV6, IPV6_UNICAST_HOPS, + &ttl, sizeof(ttl)) < 0 + ) + error("setsockopt IPV6_UNICAST_HOPS"); + } +} + +int do_send(int sk, const void *data, size_t len, const sockaddr_any *addr) { + int res; + + if(!addr || raw_can_connect()) + res = send(sk, data, len, 0); + else + res = sendto(sk, data, len, 0, &addr->sa, sizeof(*addr)); + + if(res < 0) { + if(errno == ENOBUFS || errno == EAGAIN) + return res; + if(errno == EMSGSIZE) + return 0; /* recverr will say more... */ + error("send"); /* not recoverable */ + } + + return res; +} + +/* There is a bug in the kernel before 2.6.25, which prevents icmp errors + to be obtained by MSG_ERRQUEUE for ipv6 connected raw sockets. + */ +static int can_connect = -1; + +#define VER(A,B,C,D) (((((((A) << 8) | (B)) << 8) | (C)) << 8) | (D)) + +int raw_can_connect(void) { + + if(can_connect < 0) { + + if(af == AF_INET) + can_connect = 1; + else { /* AF_INET6 */ + struct utsname uts; + int n; + unsigned int a, b, c, d = 0; + + if(uname(&uts) < 0) + return 0; + + n = sscanf(uts.release, "%u.%u.%u.%u", &a, &b, &c, &d); + can_connect = (n >= 3 && VER (a, b, c, d) >= VER(2, 6, 25, 0)); + } + } + + return can_connect; +} + +/** + * Traceroute host + * + * @addr[in] host name or IP address + * @hops[out] hops count + * @time_usec[out] latency in microseconds + * @return 0 Ok, -1 error + */ +int traceroute_util(const char *addr, int *hops, int *time_usec) +{ + UNUSED(hops); + int type = 6; // ipv4 or ipv6 + int argc = 3; + const char *argv[argc]; + if(type != 4) + argv[0] = "traceroute6"; + else + argv[0] = "traceroute4"; + argv[1] = "-4"; // ipv4 + argv[2] = addr; + + *hops = 0; + *time_usec = 0; + + int ret = traceroute_main(argc, (char**) argv); + if(!ret) { + ret = -1; + for(int i = 0; i < (int) num_probes; i++) { + probe *one_probe = probes + i; + if(one_probe->done && one_probe->final && one_probe->recv_ttl) { + *hops = i / DEF_NUM_PROBES + 1; + *time_usec = (int) ((one_probe->recv_time - one_probe->send_time) * 1000000); + // if error -> not found host + if(!strlen(one_probe->err_str)) + ret = 1; + break; + } + } + /*if(one_probe->done) + printf("%d(%d) dseq=%d sk=%d done=%d final=%d recv_ttl=%d dt=%lf err='%s'\n", i + 1, + i / DEF_NUM_PROBES + 1, + one_probe->seq, one_probe->sk, one_probe->done, + one_probe->final, one_probe->recv_ttl, one_probe->recv_time - one_probe->send_time, + one_probe->err_str);*/ + } + free(probes); + + return (ret == 1) ? 0 : ret; +} diff --git a/modules/net/iputils/traceroute/traceroute.h b/modules/net/iputils/traceroute/traceroute.h new file mode 100644 index 0000000000..0db40c544e --- /dev/null +++ b/modules/net/iputils/traceroute/traceroute.h @@ -0,0 +1,107 @@ +/* + Copyright (c) 2006, 2007 Dmitry Butskoy + <buc@citadel.stu.neva.ru> + License: GPL v2 or any later + + See COPYING for the status of this software. +*/ + +#include <netinet/in.h> + +#include "clif.h" +#include "../iputils.h" + +union common_sockaddr { + struct sockaddr sa; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; +}; +typedef union common_sockaddr sockaddr_any; + +struct probe_struct { + int done; + int final; + sockaddr_any res; + double send_time; + double recv_time; + int recv_ttl; + int sk; + int seq; + char *ext; + char err_str[16]; /* assume enough */ +}; +typedef struct probe_struct probe; + + +struct tr_module_struct { + struct tr_module_struct *next; + const char *name; + int (*init) (const sockaddr_any *dest, + unsigned int port_seq, size_t *packet_len); + void (*send_probe) (probe *pb, int ttl); + void (*recv_probe) (int fd, int revents); + void (*expire_probe) (probe *pb); + CLIF_option *options; /* per module options, if any */ + int one_per_time; /* no simultaneous probes */ + size_t header_len; /* additional header length (aka for udp) */ +}; +typedef struct tr_module_struct tr_module; + + +#define __TEXT(X) #X +#define _TEXT(X) __TEXT(X) + +#define DEF_START_PORT 33434 /* start for traditional udp method */ +#define DEF_UDP_PORT 53 /* dns */ +#define DEF_TCP_PORT 80 /* web */ +#define DEF_DCCP_PORT DEF_START_PORT /* is it a good choice?... */ +#define DEF_RAW_PROT 253 /* for experimentation and testing, rfc3692 */ + + +void error (const char *str) __attribute__((noreturn)); +void error_or_perm (const char *str) __attribute__((noreturn)); + +double get_time (void); +void tune_socket (int sk); +void parse_icmp_res (probe *pb, int type, int code, int info); +void probe_done (probe *pb); + +typedef probe *(*check_reply_t) (int sk, int err, sockaddr_any *from, + char *buf, size_t len); +void recv_reply (int sk, int err, check_reply_t check_reply); + +int equal_addr (const sockaddr_any *a, const sockaddr_any *b); + +probe *probe_by_seq (int seq); +probe *probe_by_sk (int sk); + +void bind_socket (int sk); +void use_timestamp (int sk); +void use_recv_ttl (int sk); +void use_recverr (int sk); +void set_ttl (int sk, int ttl); +int do_send (int sk, const void *data, size_t len, const sockaddr_any *addr); + +void add_poll (int fd, int events); +void del_poll (int fd); +void do_poll (double timeout, void (*callback) (int fd, int revents)); + +void handle_extensions (probe *pb, char *buf, int len, int step); +const char *get_as_path (const char *query); + +int raw_can_connect (void); + +unsigned int random_seq (void); +uint16_t in_csum (const void *ptr, size_t len); + + +void tr_register_module (tr_module *module); +const tr_module *tr_get_module (const char *name); + +#define TR_MODULE(MOD) \ +static void __init_ ## MOD (void) __attribute__ ((constructor)); \ +static void __init_ ## MOD (void) { \ + \ + tr_register_module (&MOD); \ +} + diff --git a/modules/net/srv/CMakeLists.txt b/modules/net/srv/CMakeLists.txt index a59328f7d3..2e61dfc244 100644 --- a/modules/net/srv/CMakeLists.txt +++ b/modules/net/srv/CMakeLists.txt @@ -1,12 +1,13 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_net_srv) -set(DAP_CHAIN_NET_SRV_SRCS *.c) +file(GLOB DAP_CHAIN_NET_SRV_SRCS *.c) -set(DAP_CHAIN_NET_SRV_HEADERS include/*.h) +file(GLOB DAP_CHAIN_NET_SRV_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_SRCS} ${DAP_CHAIN_NET_SRV_HEADERS}) target_link_libraries(dap_chain_net_srv dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_net dap_chain_wallet) target_include_directories(dap_chain_net_srv INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/net/win32/ip.h b/modules/net/win32/ip.h new file mode 100644 index 0000000000..df3d54a834 --- /dev/null +++ b/modules/net/win32/ip.h @@ -0,0 +1,301 @@ +#pragma once + +/* Copyright (C) 1991-2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef __NETINET_IP_H +#define __NETINET_IP_H 1 + +//#include <features.h> +//#include <sys/types.h> + +//#include <netinet/in.h> + +struct timestamp + { + uint8_t len; + uint8_t ptr; +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int flags:4; + unsigned int overflow:4; +#elif __BYTE_ORDER == __BIG_ENDIAN + unsigned int overflow:4; + unsigned int flags:4; +#else +# error "Please fix <bits/endian.h>" +#endif + uint32_t data[9]; + }; + +struct iphdr + { +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int ihl:4; + unsigned int version:4; +#elif __BYTE_ORDER == __BIG_ENDIAN + unsigned int version:4; + unsigned int ihl:4; +#else +# error "Please fix <bits/endian.h>" +#endif + uint8_t tos; + uint16_t tot_len; + uint16_t id; + uint16_t frag_off; + uint8_t ttl; + uint8_t protocol; + uint16_t check; + uint32_t saddr; + uint32_t daddr; + /*The options start here. */ + }; + +#ifdef __USE_MISC +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip.h 8.1 (Berkeley) 6/10/93 + */ + +/* + * Definitions for internet protocol version 4. + * Per RFC 791, September 1981. + */ + +/* + * Structure of an internet header, naked of options. + */ +struct ip + { +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int ip_hl:4; /* header length */ + unsigned int ip_v:4; /* version */ +#endif +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int ip_v:4; /* version */ + unsigned int ip_hl:4; /* header length */ +#endif + uint8_t ip_tos; /* type of service */ + unsigned short ip_len; /* total length */ + unsigned short ip_id; /* identification */ + unsigned short ip_off; /* fragment offset field */ +#define IP_RF 0x8000 /* reserved fragment flag */ +#define IP_DF 0x4000 /* dont fragment flag */ +#define IP_MF 0x2000 /* more fragments flag */ +#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ + uint8_t ip_ttl; /* time to live */ + uint8_t ip_p; /* protocol */ + unsigned short ip_sum; /* checksum */ + struct in_addr ip_src, ip_dst; /* source and dest address */ + }; + +/* + * Time stamp option structure. + */ +struct ip_timestamp + { + uint8_t ipt_code; /* IPOPT_TS */ + uint8_t ipt_len; /* size of structure (variable) */ + uint8_t ipt_ptr; /* index of current entry */ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int ipt_flg:4; /* flags, see below */ + unsigned int ipt_oflw:4; /* overflow counter */ +#endif +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int ipt_oflw:4; /* overflow counter */ + unsigned int ipt_flg:4; /* flags, see below */ +#endif + uint32_t data[9]; + }; +#endif /* __USE_MISC */ + +#define IPVERSION 4 /* IP version number */ +#define IP_MAXPACKET 65535 /* maximum packet size */ + +/* + * Definitions for Explicit Congestion Notification (ECN) + * + * Taken from RFC-3168, Section 5. + */ + +#define IPTOS_ECN_MASK 0x03 +#define IPTOS_ECN(x) ((x) & IPTOS_ECN_MASK) +#define IPTOS_ECN_NOT_ECT 0x00 +#define IPTOS_ECN_ECT1 0x01 +#define IPTOS_ECN_ECT0 0x02 +#define IPTOS_ECN_CE 0x03 + +/* + * Definitions for IP differentiated services code points (DSCP) + * + * Taken from RFC-2597, Section 6 and RFC-2598, Section 2.3. + */ + +#define IPTOS_DSCP_MASK 0xfc +#define IPTOS_DSCP(x) ((x) & IPTOS_DSCP_MASK) +#define IPTOS_DSCP_AF11 0x28 +#define IPTOS_DSCP_AF12 0x30 +#define IPTOS_DSCP_AF13 0x38 +#define IPTOS_DSCP_AF21 0x48 +#define IPTOS_DSCP_AF22 0x50 +#define IPTOS_DSCP_AF23 0x58 +#define IPTOS_DSCP_AF31 0x68 +#define IPTOS_DSCP_AF32 0x70 +#define IPTOS_DSCP_AF33 0x78 +#define IPTOS_DSCP_AF41 0x88 +#define IPTOS_DSCP_AF42 0x90 +#define IPTOS_DSCP_AF43 0x98 +#define IPTOS_DSCP_EF 0xb8 + +/* + * In RFC 2474, Section 4.2.2.1, the Class Selector Codepoints subsume + * the old ToS Precedence values. + */ + +#define IPTOS_CLASS_MASK 0xe0 +#define IPTOS_CLASS(class) ((class) & IPTOS_CLASS_MASK) +#define IPTOS_CLASS_CS0 0x00 +#define IPTOS_CLASS_CS1 0x20 +#define IPTOS_CLASS_CS2 0x40 +#define IPTOS_CLASS_CS3 0x60 +#define IPTOS_CLASS_CS4 0x80 +#define IPTOS_CLASS_CS5 0xa0 +#define IPTOS_CLASS_CS6 0xc0 +#define IPTOS_CLASS_CS7 0xe0 + +#define IPTOS_CLASS_DEFAULT IPTOS_CLASS_CS0 + +/* + * Definitions for IP type of service (ip_tos) [deprecated; use DSCP + * and CS definitions above instead.] + */ +#define IPTOS_TOS_MASK 0x1E +#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK) +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 +#define IPTOS_LOWCOST 0x02 +#define IPTOS_MINCOST IPTOS_LOWCOST + +/* + * Definitions for IP precedence (also in ip_tos) [also deprecated.] + */ +#define IPTOS_PREC_MASK IPTOS_CLASS_MASK +#define IPTOS_PREC(tos) IPTOS_CLASS(tos) +#define IPTOS_PREC_NETCONTROL IPTOS_CLASS_CS7 +#define IPTOS_PREC_INTERNETCONTROL IPTOS_CLASS_CS6 +#define IPTOS_PREC_CRITIC_ECP IPTOS_CLASS_CS5 +#define IPTOS_PREC_FLASHOVERRIDE IPTOS_CLASS_CS4 +#define IPTOS_PREC_FLASH IPTOS_CLASS_CS3 +#define IPTOS_PREC_IMMEDIATE IPTOS_CLASS_CS2 +#define IPTOS_PREC_PRIORITY IPTOS_CLASS_CS1 +#define IPTOS_PREC_ROUTINE IPTOS_CLASS_CS0 + +/* + * Definitions for options. + */ +#define IPOPT_COPY 0x80 +#define IPOPT_CLASS_MASK 0x60 +#define IPOPT_NUMBER_MASK 0x1f + +#define IPOPT_COPIED(o) ((o) & IPOPT_COPY) +#define IPOPT_CLASS(o) ((o) & IPOPT_CLASS_MASK) +#define IPOPT_NUMBER(o) ((o) & IPOPT_NUMBER_MASK) + +#define IPOPT_CONTROL 0x00 +#define IPOPT_RESERVED1 0x20 +#define IPOPT_DEBMEAS 0x40 +#define IPOPT_MEASUREMENT IPOPT_DEBMEAS +#define IPOPT_RESERVED2 0x60 + +#define IPOPT_EOL 0 /* end of option list */ +#define IPOPT_END IPOPT_EOL +#define IPOPT_NOP 1 /* no operation */ +#define IPOPT_NOOP IPOPT_NOP + +#define IPOPT_RR 7 /* record packet route */ +#define IPOPT_TS 68 /* timestamp */ +#define IPOPT_TIMESTAMP IPOPT_TS +#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ +#define IPOPT_SEC IPOPT_SECURITY +#define IPOPT_LSRR 131 /* loose source route */ +#define IPOPT_SATID 136 /* satnet id */ +#define IPOPT_SID IPOPT_SATID +#define IPOPT_SSRR 137 /* strict source route */ +#define IPOPT_RA 148 /* router alert */ + +/* + * Offsets to fields in options other than EOL and NOP. + */ +#define IPOPT_OPTVAL 0 /* option ID */ +#define IPOPT_OLEN 1 /* option length */ +#define IPOPT_OFFSET 2 /* offset within option */ +#define IPOPT_MINOFF 4 /* min value of above */ + +#define MAX_IPOPTLEN 40 + +/* flag bits for ipt_flg */ +#define IPOPT_TS_TSONLY 0 /* timestamps only */ +#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ +#define IPOPT_TS_PRESPEC 3 /* specified modules only */ + +/* bits for security (not byte swapped) */ +#define IPOPT_SECUR_UNCLASS 0x0000 +#define IPOPT_SECUR_CONFID 0xf135 +#define IPOPT_SECUR_EFTO 0x789a +#define IPOPT_SECUR_MMMM 0xbc4d +#define IPOPT_SECUR_RESTR 0xaf13 +#define IPOPT_SECUR_SECRET 0xd788 +#define IPOPT_SECUR_TOPSECRET 0x6bc5 + +/* + * Internet implementation parameters. + */ +#define MAXTTL 255 /* maximum time to live (seconds) */ +#define IPDEFTTL 64 /* default ttl, from RFC 1340 */ +#define IPFRAGTTL 60 /* time to live for frags, slowhz */ +#define IPTTLDEC 1 /* subtracted when forwarding */ + +#define IP_MSS 576 /* default maximum segment size */ + + +#endif /* netinet/ip.h */ diff --git a/modules/net/win32/iphdr.h b/modules/net/win32/iphdr.h new file mode 100644 index 0000000000..f2533f910c --- /dev/null +++ b/modules/net/win32/iphdr.h @@ -0,0 +1,112 @@ +#pragma once + +// Align on a 1-byte boundary +//#include <pshpack1.h> + +#pragma pack(push,1) + +// IPv4 header +typedef struct ip_hdr +{ + unsigned char ip_verlen; // 4-bit IPv4 version + // 4-bit header length (in 32-bit words) + unsigned char ip_tos; // IP type of service + unsigned short ip_totallength; // Total length + unsigned short ip_id; // Unique identifier + unsigned short ip_offset; // Fragment offset field + unsigned char ip_ttl; // Time to live + unsigned char ip_protocol; // Protocol(TCP,UDP etc) + unsigned short ip_checksum; // IP checksum + unsigned int ip_srcaddr; // Source address + unsigned int ip_destaddr; // Source address + +} IPV4_HDR, *PIPV4_HDR, FAR * LPIPV4_HDR; + +// IPv4 option header +typedef struct ipv4_option_hdr +{ + unsigned char opt_code; // option type + unsigned char opt_len; // length of the option header + unsigned char opt_ptr; // offset into options + unsigned long opt_addr[9]; // list of IPv4 addresses +} IPV4_OPTION_HDR, *PIPV4_OPTION_HDR, FAR *LPIPV4_OPTION_HDR; + +// ICMP header +typedef struct icmp_hdr +{ + unsigned char icmp_type; + unsigned char icmp_code; + unsigned short icmp_checksum; + unsigned short icmp_id; + unsigned short icmp_sequence; +} ICMP_HDR, *PICMP_HDR, FAR *LPICMP_HDR; + +// IPv6 protocol header +typedef struct ipv6_hdr +{ + unsigned long ipv6_vertcflow; // 4-bit IPv6 version + // 8-bit traffic class + // 20-bit flow label + unsigned short ipv6_payloadlen; // payload length + unsigned char ipv6_nexthdr; // next header protocol value + unsigned char ipv6_hoplimit; // TTL + struct in6_addr ipv6_srcaddr; // Source address + struct in6_addr ipv6_destaddr; // Destination address +} IPV6_HDR, *PIPV6_HDR, FAR * LPIPV6_HDR; + +// IPv6 fragment header +typedef struct ipv6_fragment_hdr +{ + unsigned char ipv6_frag_nexthdr; + unsigned char ipv6_frag_reserved; + unsigned short ipv6_frag_offset; + unsigned long ipv6_frag_id; +} IPV6_FRAGMENT_HDR, *PIPV6_FRAGMENT_HDR, FAR * LPIPV6_FRAGMENT_HDR; + +// ICMPv6 header +typedef struct icmpv6_hdr { + unsigned char icmp6_type; + unsigned char icmp6_code; + unsigned short icmp6_checksum; +} ICMPV6_HDR; + +// ICMPv6 echo request body +typedef struct icmpv6_echo_request +{ + unsigned short icmp6_echo_id; + unsigned short icmp6_echo_sequence; +} ICMPV6_ECHO_REQUEST; + +// Define the UDP header +typedef struct udp_hdr +{ + unsigned short src_portno; // Source port no. + unsigned short dst_portno; // Dest. port no. + unsigned short udp_length; // Udp packet length + unsigned short udp_checksum; // Udp checksum (optional) +} UDP_HDR, *PUDP_HDR; + +// IPv4 option for record route +#define IP_RECORD_ROUTE 0x7 + +// ICMP6 protocol value (used in the socket call and IPv6 header) +#define IPPROTO_ICMP6 58 + +// ICMP types and codes +#define ICMPV4_ECHO_REQUEST_TYPE 8 +#define ICMPV4_ECHO_REQUEST_CODE 0 +#define ICMPV4_ECHO_REPLY_TYPE 0 +#define ICMPV4_ECHO_REPLY_CODE 0 +#define ICMPV4_MINIMUM_HEADER 8 + +// ICPM6 types and codes +#define ICMPV6_ECHO_REQUEST_TYPE 128 +#define ICMPV6_ECHO_REQUEST_CODE 0 +#define ICMPV6_ECHO_REPLY_TYPE 129 +#define ICMPV6_ECHO_REPLY_CODE 0 + +#pragma pack(pop) + +// Restore byte alignment back to default + +//#include <poppack.h> diff --git a/modules/service/app-db/CMakeLists.txt b/modules/service/app-db/CMakeLists.txt index f985c4768b..07e2032d56 100644 --- a/modules/service/app-db/CMakeLists.txt +++ b/modules/service/app-db/CMakeLists.txt @@ -1,12 +1,13 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_net_srv_app_db) -set(DAP_CHAIN_NET_SRV_APP_DB_SRCS *.c) +file(GLOB DAP_CHAIN_NET_SRV_APP_DB_SRCS *.c) -set(DAP_CHAIN_NET_SRV_APP_DB_HEADERS include/*.h) +file(GLOB DAP_CHAIN_NET_SRV_APP_DB_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_APP_DB_SRCS} ${DAP_CHAIN_NET_SRV_APP_DB_HEADERS}) target_link_libraries(dap_chain_net_srv_app_db dap_chain_net_srv dap_chain_net_srv_app) target_include_directories(dap_chain_net_srv_app_db INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/service/app/CMakeLists.txt b/modules/service/app/CMakeLists.txt index 9e3e5248f7..1c01d2e7eb 100644 --- a/modules/service/app/CMakeLists.txt +++ b/modules/service/app/CMakeLists.txt @@ -1,12 +1,12 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_net_srv_app) -set(DAP_CHAIN_NET_SRV_APP_SRCS *.c) +file(GLOB DAP_CHAIN_NET_SRV_APP_SRCS *.c) -set(DAP_CHAIN_NET_SRV_APP_HEADERS include/*.h) +file(GLOB DAP_CHAIN_NET_SRV_APP_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_APP_SRCS} ${DAP_CHAIN_NET_SRV_APP_HEADERS}) target_link_libraries(dap_chain_net_srv_app dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_net dap_chain_net_srv) target_include_directories(dap_chain_net_srv_app INTERFACE .) - +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/service/datum/CMakeLists.txt b/modules/service/datum/CMakeLists.txt index fdd050dd60..63a0dcfb2e 100644 --- a/modules/service/datum/CMakeLists.txt +++ b/modules/service/datum/CMakeLists.txt @@ -1,12 +1,13 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_net_srv_datum) -set(DAP_CHAIN_NET_SRV_DATUM_SRCS *.c) +file(GLOB DAP_CHAIN_NET_SRV_DATUM_SRCS *.c) -set(DAP_CHAIN_NET_SRV_DATUM_HEADERS include/*.h) +file(GLOB DAP_CHAIN_NET_SRV_DATUM_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_DATUM_SRCS} ${DAP_CHAIN_NET_SRV_DATUM_HEADERS}) target_link_libraries(dap_chain_net_srv_datum dap_chain_net_srv) target_include_directories(dap_chain_net_srv_datum INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/service/mining-pool/CMakeLists.txt b/modules/service/mining-pool/CMakeLists.txt index 275db11120..449cc79415 100644 --- a/modules/service/mining-pool/CMakeLists.txt +++ b/modules/service/mining-pool/CMakeLists.txt @@ -1,11 +1,12 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_net_srv_datum_pool) -set(DAP_CHAIN_NET_SRV_DATUM_POOL_SRCS *.c) -set(DAP_CHAIN_NET_SRV_DATUM_POOL_HEADERS include/*.h) +file(GLOB DAP_CHAIN_NET_SRV_DATUM_POOL_SRCS *.c) +file(GLOB DAP_CHAIN_NET_SRV_DATUM_POOL_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_DATUM_POOL_SRCS} ${DAP_CHAIN_NET_SRV_DATUM_POOL_HEADERS}) target_link_libraries(dap_chain_net_srv_datum_pool dap_chain_net_srv dap_chain_net_srv_datum) target_include_directories(dap_chain_net_srv_datum_pool INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/service/vpn/CMakeLists.txt b/modules/service/vpn/CMakeLists.txt index 3f295e39c7..b5aff03684 100644 --- a/modules/service/vpn/CMakeLists.txt +++ b/modules/service/vpn/CMakeLists.txt @@ -1,9 +1,9 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_net_srv_vpn) -set(DAP_CHAIN_NET_SRV_VPN_SRCS *.c) +file(GLOB DAP_CHAIN_NET_SRV_VPN_SRCS *.c) -set(DAP_CHAIN_NET_SRV_VPN_HEADERS include/*.h) +file(GLOB DAP_CHAIN_NET_SRV_VPN_HEADERS include/*.h) if(WIN32) include_directories(../../../os/win32/) @@ -15,7 +15,8 @@ endif() add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_VPN_SRCS} ${DAP_CHAIN_NET_SRV_VPN_HEADERS}) -target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_net dap_chain_net_srv) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_stream dap_chain dap_chain_crypto dap_chain_net dap_chain_net_srv) target_include_directories(${PROJECT_NAME} INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/type/block/CMakeLists.txt b/modules/type/block/CMakeLists.txt index 054678eae7..9ad9afa0a1 100644 --- a/modules/type/block/CMakeLists.txt +++ b/modules/type/block/CMakeLists.txt @@ -1,12 +1,12 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_cs_block) -set(DAP_CHAIN_BLOCK_SRCS *.c) -set(DAP_CHAIN_BLOCK_HEADERS include/*.h) +file(GLOB DAP_CHAIN_BLOCK_SRCS *.c) +file(GLOB DAP_CHAIN_BLOCK_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_BLOCK_SRCS} ${DAP_CHAIN_BLOCK_HEADERS}) target_link_libraries(dap_chain_cs_block dap_core dap_crypto dap_chain dap_chain_crypto ) target_include_directories(dap_chain_cs_block INTERFACE .) - +target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/type/dag/CMakeLists.txt b/modules/type/dag/CMakeLists.txt index 6bc479d756..9682f2ec10 100644 --- a/modules/type/dag/CMakeLists.txt +++ b/modules/type/dag/CMakeLists.txt @@ -1,10 +1,10 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_cs_dag) -set(DAP_CHAIN_DAG_SRCS *.c) -set(DAP_CHAIN_DAG_HEADERS include/*.h) +file(GLOB DAP_CHAIN_DAG_SRCS *.c) +file(GLOB DAP_CHAIN_DAG_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DAG_SRCS} ${DAP_CHAIN_DAG_HEADERS}) target_link_libraries(dap_chain_cs_dag dap_core dap_crypto dap_chain dap_chain_net dap_chain_crypto dap_chain_global_db) target_include_directories(dap_chain_cs_dag INTERFACE .) - +target_include_directories(${PROJECT_NAME} PUBLIC include) \ No newline at end of file diff --git a/modules/wallet/CMakeLists.txt b/modules/wallet/CMakeLists.txt index 5ca6539127..534f7e44fc 100644 --- a/modules/wallet/CMakeLists.txt +++ b/modules/wallet/CMakeLists.txt @@ -1,11 +1,12 @@ cmake_minimum_required(VERSION 2.8) project (dap_chain_wallet) -set(DAP_CHAIN_WALLET_SRCS *.c) -set(DAP_CHAIN_WALLET_HEADERS include/*.h) +file(GLOB DAP_CHAIN_WALLET_SRCS *.c) +file(GLOB DAP_CHAIN_WALLET_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_WALLET_SRCS} ${DAP_CHAIN_WALLET_HEADERS}) target_link_libraries(dap_chain_wallet dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_net) target_include_directories(dap_chain_wallet INTERFACE .) +target_include_directories(${PROJECT_NAME} PUBLIC include) -- GitLab