Subject: Re: [Softwires] WGLC review of draft-ietf-softwire-map

From: Simon Perreault <[email-masked]>
Date: Mon, 06 Jan 2014 16:57:19 -0500

Le 2014-01-02 12:11, Ole Troan a écrit :
>> 1. The distinction between BMR and FMR is very confusing. And it's going to get even more confusing when the reader gets to draft-ietf-softwire-map-dhcp, where there is only a single unified "rule" parameter. Suggestion: remove the concept of FMR. The text already says that the BMR is an FMR, so this means that FMR is already conceptually equal to "MAP rule". So just replace FMR with "MAP rule". Then say that one of the MAP rules is special: it is the BMR. I've provided text inline below.
>
>     "Mapping rules are used differently depending on their function.
>     Every MAP node must be provisioned with a Basic mapping rule.  This
>     is used by the node to configure its IPv4 address, IPv4 prefix or
>     shared IPv4 address.  This same basic rule can also be used for
>     forwarding, where an IPv4 destination address and optionally a
>     destination port is mapped into an IPv6 address.  Additional mapping
>     rules are specified to allow for multiple different IPv4 sub-nets to
>     exist within the domain and optimize forwarding between them."
>
> isn't this text clear enough?
> the analogy of BMR versus FMR, is a router advertisement with two PIO's, one PIO with the A flag set
> and optionally the L flag, and one PIO with the A flag off and the L flag set.
> we've chosen to give those different names to be very clear on their purpose.
> I would claim that it is more confusing and harder to understand the effects of the A/L flags in the PIO example. ;-)
>
> suggested action: keep the BMR/FMR distinction.

I'm not against that suggestion, as long as the other (previously 
agreed) adjustments are made. That is, right now the BMR/FMR distinction 
doesn't make sense because the text says a BMR is an FMR. If that is 
fixed, then at least we can have a BMR/FMR distinction that makes sense. 
Not my preference, but it will work.

Specifically, a BMR it not an FMR because its L flag (to reuse the PIO 
analogy) may be off, whereas for an FMR it is always on.

>> 2. Section 5 says:
>>
>>    1.  Basic Mapping Rule (BMR) - mandatory. [...]
>>        The Basic Mapping Rule is also a Forwarding Mapping Rule. [...]
>>    In hub and spoke mode, there are no forwarding rules [...]
>>
>> Contradiction? There must be at least one FMR since the BMR is an FMR and it is mandatory.
>
> hmm... good point. this is the equivalent of a single RA PIO with the A flag on and L flag off.
> that is all traffic goes through the BR. what about:
>
> "In hub and spoke mode, there are no forwarding rules, apart from the default rule to the BR"

Ok.

>> 3. I can't make sense of this part from section 5.1:
>>
>>    For a > 0, A MUST be larger than 0. [...]
>>    For smaller values of a, A still has to be greater than 0 [...]
>>    For larger values of a, the minimum value of A has to be higher [...]
>>
>> Smaller than what? Larger than what? If a is smaller than a>0, that means a=0. How can A then be greater than 0 if it is 0 bits long?
>>
>> Further comments inline...
>
> agree. I can't make sense of it either. ;-)
>
> OLD:
>   A  Selects the range of the port number.  For a > 0, A MUST be larger
>        than 0.  This ensures that the algorithm excludes the system
>        ports.  For this value of a, the system ports, but no others, are
>        excluded by requiring that A be greater than 0.  For smaller
>        values of a, A still has to be greater than 0, but this excludes
>        ports above 1023.  For larger values of a, the minimum value of A
>        has to be higher to exclude all the system ports.  The interval
>        between successive contiguous ranges assigned to the same user is
>        2^a.
>
> Proposed:
> A   Selects the range of the port number.  For a > 0, A MUST be larger
>        than 0.  This ensures that the algorithm excludes the system
>        ports.  For the default value of a (6), the system ports, are
>        excluded by requiring that A be greater than 0.  Smaller
>        values of a excludes a larger initial range. E.g. a = 4, will exclude ports 0 - 4095.
>        The interval between successive contiguous ranges assigned to the same user is
>        2^a.

Looks good.

>>>    A companion document defines a DHCPv6 option for provisioning of MAP
>>
>> A companion document defines DHCPv6 options for provisioning of Softwire clients
>
> I'm not sure that we should introduce "softwire clients" as a new term here.

I see. Then keep it as is.

