Date: Tue, 23 Sep 2008 13:37:52 +0400 From: Roman Kurakin <rik@inse.ru> To: Ganbold <ganbold@micom.mng.net> Cc: Roman Kurakin <rik@FreeBSD.org>, freebsd-ipfw@freebsd.org, rizzo@iet.unipi.it, julian@elischer.org Subject: Re: question related to /sbin/ipfw/ipfw2.c Message-ID: <48D8B8F0.8020900@localhost.inse.ru> In-Reply-To: <48D8A814.7030607@micom.mng.net> References: <48D8A814.7030607@micom.mng.net>
next in thread | previous in thread | raw e-mail | index | archive | help
Ganbold wrote: > Hi, > > What does following part of src/sbin/ipfw/ipfw2.c code? > ... > static void > fill_ip(ipfw_insn_ip *cmd, char *av) > { > int len = 0; > uint32_t *d = ((ipfw_insn_u32 *)cmd)->d; > > cmd->o.len &= ~F_LEN_MASK; /* zero len */ > ----------------------------------- > if (strncmp(av, "table(", 6) == 0) { match the beginning of the "table(entry,value)" > char *p = strchr(av + 6, ','); find the ',' if any > > if (p) > *p++ = '\0'; and replace it with '\0' eq "table(entry\0value)" so as a string it is now "table(entry" and make p point to 'value', eq p = 'value' now > cmd->o.opcode = O_IP_DST_LOOKUP; > cmd->o.arg1 = strtoul(av + 6, NULL, 0); av+6 is the "entry" string arg1=(unsigned long)entry > > if (p) { if we have a 'value ' part > cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32); > d[0] = strtoul(p, NULL, 0); d[0] = (unsigned long)value > } else > cmd->o.len |= F_INSN_SIZE(ipfw_insn); > return; > } Is that what you need? rik > ----------------------------------- > > Specially, what does following code? > ... > cmd->o.opcode = O_IP_DST_LOOKUP; > cmd->o.arg1 = strtoul(av + 6, NULL, 0); > if (p) { > cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32); > d[0] = strtoul(p, NULL, 0); > } else > cmd->o.len |= F_INSN_SIZE(ipfw_insn); > ... > > thanks, > > Ganbold >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?48D8B8F0.8020900>