pyloxi: support field length members

These are members whose value is the length of another member. This is used in
OpenFlow for variable length members in the middle of a message. Variable
length members at the end do not need a field length member because their
length is implicit. The field length members must come before, but not
necessarily immediately before, the field they refer to.

The only place this was used in OF 1.0 was in packet_out. Now that this is
gnerically supported we can remove the special case code for packet_out.
diff --git a/py_gen/templates/_unpack.py b/py_gen/templates/_unpack.py
index 8be8254..6bf0db6 100644
--- a/py_gen/templates/_unpack.py
+++ b/py_gen/templates/_unpack.py
@@ -26,23 +26,29 @@
 :: # under the EPL.
 ::
 :: # TODO coalesce format strings
-:: from py_gen.codegen import Member, LengthMember, TypeMember, PadMember
+:: from py_gen.codegen import Member, LengthMember, FieldLengthMember, TypeMember, PadMember
         if type(buf) == loxi.generic_util.OFReader:
             reader = buf
         else:
             reader = loxi.generic_util.OFReader(buf)
+:: field_length_members = {}
 :: for m in ofclass.members:
 ::     if type(m) == PadMember:
         reader.skip(${m.length})
-::         continue
-::     #endif
-::     unpack_expr = m.oftype.gen_unpack_expr('reader')
-::     if type(m) == LengthMember:
-        _${m.name} = ${unpack_expr}
+::     elif type(m) == LengthMember:
+        _${m.name} = ${m.oftype.gen_unpack_expr('reader')}
+::     elif type(m) == FieldLengthMember:
+::         field_length_members[m.field_name] = m
+        _${m.name} = ${m.oftype.gen_unpack_expr('reader')}
 ::     elif type(m) == TypeMember:
-        _${m.name} = ${unpack_expr}
+        _${m.name} = ${m.oftype.gen_unpack_expr('reader')}
         assert(_${m.name} == ${m.value})
-::     else:
-        obj.${m.name} = ${unpack_expr}
+::     elif type(m) == Member:
+::         if m.name in field_length_members:
+::             reader_expr = 'reader.slice(_%s)' % field_length_members[m.name].name
+::         else:
+::             reader_expr = 'reader'
+::         #endif
+        obj.${m.name} = ${m.oftype.gen_unpack_expr(reader_expr)}
 ::     #endif
 :: #endfor