{"id":4634,"date":"2015-01-12T15:47:17","date_gmt":"2015-01-12T13:47:17","guid":{"rendered":"http:\/\/skeletor.org.ua\/?p=4634"},"modified":"2015-01-12T15:47:17","modified_gmt":"2015-01-12T13:47:17","slug":"%d0%b8%d1%81%d1%85%d0%be%d0%b4%d0%bd%d0%b8%d0%ba%d0%b8-tcpdrop-%d0%bf%d0%be%d0%b4-solaris","status":"publish","type":"post","link":"https:\/\/skeletor.org.ua\/?p=4634","title":{"rendered":"\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 tcpdrop \u043f\u043e\u0434 Solaris"},"content":{"rendered":"<p>\u0412 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430\u0448\u0451\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0430\u0432\u0442\u043e\u0440\u0430 Youzhong Yang. \u041f\u0440\u0438\u0432\u043e\u0436\u0443 \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u0445 \u0438 \u0440\u0438\u0441\u043a.<\/p>\n<p><!--more--><\/p>\n<pre>#include &lt;stdio.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n#include &lt;errno.h&gt;\r\n#include &lt;sys\/types.h&gt;\r\n#include &lt;sys\/stat.h&gt;\r\n#include &lt;fcntl.h&gt;\r\n#include &lt;unistd.h&gt;\r\n#include &lt;stropts.h&gt;\r\n#include &lt;inet\/tcp.h&gt;\r\n#include &lt;arpa\/inet.h&gt;\r\n#include &lt;sys\/socket_impl.h&gt;\r\n#include &lt;sys\/socket.h&gt;\r\n#include &lt;netinet\/in.h&gt;\r\n#include &lt;strings.h&gt;\r\n\/* the following function is from illumos-gate:\r\n<a href=\"http:\/\/src.illumos.org\/source\/xref\/illumos-gate\/usr\/src\/cmd\/zoneadmd\/vplat.c#3169\">http:\/\/src.illumos.org\/source\/xref\/illumos-gate\/usr\/src\/cmd\/zoneadmd\/vplat.c#3169<\/a>\r\n*\/\r\nstatic int\r\ntcp_abort_conn(zoneid_t zoneid,\r\nconst struct sockaddr_storage *local, const struct sockaddr_storage *remote)\r\n{\r\nint fd;\r\nstruct strioctl ioc;\r\ntcp_ioc_abort_conn_t conn;\r\nint error;\r\n\r\n\tconn.ac_local = *local;\r\nconn.ac_remote = *remote;\r\nconn.ac_start = TCPS_SYN_SENT;\r\nconn.ac_end = TCPS_TIME_WAIT;\r\nconn.ac_zoneid = zoneid;\r\n\r\nioc.ic_cmd = TCP_IOC_ABORT_CONN;\r\nioc.ic_timout = -1; \/* infinite timeout *\/\r\nioc.ic_len = sizeof (conn);\r\nioc.ic_dp = (char *)&amp;conn;\r\n\r\nif ((fd = open(\"\/dev\/tcp\", O_RDONLY)) &lt; 0) {\r\nfprintf(stderr, \"unable to open %s\\n\", \"\/dev\/tcp\");\r\nreturn (-1);\r\n}\r\n\r\nerror = ioctl(fd, I_STR, &amp;ioc);\r\nprintf(\"ioctl = %d, errno = %d\\n\", error, errno);\r\n(void) close(fd);\r\nif (error == 0 || errno == ENOENT)\/* ENOENT is not an error *\/\r\nreturn (0);\r\nreturn (-1);\r\n}\r\n\r\nvoid print_usage(char *argv[])\r\n{\r\nprintf(\"USAGE:\\n\");\r\nprintf(\" \u00a0 \u00a0%s -l local_ip -s local_port -r remote_ip -d remote_port -z zone_id\\n\\n\", argv[0]);\r\n}\r\n\r\nint main(int argc, char *argv[])\r\n{\r\nint c;\r\nint ret;\r\nchar *s_local_ip, *s_remote_ip, *s_local_port, *s_remote_port, *s_zoneid;\r\nstruct in_addr local_ip, remote_ip;\r\nint local_port, remote_port;\r\nzoneid_t zoneid;\r\nstruct sockaddr_storage l, r;\r\nstruct sockaddr_in *local, *remote;\r\nint error;\r\n\r\ns_local_ip = \"0.0.0.0\";\r\ns_remote_ip = \"0.0.0.0\";\r\ns_local_port = \"0\";\r\ns_remote_port = \"0\";\r\ns_zoneid = \"0\";\r\nlocal_ip.s_addr = INADDR_ANY;\r\nremote_ip.s_addr = INADDR_ANY;\r\nlocal_port = 0;\r\nremote_port = 0;\r\nzoneid = 0;\r\n\r\nwhile ((c = getopt(argc, argv, \":l:s:r:d:z:\")) != -1) {\r\nswitch(c) {\r\ncase 'l':\r\ns_local_ip = optarg; break;\r\ncase 's':\r\ns_local_port = optarg; break;\r\ncase 'r':\r\ns_remote_ip = optarg; break;\r\ncase 'd':\r\ns_remote_port = optarg; break;\r\ncase 'z':\r\ns_zoneid = optarg; break;\r\ncase ':':\r\nprintf(\"-%c without arg\\n\", optopt);\r\nexit(1);\r\nbreak;\r\n}\r\n}\r\n\r\nif(argc == 1) {\r\nprint_usage(argv);\r\nexit(1);\r\n}\r\n\r\nret = inet_pton(AF_INET, s_local_ip, &amp;local_ip);\r\nprintf(\"inet_pton = %d, addr = 0x%x\\n\", ret, local_ip.s_addr);\r\nif(ret != 1) {\r\nprint_usage(argv);\r\nexit(1);\r\n}\r\n\r\nret = inet_pton(AF_INET, s_remote_ip, &amp;remote_ip);\r\nprintf(\"inet_pton = %d, addr = 0x%x\\n\", ret, remote_ip.s_addr);\r\nif(ret != 1) {\r\nprint_usage(argv);\r\nexit(1);\r\n}\r\n\r\nlocal_port = atoi(s_local_port);\r\nremote_port = atoi(s_remote_port);\r\nzoneid = atoi(s_zoneid);\r\n\r\nprintf(\"local ip = %s\\n\", s_local_ip);\r\nprintf(\"local port = %d\\n\", local_port);\r\nprintf(\"remote ip = %s\\n\", s_remote_ip);\r\nprintf(\"remote port = %d\\n\", remote_port);\r\nprintf(\"zone id = %d\\n\", zoneid);\r\n\r\nbzero(&amp;l, sizeof(*local));\r\nlocal = (struct sockaddr_in *) &amp;l;\r\nlocal-&gt;sin_family = AF_INET;\r\nlocal-&gt;sin_addr = local_ip;\r\nlocal-&gt;sin_port = htons(local_port);\r\n\r\nbzero(&amp;r, sizeof(*remote));\r\nremote = (struct sockaddr_in *) &amp;r;\r\nremote-&gt;sin_family = AF_INET;\r\nremote-&gt;sin_addr = remote_ip;\r\nremote-&gt;sin_port = htons(remote_port);\r\n\r\n\terror = tcp_abort_conn(zoneid, &amp;l, &amp;r);\r\n\r\n\tprintf(\"tcp_abort_conn = %d\\n\", error);\r\n\r\n\treturn 0;\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430\u0448\u0451\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0430\u0432\u0442\u043e\u0440\u0430 Youzhong Yang. \u041f\u0440\u0438\u0432\u043e\u0436\u0443 \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u0445 \u0438 \u0440\u0438\u0441\u043a.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14,24],"tags":[],"class_list":["post-4634","post","type-post","status-publish","format-standard","hentry","category-programming","category-solaris"],"_links":{"self":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts\/4634","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4634"}],"version-history":[{"count":1,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts\/4634\/revisions"}],"predecessor-version":[{"id":4635,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts\/4634\/revisions\/4635"}],"wp:attachment":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}