Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Sep 2008 20:13:58 +0800
From:      Ganbold <ganbold@micom.mng.net>
To:        Roman Kurakin <rik@inse.ru>
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:  <48D8DD86.7000903@micom.mng.net>
In-Reply-To: <48D8B8F0.8020900@localhost.inse.ru>
References:  <48D8A814.7030607@micom.mng.net> <48D8B8F0.8020900@localhost.inse.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
Roman Kurakin wrote:
> 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

Ok, now how do we know or choose the index of d[]?
Basically I would like to store some value in d[].
How can I do that?

thanks,

Ganbold

>>        } 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
>>
>
> _______________________________________________
> freebsd-ipfw@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-ipfw
> To unsubscribe, send any mail to "freebsd-ipfw-unsubscribe@freebsd.org"
>
>
>


-- 
A little inaccuracy saves a world of explanation. -- C. E. Ayres



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?48D8DD86.7000903>