>>>    MAP node                A device that implements MAP.
>>
>> Implementation has nothing to do with it.
>>
>> s/implements MAP/participates in a MAP domain/
>
> implements as in "supports/uses", not implement as the act of coding.
> see http://tools.ietf.org/html/rfc4861#section-2 for a node.

I understand, and thanks for the reference, but I still think that this 
is wrong.

 From the point of view of the protocol spec, there is no difference 
between a node that does not implement MAP and a node that implements 
MAP but has it turned off. Both are not MAP nodes, again from the point 
of view of the protocol spec. Unless you want to distinguish between 
nodes that have the MAP function turned off and those that have it 
turned on, which I don't think you do in the current text.

Anyhow, this is mostly a style issue, I don't care too much.

>>>    This architecture is illustrated in Figure 1.
>>>
>>>
>>>          User N
>>>        Private IPv4
>>>       |  Network
>>>       |
>>>    O--+---------------O
>>>    |  |  MAP CE       |
>>>    | +-----+--------+ |
>>>    | NAPT44|  MAP   | |
>>>    | +-----+      | | |\     ,-------.                      .------.
>>
>> Remove this --------^
>
>
>
>>
>>>    |       +--------+ | \ ,-'         `-.                 ,-'       `-.
>>>    O------------------O  /              \   O---------O  /   Public   \
>>>                          /   IPv6 only   \  |  MAP    | /     IPv4     \
>>>                         (    Network      --+  Border +-   Network     )
>>>                          \  (MAP Domain) /  |  Relay  | \              /
>>>    O------------------O  \              /   O---------O  \             /
>>>    |    MAP   CE      |  /".         ,-'                 `-.       ,-'
>>>    | +-----+--------+ | /   `----+--'                       ------'
>>>    | NAPT44|  MAP   | |/
>>>    | +-----+        | |
>>>    |   |   +--------+ |
>>>    O---.--------------O
>>
>> s/./+/
>
> I'm not quite sure what you mean, could you give a complete figure with your suggested changes?

Hehehehe, sure:

OLD:
          User N
        Private IPv4
       |  Network
       |
    O--+---------------O
    |  |  MAP CE       |
    | +-----+--------+ |
    | NAPT44|  MAP   | |
    | +-----+      | | |\     ,-------.                      .------.
    |       +--------+ | \ ,-'         `-.                 ,-'       `-.
    O------------------O  /              \   O---------O  /   Public   \
                          /   IPv6 only   \  |  MAP    | /     IPv4     \
                         (    Network      --+  Border +-   Network     )
                          \  (MAP Domain) /  |  Relay  | \              /
    O------------------O  \              /   O---------O  \             /
    |    MAP   CE      |  /".         ,-'                 `-.       ,-'
    | +-----+--------+ | /   `----+--'                       ------'
    | NAPT44|  MAP   | |/
    | +-----+        | |
    |   |   +--------+ |
    O---.--------------O
        |
         User M
       Private IPv4
         Network

NEW:
          User N
        Private IPv4
       |  Network
       |
    O--+---------------O
    |  |  MAP CE       |
    | +-----+--------+ |
    | NAPT44|  MAP   | |
    | +-----+        | |\     ,-------.                      .------.
    |       +--------+ | \ ,-'         `-.                 ,-'       `-.
    O------------------O  /              \   O---------O  /   Public   \
                          /   IPv6 only   \  |  MAP    | /     IPv4     \
                         (    Network      --+  Border +-   Network     )
                          \  (MAP Domain) /  |  Relay  | \              /
    O------------------O  \              /   O---------O  \             /
    |    MAP   CE      |  /".         ,-'                 `-.       ,-'
    | +-----+--------+ | /   `----+--'                       ------'
    | NAPT44|  MAP   | |/
    | +-----+        | |
    |   |   +--------+ |
    O---+--------------O
        |
         User M
       Private IPv4
         Network

>>>    Port-aware IPv4 entries in the Rules table are installed for all the
>>
>> What is a "port-aware IPv4 entry"?
>
> yes, that's not clear. let me wordsmith.
>
>>>    Forwarding Mapping Rules and an default route to the MAP BR (see
>>
>> s/Forwarding Mapping Rules/MAP rules/
>>
>> s/an/a/
>
> ack.
>
>>
>>>    section Section 5.4.
>>
>> That paragraph was very unclear. Reword.
>
> any suggestion?

I just spent some time trying to come up with better text but I realized 
all of it is repeated from elsewhere.

Section 5.3:
    On forwarding an IPv4 packet, a best matching prefix look up is done
    in the Rules table and the correct FMR is chosen.

Section 5:
    Traffic outside of the domain (i.e. When the destination IPv4 address
    does not match (using longest matching prefix) any Rule IPv4 prefix
    in the Rules database) is forwarded to the BR.

So you could just delete it I guess.

>>>                      0                   1
>>>                      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
>>
>> Move the two lines above to the right by one character.
>
> hmm, I don't see that error?

Assuming you want to number bits and not frontiers between bits, the 0 
should be aligned with the first bit. And I just noticed that index 16 
needs to be removed.

OLD:
                      0                   1
                      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
                      +-----------+-----------+-------+
        Ports in      |     A     |    PSID   |   M   |
     the CE port set  |    > 0    |           |       |
                      +-----------+-----------+-------+
                      |  a bits   |  k bits   |m bits |

NEW:
                       0                   1
                       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
                      +-----------+-----------+-------+
        Ports in      |     A     |    PSID   |   M   |
     the CE port set  |    > 0    |           |       |
                      +-----------+-----------+-------+
                      |  a bits   |  k bits   |m bits |

>>> 5.2.  Basic mapping rule (BMR)
>>>
>>>    The Basic Mapping Rule is mandatory, used by the CE to provision
>>>    itself with an IPv4 prefix, IPv4 address or shared IPv4 address.
>>>    Recall from Section 5 that the BMR consists of the following
>>
>> s/the BMR/a MAP rule/
>
> this is specifically about the BMR though.

Right, but when reading this text I got confused when I reached section 
5.2 on FMRs since that reference to Section 5 made me think that Section 
5 only applied to BMRs.

Anyhow, this is very minor.

>>> 5.3.  Forwarding mapping rule (FMR)
>>
>> Rename this section to: "Deriving IPv4 routes from MAP rules"
>
> see top.

Well, the problem with this is that this section *does* apply to BMRs as 
well, unless I am mistaken...

>>>    |        32 bits           |         |    16 bits        |
>>>    +--------------------------+         +-------------------+
>>>    | IPv4 destination address |         |  IPv4 dest port   |
>>>    +--------------------------+         +-------------------+
>>>                    :          :           ___/       :
>>>                    | p bits   |          /  q bits   :
>>>                    +----------+         +------------+
>>>                    |IPv4  sufx|         |Port-Set ID |
>>>                    +----------+         +------------+
>>>                    \          /    ____/    ________/
>>>                      \       :  __/   _____/
>>>                        \     : /     /
>>>    |     n bits         |  o bits   | s bits  |   128-n-o-s bits      |
>>>    +--------------------+-----------+---------+------------+----------+
>>>    |  Rule IPv6 prefix  |  EA bits  |subnet ID|     interface ID      |
>>>    +--------------------+-----------+---------+-----------------------+
>>>    |<---  End-user IPv6 prefix  --->|
>>
>> Remove the above line, because only the BMR contains the End-user IPv6 prefix. In general, MAP rules do not (unless we start referring to other user's End-user IPv6 prefix, but that would become confusing very quickly).
>
> the BMR doesn't contain the End-user ipv6 prefix either.

Hmmm... right. So remove it from both Figure 3 and Figure 7?

>>>                  Figure 7: Deriving of MAP IPv6 address
>>
>> s/MAP IPv6 address/IPv4 route/
>
> where?

In "Figure 7: Deriving of MAP IPv6 address". ;)

>>    A CE that allows
>>>    IPv6 configuration by DHCP SHOULD implement this option.
>>
>> Which one? It needs to be introduced earlier.
>
> with the informative references I suggest we drop this sentence.

WFM.

>>>    A single MAP CE MAY be connected to more than one MAP domain, just as
>>>    any router may have more than one IPv4-enabled service provider
>>>    facing interface and more than one set of associated addresses
>>>    assigned by DHCP.  Each domain a given CE operates within would
>>>    require its own set of MAP configuration elements and would generate
>>>    its own IPv4 address.
>>
>> But we're still limited to one MAP domain per End-user IPv6 prefix, right?
>
> yes.

How about adding: "Note that each MAP domain requires a distinct 
End-User IPv6 prefix."

>>>    For increased reliability and load balancing, the BR IPv6 address MAY
>>>    be an anycast address shared across a given MAP domain.  As MAP is
>>>    stateless, any BR may be used at any time.  If the BR IPv6 address is
>>>    anycast the relay MUST use this anycast IPv6 address as the source
>>>    address in packets relayed to CEs.
>>
>> What about IPv4 anycast?
>
> what about it?

Uh, nevermind, I don't remember, sorry.

>>>    For a shared IPv4 address, a MAP CE forwarding IPv4 packets from the
>>>    LAN performs NAT44 functions first and creates appropriate NAT44
>>>    bindings.  The resulting IPv4 packets MUST contain the source IPv4
>>>    address and source transport identifiers defined by MAP.  The IPv4
>>
>> s/defined by/obtained with/
>
> specified by?

ok.

>>>    A MAP CE receiving an IPv6 packet to its MAP IPv6 address sends this
>>>    packet to the CE's MAP function where it is decapsulated.  All other
>>>    IPv6 traffic is forwarded as per the CE's IPv6 routing rules.  The
>>>    resulting IPv4 packet is then forwarded to the CE's NAT44 function
>>>    where the destination port number MUST be checked against the
>>>    stateful port mapping session table and the destination port number
>>>    MUST be mapped to its original value.
>>
>> The previous sentence should be reworded to allow static port forwarding.
>
> hmm, what do you mean by static port forwarding?

For example, the user goes to the CPE's admin web interface and 
configures a mapping from external port 80 to internal host port 80. 
That's a static mapping that needs to be taken into account by the NAT 
function. The MUSTs above don't seem to allow the necessary wiggle room.

>>>    A MAP BR receiving IPv6 packets selects a best matching MAP domain
>>>    rule based on a longest address match of the packets' source address
>>>    against the BR's configured MAP BMR prefix(es), as well as a match of
>>
>> The BR, being a MAP node, can only have a single BMR, and therefore only one BMR prefix. The alternative would be when the BR is part of multiple MAP domains, which is not what I think you're trying to say. So I'm confused.
>
> I think the intention is to pick the right domain, given that it states "MAP domain rule".
> does anyone else know, have suggestions for better text?

I think what confused me is the phrase "the BR's configured MAP BMR 
prefix(es)". What are those?

Maybe introducing them in section 7.2 would reduce possible confusion...

>>>    the packet destination address against the configured BR IPv6 address
>>>    or FMR prefix(es).  The selected MAP rule allows the BR to determine
>>
>> The "FMR prefix" concept has not been defined by this point.
>
> I can expand that to "FMR Rule IPv6 prefix".

WFM.

>> It should be possible to express this using only "MAP rule".
>
> the BR address isn't a MAP rule, which is why it is written like that.
>
>>>    the EA-bits from the source IPv6 address.  The BR MUST perform a
>>>    validation of the consistency of the source IPv6 address and source
>>>    port number for the packet using BMR.  If the packets source port
>>
>> "source IPv6 address and source port number" --> I don't know which port number this refers to. Especially since later text deals with port numbers...
>
> I'm not sure I understand your concern? isn't the "source port" a known term? e.g. RFC768?
> or is this because there seems to be some redundancy between this paragraph and the next?

Hehehe... I was just wondering if in the phrase "source IPv6 address and 
source port number", the "source port number" is the IPv6 source port or 
the IPv4 source port. I suppose it would be the IPv4 source port since 
that's what you're supposed to verify with the BMR, and there are no 
IPv6 port anyway with protocol 41. That would make sense to me, however 
the next paragraph also deals with IPv4 source port validation. So is it 
just a matter of redundancy between paragraphs, or is my understanding 
incorrect?

> that was a lot! thanks a lot for very good and thorough comment!
>
> and if anyone else has gotten all the way down here.
> Happy New Year!

Likewise!

Simon
-- 
DTN made easy, lean, and smart --> http://postellation.viagenie.ca
NAT64/DNS64 open-source        --> http://ecdysis.viagenie.ca
STUN/TURN server               --> http://numb.viagenie.ca

---

From: Ole Troan <[email-masked]>
Date: Wed, 15 Jan 2014 13:14:47 +0100

Simon,

apologies for the late reply. day job in the way.

> I'm not against that suggestion, as long as the other (previously agreed) adjustments are made. That is, right now the BMR/FMR distinction doesn't make sense because the text says a BMR is an FMR. If that is fixed, then at least we can have a BMR/FMR distinction that makes sense. Not my preference, but it will work.
> 
> Specifically, a BMR it not an FMR because its L flag (to reuse the PIO analogy) may be off, whereas for an FMR it is always on.

good. the text now says the BMR may be an FMR.
e.g. in mesh mode a BMR may also be used for forwarding, but in hub and spoke mode, the BMR is not used for forwarding.

> I understand, and thanks for the reference, but I still think that this is wrong.
> 
> From the point of view of the protocol spec, there is no difference between a node that does not implement MAP and a node that implements MAP but has it turned off. Both are not MAP nodes, again from the point of view of the protocol spec. Unless you want to distinguish between nodes that have the MAP function turned off and those that have it turned on, which I don't think you do in the current text.
> 

thanks. ;-)

>> I'm not quite sure what you mean, could you give a complete figure with your suggested changes?

found it! ;-)

> I just spent some time trying to come up with better text but I realized all of it is repeated from elsewhere.
> 
> Section 5.3:
> Assuming you want to number bits and not frontiers between bits, the 0 should be aligned with the first bit. And I just noticed that index 16 needs to be removed.
> 
> OLD:
>                     0                   1

thanks, fixed.

> Right, but when reading this text I got confused when I reached section 5.2 on FMRs since that reference to Section 5 made me think that Section 5 only applied to BMRs.
> 
> Well, the problem with this is that this section *does* apply to BMRs as well, unless I am mistaken...

only to the extent that it applies to it when it is also an FMR.

> Hmmm... right. So remove it from both Figure 3 and Figure 7?

it is there to help understand where the bits come from.

> In "Figure 7: Deriving of MAP IPv6 address". ;)

I believe the figure title is correct. i.e. it refers to the tunnel endpoint address
that you derive from the IPv4 address and port.

> How about adding: "Note that each MAP domain requires a distinct End-User IPv6 prefix."

agree, added.

> For example, the user goes to the CPE's admin web interface and configures a mapping from external port 80 to internal host port 80. That's a static mapping that needs to be taken into account by the NAT function. The MUSTs above don't seem to allow the necessary wiggle room.

correct. you cannot do that with A+P. the user looses control of the ports.

> I think what confused me is the phrase "the BR's configured MAP BMR prefix(es)". What are those?
> 

we already refer to a MAP rule earlier in the sentence, I suggest we remove the MAP BMR part.

> Hehehe... I was just wondering if in the phrase "source IPv6 address and source port number", the "source port number" is the IPv6 source port or the IPv4 source port. I suppose it would be the IPv4 source port since that's what you're supposed to verify with the BMR, and there are no IPv6 port anyway with protocol 41. That would make sense to me, however the next paragraph also deals with IPv4 source port validation. So is it just a matter of redundancy between paragraphs, or is my understanding incorrect?

you are right, there is a confusing redundancy there. let me try to untangle it with the co-authors.

I'll then publish an update ASAP.

cheers,
Ole

---

From: Simon Perreault <[email-masked]>
Date: Wed, 15 Jan 2014 08:39:51 -0500

Ole,

Only replying to this part, which I think is important. The rest is fine.

> correct. you cannot do that with A+P. the user looses control of the ports.

I don't see why.

Do we agree that PCP can be used with MAP to manipulate a CPE's mappings?

The fact that the CPE only has access to a limited external port set is 
of no consequence. You still have a NAT, and we need to make sure its 
mappings can be manipulated by the user.

Simon

---

From: Ole Troan <[email-masked]>
Date: Wed, 15 Jan 2014 14:47:59 +0100

Simon,

> The fact that the CPE only has access to a limited external port set is of no consequence. You still have a NAT, and we need to make sure its mappings can be manipulated by the user.

yes, apologies being sloppy there. you can use PCP.
it may be of limited use, e.g. if your web server is trying to use PCP to open port 80.

cheers,
Ole

---

From: Simon Perreault <[email-masked]>
Date: Wed, 15 Jan 2014 08:54:39 -0500

> it may be of limited use, e.g. if your web server is trying to use PCP to open port 80.

Yes of course. I'm more concerned about modern apps that don't rely on 
well-known ports.

My point, concretely, is that the MUSTs above seem to preclude user 
manipulation of the NAT mappings. I would suggest instead:

   A MAP CE receiving an IPv6 packet to its MAP IPv6 address sends this
   packet to the CE's MAP function where it is decapsulated.  All other
   IPv6 traffic is forwarded as per the CE's IPv6 routing rules.  The
   resulting IPv4 packet is then forwarded to the CE's NAT44 function,
   where it is handled according to the NAT's state.

Simon

---

From: Ole Troan <[email-masked]>
Date: Wed, 15 Jan 2014 15:01:20 +0100

Simon,

> Yes of course. I'm more concerned about modern apps that don't rely on well-known ports.
> 
> My point, concretely, is that the MUSTs above seem to preclude user manipulation of the NAT mappings. I would suggest instead:
> 

agree, MAP should treat the NAT as a black box. apart from that it must be port range aware.

cheers,
Ole