This patch adds IGMP support to flow_compose and
flow_extract.

Acked-by: Daniel Borkmann <dbork...@redhat.com>
Acked-by: Thomas Graf <tg...@redhat.com>
Signed-off-by: Flavio Leitner <f...@redhat.com>
---
 lib/flow.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/lib/flow.c b/lib/flow.c
index 83b926f..cdf1ae1 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -81,6 +81,12 @@ pull_icmpv6(struct ofpbuf *packet)
     return ofpbuf_try_pull(packet, sizeof(struct icmp6_hdr));
 }
 
+static struct igmp_header *
+pull_igmp(struct ofpbuf *packet)
+{
+    return ofpbuf_try_pull(packet, IGMP_HEADER_LEN);
+}
+
 static void
 parse_mpls(struct ofpbuf *b, struct flow *flow)
 {
@@ -431,6 +437,13 @@ flow_extract(struct ofpbuf *packet, const struct 
pkt_metadata *md,
                         flow->tp_src = htons(icmp->icmp_type);
                         flow->tp_dst = htons(icmp->icmp_code);
                     }
+                } else if (flow->nw_proto == IPPROTO_IGMP) {
+                    const struct igmp_header *igmp = pull_igmp(&b);
+                    if (igmp) {
+                        flow->igmp_type = htons(igmp->igmp_type);
+                        flow->igmp_code = htons(igmp->igmp_code);
+                        flow->igmp_group.u.ip4 = 
get_16aligned_be32(&igmp->group);
+                    }
                 }
             }
         }
@@ -1276,6 +1289,14 @@ flow_compose_l4(struct ofpbuf *b, const struct flow 
*flow)
             icmp->icmp_type = ntohs(flow->tp_src);
             icmp->icmp_code = ntohs(flow->tp_dst);
             icmp->icmp_csum = csum(icmp, ICMP_HEADER_LEN);
+        } else if (flow->nw_proto == IPPROTO_IGMP) {
+            struct igmp_header *igmp;
+
+            igmp = ofpbuf_put_zeros(b, sizeof *igmp);
+            igmp->igmp_type = ntohs(flow->igmp_type);
+            igmp->igmp_code = ntohs(flow->igmp_code);
+            put_16aligned_be32(&igmp->group, flow->igmp_group.u.ip4);
+            igmp->igmp_csum = csum(igmp, IGMP_HEADER_LEN);
         } else if (flow->nw_proto == IPPROTO_ICMPV6) {
             struct icmp6_hdr *icmp;
 
-- 
1.9.0

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to