Merge into master from pull request #367:
pyloxi: fix alignment inside unaligned structures (https://github.com/floodlight/loxigen/pull/367)
diff --git a/py_gen/templates/_unpack.py b/py_gen/templates/_unpack.py
index cce9de3..f5c4e34 100644
--- a/py_gen/templates/_unpack.py
+++ b/py_gen/templates/_unpack.py
@@ -35,7 +35,7 @@
 ::     elif type(m) == OFLengthMember:
         _${m.name} = ${gen_unpack_expr(m.oftype, 'reader', version=version)}
         orig_reader = reader
-        reader = orig_reader.slice(_${m.name} - (${m.offset} + ${m.length}))
+        reader = orig_reader.slice(_${m.name}, ${m.offset + m.length})
 ::     elif type(m) == OFFieldLengthMember:
 ::         field_length_members[m.field_name] = m
         _${m.name} = ${gen_unpack_expr(m.oftype, 'reader', version=version)}
diff --git a/py_gen/templates/generic_util.py b/py_gen/templates/generic_util.py
index 039d82a..02f1c0e 100644
--- a/py_gen/templates/generic_util.py
+++ b/py_gen/templates/generic_util.py
@@ -105,7 +105,7 @@
         self.offset += length
 
     def skip_align(self):
-        new_offset = ((self.start + self.offset + 7) / 8 * 8) - self.start
+        new_offset = (self.offset + 7) / 8 * 8
         if new_offset > self.length:
             raise loxi.ProtocolError("Buffer too short")
         self.offset = new_offset
@@ -114,9 +114,10 @@
         return self.offset == self.length
 
     # Used when parsing objects that have their own length fields
-    def slice(self, length):
-        if self.offset + length > self.length:
+    def slice(self, length, rewind=0):
+        if self.offset + length - rewind > self.length:
             raise loxi.ProtocolError("Buffer too short")
-        reader = OFReader(self.buf, self.start + self.offset, length)
-        self.offset += length
+        reader = OFReader(self.buf, self.start + self.offset - rewind, length)
+        reader.skip(rewind)
+        self.offset += length - rewind
         return reader
diff --git a/py_gen/tests/generic_util.py b/py_gen/tests/generic_util.py
index 03885a2..20a23a4 100644
--- a/py_gen/tests/generic_util.py
+++ b/py_gen/tests/generic_util.py
@@ -102,17 +102,17 @@
         self.assertEquals(reader.is_empty(), True)
 
     def test_skip_align(self):
-        reader = OFReader("abcd" + "efgh" + "ijkl" + "mnop" + "qr")
+        reader = OFReader("abcd" + "efgh" + "ijkl" + "mnop" + "qrst")
         reader.skip_align()
         self.assertEquals(reader.peek('2s')[0], 'ab')
         self.assertEquals(reader.read('2s')[0], "ab")
         reader.skip_align()
         self.assertEquals(reader.peek('2s')[0], 'ij')
         self.assertEquals(reader.read('2s')[0], 'ij')
-        child = reader.slice(8)
-        self.assertEquals(child.peek('2s')[0], 'kl')
+        child = reader.slice(10)
+        self.assertEquals(child.read('2s')[0], 'kl')
         child.skip_align()
-        self.assertEquals(child.peek('2s')[0], 'qr')
+        self.assertEquals(child.peek('2s')[0], 'st')
 
 if __name__ == '__main__':
     unittest.main()