/* * Mausezahn - A fast versatile traffic generator * Copyright (C) 2008-2010 Herbert Haas * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2 as published by the * Free Software Foundation. * * 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/gpl-2.0.html * */ #include "mz.h" #include "cli.h" #include "mops.h" int cmd_port_source (struct cli_def *cli, const char *command, char *argv[], int argc) { u_int32_t t32=0; int validport=0; if ( (strcmp(argv[argc-1],"?")==0) || (argc>2) ) { cli_print(cli, "Specify the source port number:\n"); cli_print(cli, " []\r"); cli_print(cli, " random [norandom]\r"); cli_print(cli, "\n"); return CLI_OK; } if (mz_strcmp(argv[0], "random",1)==0) { clipkt->sp_isrand = 1; clipkt->sp_isrange = 0; } else if (mz_strcmp(argv[0], "norandom",1)==0) { clipkt->sp_isrand = 0; } else { if (!mz_strisnum(argv[0])) { cli_print(cli, "Unknown keyword\n"); return CLI_OK; } t32 = str2int(argv[0]); if (t32>65535) { cli_print(cli, "Port number cannot exceed 65535\n"); return CLI_OK; } else { clipkt->sp= (u_int16_t) t32; validport=1; clipkt->sp_isrange = 0; } } if ((argc==2) && (validport)) { if (!mz_strisnum(argv[1])) { cli_print(cli, "Invalid number\n"); return CLI_OK; } t32 = str2int(argv[1]); if (t32>65535) { cli_print(cli, "Port number cannot exceed 65535\n"); } else { clipkt->sp_start = clipkt->sp; clipkt->sp_stop = (u_int16_t) t32; clipkt->sp_isrange = 1; } } return CLI_OK; } int cmd_port_destination (struct cli_def *cli, const char *command, char *argv[], int argc) { u_int32_t t32=0; int validport=0; if ( (strcmp(argv[argc-1],"?")==0) || (argc>2) ) { cli_print(cli, "Specify the destination port number\r"); cli_print(cli, " []\r"); cli_print(cli, " random [norandom]\r"); cli_print(cli, "\n"); return CLI_OK; } if (mz_strcmp(argv[0], "random",1)==0) { clipkt->dp_isrand = 1; clipkt->dp_isrange = 0; } else if (mz_strcmp(argv[0], "norandom",1)==0) { clipkt->dp_isrand = 0; } else { if (!mz_strisnum(argv[0])) { cli_print(cli, "Unknown keyword\n"); return CLI_OK; } t32 = str2int(argv[0]); if (t32>65535) { cli_print(cli, "Port number cannot exceed 65535\n"); return CLI_OK; } else { clipkt->dp= (u_int16_t) t32; validport=1; clipkt->dp_isrange = 0; } } if ((argc==2) && (validport)) { if (!mz_strisnum(argv[1])) { cli_print(cli, "Invalid number\n"); return CLI_OK; } t32 = str2int(argv[1]); if (t32>65535) { cli_print(cli, "Port number cannot exceed 65535\n"); } else { clipkt->dp_start = clipkt->dp; clipkt->dp_stop = (u_int16_t) t32; clipkt->dp_isrange = 1; } } return CLI_OK; } int cmd_udp_sum (struct cli_def *cli, const char *command, char *argv[], int argc) { int sum; if ( (strcmp(argv[argc-1],"?")==0) || (argc>1) ) { cli_print(cli, "Specify the UDP checksum:\n"); cli_print(cli, " - either in hexadecimal format (0-ffff)\r"); cli_print(cli, " - or use the keyword 'auto' (default)\r"); cli_print(cli, " - or use the keyword 'unset'\r"); cli_print(cli, "\r"); cli_print(cli, "By default, the checksum is computed automatically. The keyword\r"); cli_print(cli, "'unset' signals the receiver that the checksum has not be computed\r"); cli_print(cli, "and should be ignored.\n"); return CLI_OK; } if (mz_strcmp(argv[0], "auto", 2)==0) { clipkt->udp_sum_false=0; return CLI_OK; } if (mz_strcmp(argv[0], "unset", 2)==0) { clipkt->udp_sum_false=1; clipkt->udp_sum = 0xffff; return CLI_OK; } sum = (int) xstr2int(argv[0]); if (sum>0xffff) { cli_print(cli, "The checksum must be within range 0..ffff\n"); return CLI_OK; } clipkt->udp_sum = (u_int16_t) sum; clipkt->udp_sum_false=1; return CLI_OK; } int cmd_udp_len (struct cli_def *cli, const char *command, char *argv[], int argc) { if ( (strcmp(argv[argc-1],"?")==0) || (argc>1) ) { cli_print(cli, "Specify the UDP length\r"); cli_print(cli, "\n"); return CLI_OK; } cli_print(cli, "Not supported in this version.\n"); return CLI_OK; } int cmd_udp_end(struct cli_def *cli, const char *command, char *argv[], int argc) { char prompt[16]; sprintf(prompt, "pkt-%i",clipkt->id); cli_set_configmode(cli, MZ_MODE_PACKET, prompt); return CLI_OK; } ass='commit-info'> authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2017-02-03 17:10:28 +1100 committerMichael Ellerman <mpe@ellerman.id.au>2017-02-08 23:36:29 +1100 commitd7df2443cd5f67fc6ee7c05a88e4996e8177f91b (patch) tree098a7c0ca4fceb8a65cb1f693c9d71990388933d /net/dccp/Makefile parenta0615a16f7d0ceb5804d295203c302d496d8ee91 (diff)
powerpc/mm: Fix spurrious segfaults on radix with autonuma
When autonuma (Automatic NUMA balancing) marks a PTE inaccessible it clears all the protection bits but leave the PTE valid. With the Radix MMU, an attempt at executing from such a PTE will take a fault with bit 35 of SRR1 set "SRR1_ISI_N_OR_G". It is thus incorrect to treat all such faults as errors. We should pass them to handle_mm_fault() for autonuma to deal with. The case of pages that are really not executable is handled by the existing test for VM_EXEC further down. That leaves us with catching the kernel attempts at executing user pages. We can catch that earlier, even before we do find_vma. It is never valid on powerpc for the kernel to take an exec fault to begin with. So fold that test with the existing test for the kernel faulting on kernel addresses to bail out early. Fixes: 1d18ad026844 ("powerpc/mm: Detect instruction fetch denied and report") Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Acked-by: Balbir Singh <bsingharora@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'net/dccp/Makefile')