From nobody Tue Jun 13 11:55:43 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4QgRp74Sphz4d1qy; Tue, 13 Jun 2023 11:55:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4QgRp72tmcz3MVj; Tue, 13 Jun 2023 11:55:43 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1686657343; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=wnZpI/mqOvk7qHD8myE6jJaUo6/Mf7CV8jrOOWVh5iU=; b=E5r2hyZMDyEyAnOxW9BC5nUSgWIPLHD//vB5Iw2z5dld2VliOHVYReYl1tRrDld7SpNkax ERC61FsztZ6WA04OVQaeIZE7mQ87/tDuXviF29yc9ZexSPwBR9UwiSX9fEAJtcI9Hd4I2v ruFt5pQI2iPcYxMn4OQptY1YqLOrKZOYUkA+rsP7uU81KUaiz0UtfsgPoI+SEFYK9cMnQ3 +8AZS8Hxfe3z/sLBoPXSYBIdYMq8tjvnNLz0tOzxGLjVRCxRXNhsFh9yoAJkMeLNG35i8O O9EiH94dvDSyhPIviFspwMZMI45mvnyCr4C5rVDn4QznOXuxhakfO8y5AI5/MQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1686657343; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=wnZpI/mqOvk7qHD8myE6jJaUo6/Mf7CV8jrOOWVh5iU=; b=sipxNWhQgR/w8WAeXr8z6CCft5AIGzbZzdvTg2OMNQn56UZ6kzL1Kcu3QKmhkVomb/rHN+ uDkrQWK++918WZ3AdpV9N14RRM0NCjFJ25zAqr/203GueoVfq5R8wJMlKykhXZ+VqpU62L 2AYegovN37CIeSjpVOrjzJhtcONG+Bfl/cmyidSeLIs8Ev+8BXbptDOLj8EqaYpV4/4sFp u2DASxj7SvsY2oPnLpPDXGEEBhoN8vjUqHJHDnuu0PfBQf/ylY/TK9e7VovL4v+9KJBVPM AWdpP27P4ZIzR84kmM+j8CRGNH+0PuohD4j9+wiJBloTFPYZva5S8QYIqI96+Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1686657343; a=rsa-sha256; cv=none; b=slkQRZtXZiq32NO1OhZZWPnxzXC93KapgISdLplm9Nh4lxG6n9Iq0iHZHMdXaCe131HK7z ZVYjC0Afge/BfihxXvt7USSAEX7H0dPq5ITMo1lEJ7VDv64gzltxprSotmjXgXNA7zT4Td EcljaFSiMvb4QPP0GjEeIBKRI6mCaehtNC+4VbvRlwdQ9qJRUcKSCi/A5whtxrRoH8Uu+I XxCkPZeT9cSeA/h0f1Iw6pKqGFFsHPnYJ0LErm7mHsXGZdkAJtr20bfdlDURLrU+r9R9ZR 4kv28JIH6OehF+RgP+zlQOdrOp2Lr9m2qC3/Mmq7u6jQdF/9SiRnqQVuLBRMrA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4QgRp71bfGzLl1; Tue, 13 Jun 2023 11:55:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 35DBthRU075996; Tue, 13 Jun 2023 11:55:43 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 35DBthMK075995; Tue, 13 Jun 2023 11:55:43 GMT (envelope-from git) Date: Tue, 13 Jun 2023 11:55:43 GMT Message-Id: <202306131155.35DBthMK075995@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Alexander V. Chernikov" Subject: git: 6a9cfebaf1cf - main - ipfw: simplify action case parser List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: melifaro X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 6a9cfebaf1cfee2ff39fb5ea1e7077aab423c3f6 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=6a9cfebaf1cfee2ff39fb5ea1e7077aab423c3f6 commit 6a9cfebaf1cfee2ff39fb5ea1e7077aab423c3f6 Author: Alexander V. Chernikov AuthorDate: 2023-06-07 08:31:52 +0000 Commit: Alexander V. Chernikov CommitDate: 2023-06-13 11:55:37 +0000 ipfw: simplify action case parser Remove "goto charg" from the action parser. This is a prerequisite for the further split of the gigantic compile_rule(). Differential Revision: https://reviews.freebsd.org/D40490 MFC after: 2 weeks --- sbin/ipfw/ipfw2.c | 106 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 32 deletions(-) diff --git a/sbin/ipfw/ipfw2.c b/sbin/ipfw/ipfw2.c index 36f39beba5bb..a711514cb5dc 100644 --- a/sbin/ipfw/ipfw2.c +++ b/sbin/ipfw/ipfw2.c @@ -3937,6 +3937,53 @@ add_dst(ipfw_insn *cmd, char *av, u_char proto, int cblen, struct tidx *tstate) return ret; } +static inline int +arg_or_targ_relaxed(const char *arg, const char *action) +{ + uint32_t arg1 = (uint32_t)(-1); + + if (arg == NULL) + errx(EX_USAGE, "missing argument for %s", action); + if (isdigit(arg[0])) { + arg1 = strtoul(arg, NULL, 10); + if (arg1 <= 0 || arg1 >= IP_FW_TABLEARG) + errx(EX_DATAERR, "illegal argument %s(%u) for %s", + arg, arg1, action); + } else if (_substrcmp(arg, "tablearg") == 0) + arg1 = IP_FW_TARG; + return (arg1); +} + +static inline uint16_t +arg_or_targ(const char *arg, const char *action) +{ + uint32_t arg1 = arg_or_targ_relaxed(arg, action); + + if (arg1 == (uint32_t)(-1)) + errx(EX_DATAERR, "illegal argument %s(%u) for %s", + arg, arg1, action); + return (arg1); +} + +static void +fill_divert_port(ipfw_insn *cmd, char *arg, const char *action) +{ + uint32_t arg1 = arg_or_targ_relaxed(arg, action); + + if (arg1 != (uint32_t)(-1)) { + cmd->arg1 = arg1; + return; + } + + struct servent *s; + setservent(1); + s = getservbyname(arg, "divert"); + if (s != NULL) + cmd->arg1 = ntohs(s->s_port); + else + errx(EX_DATAERR, "illegal divert/tee port"); +} + /* * Parse arguments and assemble the microinstructions which make up a rule. * Rules are added into the 'rulebuf' and then copied in the correct order @@ -4126,55 +4173,50 @@ compile_rule(char *av[], uint32_t *rbuf, int *rbufsize, struct tidx *tstate) action->opcode = O_NAT; action->len = F_INSN_SIZE(ipfw_insn_nat); CHECK_ACTLEN; - if (*av != NULL && _substrcmp(*av, "global") == 0) { + if (*av != NULL && _substrcmp(*av, "global") == 0) action->arg1 = IP_FW_NAT44_GLOBAL; - av++; - break; - } else - goto chkarg; + else + action->arg1 = arg_or_targ(av[0], *(av - 1)); + av++; + break; case TOK_QUEUE: action->opcode = O_QUEUE; - goto chkarg; + action->arg1 = arg_or_targ(av[0], *(av - 1)); + av++; + break; case TOK_PIPE: action->opcode = O_PIPE; - goto chkarg; + action->arg1 = arg_or_targ(av[0], *(av - 1)); + av++; + break; case TOK_SKIPTO: action->opcode = O_SKIPTO; - goto chkarg; + action->arg1 = arg_or_targ(av[0], *(av - 1)); + av++; + break; case TOK_NETGRAPH: action->opcode = O_NETGRAPH; - goto chkarg; + action->arg1 = arg_or_targ(av[0], *(av - 1)); + av++; + break; case TOK_NGTEE: action->opcode = O_NGTEE; - goto chkarg; + action->arg1 = arg_or_targ(av[0], *(av - 1)); + av++; + break; case TOK_DIVERT: action->opcode = O_DIVERT; - goto chkarg; + fill_divert_port(action, av[0], *(av - 1)); + av++; + break; case TOK_TEE: action->opcode = O_TEE; - goto chkarg; + fill_divert_port(action, av[0], *(av - 1)); + av++; + break; case TOK_CALL: action->opcode = O_CALLRETURN; -chkarg: - if (!av[0]) - errx(EX_USAGE, "missing argument for %s", *(av - 1)); - if (isdigit(**av)) { - action->arg1 = strtoul(*av, NULL, 10); - if (action->arg1 <= 0 || action->arg1 >= IP_FW_TABLEARG) - errx(EX_DATAERR, "illegal argument for %s", - *(av - 1)); - } else if (_substrcmp(*av, "tablearg") == 0) { - action->arg1 = IP_FW_TARG; - } else if (i == TOK_DIVERT || i == TOK_TEE) { - struct servent *s; - setservent(1); - s = getservbyname(av[0], "divert"); - if (s != NULL) - action->arg1 = ntohs(s->s_port); - else - errx(EX_DATAERR, "illegal divert/tee port"); - } else - errx(EX_DATAERR, "illegal argument for %s", *(av - 1)); + action->arg1 = arg_or_targ(av[0], *(av - 1)); av++; break;