Hi,
in porting the ovs kernel code to the FreeBSD kernel,
compiling with -Wcast-qual -Werror gives some

   warning: cast discards qualifiers from pointer target type

due to 'const' being ignored. Another couple of warnings
are on arguments to format strings.

Attached is a trivial patch (partly from Daniele Di Proietto) that
addresses some of the cases; however, some of them could be
fixed in different ways.

In particular, vport_priv() and vport_from_priv() should be
changed to return a const pointer, but this has a bit of
an avalanche effect on the code and I am not sure if you are
willing to go for it.

We are happy to submit a proper patch according to your
preferences.

In case you just want to use this, here is the signoff

Signed-off-by: Luigi Rizzo <ri...@iet.unipi.it>
Signed-off-by: Daniele Di Proietto <daniele.di.proie...@gmail.com>

cheers
luigi

-- 
-----------------------------------------+-------------------------------
 Prof. Luigi RIZZO, ri...@iet.unipi.it  . Dip. di Ing. dell'Informazione
 http://www.iet.unipi.it/~luigi/        . Universita` di Pisa
 TEL      +39-050-2211611               . via Diotisalvi 2
 Mobile   +39-338-6809875               . 56122 PISA (Italy)
-----------------------------------------+-------------------------------
diff --git a/openvswitch/flow.c b/openvswitch/flow.c
index 410db90..52f6c36 100644
--- a/openvswitch/flow.c
+++ b/openvswitch/flow.c
@@ -229,14 +229,14 @@ static bool ovs_match_validate(const struct sw_flow_match 
*match,
        if ((key_attrs & key_expected) != key_expected) {
                /* Key attributes check failed. */
                OVS_NLERR("Missing expected key attributes (key_attrs=%llx, 
expected=%llx).\n",
-                               key_attrs, key_expected);
+                               (unsigned long long)key_attrs, (unsigned long 
long)key_expected);
                return false;
        }
 
        if ((mask_attrs & mask_allowed) != mask_attrs) {
                /* Mask attributes check failed. */
                OVS_NLERR("Contain more than allowed mask fields 
(mask_attrs=%llx, mask_allowed=%llx).\n",
-                               mask_attrs, mask_allowed);
+                               (unsigned long long)mask_attrs, (unsigned long 
long)mask_allowed);
                return false;
        }
 
@@ -375,8 +375,8 @@ static bool icmp6hdr_ok(struct sk_buff *skb)
 void ovs_flow_key_mask(struct sw_flow_key *dst, const struct sw_flow_key *src,
                       const struct sw_flow_mask *mask)
 {
-       const long *m = (long *)((u8 *)&mask->key + mask->range.start);
-       const long *s = (long *)((u8 *)src + mask->range.start);
+       const long *m = (const long *)((const u8 *)&mask->key + 
mask->range.start);
+       const long *s = (const long *)((const u8 *)src + mask->range.start);
        long *d = (long *)((u8 *)dst + mask->range.start);
        int i;
 
@@ -1006,7 +1012,7 @@ int ovs_flow_extract(struct sk_buff *skb, u16 in_port, 
struct sw_flow_key *key)
 static u32 ovs_flow_hash(const struct sw_flow_key *key, int key_start,
                         int key_end)
 {
-       u32 *hash_key = (u32 *)((u8 *)key + key_start);
+       const u32 *hash_key = (const u32 *)((const u8 *)key + key_start);
        int hash_u32s = (key_end - key_start) >> 2;
 
        /* Make sure number of hash bytes are multiple of u32. */
@@ -1027,8 +1033,8 @@ static int flow_key_start(const struct sw_flow_key *key)
 static bool __cmp_key(const struct sw_flow_key *key1,
                const struct sw_flow_key *key2,  int key_start, int key_end)
 {
-       const long *cp1 = (long *)((u8 *)key1 + key_start);
-       const long *cp2 = (long *)((u8 *)key2 + key_start);
+       const long *cp1 = (const long *)((const u8 *)key1 + key_start);
+       const long *cp2 = (const long *)((const u8 *)key2 + key_start);
        long diffs = 0;
        int i;
 
@@ -2035,8 +2041,8 @@ void ovs_sw_flow_mask_del_ref(struct sw_flow_mask *mask, 
bool deferred)
 static bool ovs_sw_flow_mask_equal(const struct sw_flow_mask *a,
                const struct sw_flow_mask *b)
 {
-       u8 *a_ = (u8 *)&a->key + a->range.start;
-       u8 *b_ = (u8 *)&b->key + b->range.start;
+       const u8 *a_ = (const u8 *)&a->key + a->range.start;
+       const u8 *b_ = (const u8 *)&b->key + b->range.start;
 
        return  (a->range.end == b->range.end)
                && (a->range.start == b->range.start)
diff --git a/openvswitch/vport.h b/openvswitch/vport.h
index 1a9fbce..36f74e1 100644
--- a/openvswitch/vport.h
+++ b/openvswitch/vport.h
@@ -172,7 +172,7 @@ void ovs_vport_deferred_free(struct vport *vport);
  */
 static inline void *vport_priv(const struct vport *vport)
 {
-       return (u8 *)vport + ALIGN(sizeof(struct vport), VPORT_ALIGN);
+       return (u8 *)(uintptr_t)vport + ALIGN(sizeof(struct vport), 
VPORT_ALIGN);
 }
 
 /**
@@ -187,7 +187,7 @@ static inline void *vport_priv(const struct vport *vport)
  */
 static inline struct vport *vport_from_priv(const void *priv)
 {
-       return (struct vport *)(priv - ALIGN(sizeof(struct vport), 
VPORT_ALIGN));
+       return (struct vport *)((u8*)(uintptr_t)priv - ALIGN(sizeof(struct 
vport), VPORT_ALIGN));
 }
 
 void ovs_vport_receive(struct vport *, struct sk_buff *,
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to