* [RTNETLINK]: Add nested compat attribute
@ 2007-06-22 16:18 Patrick McHardy
2007-06-22 17:21 ` Patrick McHardy
2007-06-25 17:14 ` Waskiewicz Jr, Peter P
0 siblings, 2 replies; 15+ messages in thread
From: Patrick McHardy @ 2007-06-22 16:18 UTC (permalink / raw)
To: David Miller; +Cc: netdev, PJ Waskiewicz, Stephen Hemminger
[-- Attachment #1: Type: text/plain, Size: 378 bytes --]
This patch adds a new attribute type that can be used
to replace non-nested attributes that contain structures
by nested ones in a compatible way.
This can be used in cases like Peter's who is trying to
extend sch_prio, which currently uses a fixed structure
without any holes.
Switching to nested attributes makes sure that the next
person won't run into the same problem.
[-- Attachment #2: 01.diff --]
[-- Type: text/x-diff, Size: 3800 bytes --]
[RTNETLINK]: Add nested compat attribute
Add a nested compat attribute type that can be used to convert
attributes that contain a structure to nested attributes in a
backwards compatible way.
The attribute looks like this:
struct {
[ compat contents ]
struct rtattr {
.rta_len = total size,
.rta_type = type,
} rta;
struct old_structure struct;
[ nested top-level attribute ]
struct rtattr {
.rta_len = nest size,
.rta_type = type,
} nest_attr;
[ optional 0 .. n nested attributes ]
struct rtattr {
.rta_len = private attribute len,
.rta_type = private attribute typ,
} nested_attr;
struct nested_data data;
};
Since both userspace and kernel deal correctly with attributes that are
larger than expected old versions will just parse the compat part and
ignore the rest.
Signed-off-by: Patrick McHardy <kaber@trash.net>
---
commit dece87e23c7cfa1159d3be0ea5b0db89a0fc5872
tree c14be602de94b258e0343816b6c1809233a2ff5f
parent c4edf5d552b1450d903a7e7e2d846f2169087e10
author Patrick McHardy <kaber@gw.localnet> Fri, 22 Jun 2007 17:52:21 +0200
committer Patrick McHardy <kaber@gw.localnet> Fri, 22 Jun 2007 17:52:21 +0200
include/linux/rtnetlink.h | 14 ++++++++++++++
net/core/rtnetlink.c | 16 ++++++++++++++++
2 files changed, 30 insertions(+), 0 deletions(-)
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
index 6127858..6731e7f 100644
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
@@ -570,6 +570,8 @@ static __inline__ int rtattr_strcmp(cons
}
extern int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len);
+extern int rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
+ struct rtattr *rta, void **data, int len);
#define rtattr_parse_nested(tb, max, rta) \
rtattr_parse((tb), (max), RTA_DATA((rta)), RTA_PAYLOAD((rta)))
@@ -638,6 +640,18 @@ #define RTA_NEST_END(skb, start) \
({ (start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
(skb)->len; })
+#define RTA_NEST_COMPAT(skb, type, attrlen, data) \
+({ struct rtattr *__start = (struct rtattr *)skb_tail_pointer(skb); \
+ RTA_PUT(skb, type, attrlen, data); \
+ RTA_NEST(skb, type); \
+ __start; })
+
+#define RTA_NEST_COMPAT_END(skb, start) \
+({ struct rtattr *__nest = (void *)(start) + NLMSG_ALIGN((start)->rta_len); \
+ (start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
+ RTA_NEST_END(skb, __nest); \
+ (skb)->len; })
+
#define RTA_NEST_CANCEL(skb, start) \
({ if (start) \
skb_trim(skb, (unsigned char *) (start) - (skb)->data); \
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 06c0c5a..c25d23b 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -97,6 +97,21 @@ int rtattr_parse(struct rtattr *tb[], in
return 0;
}
+int rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
+ struct rtattr *rta, void **data, int len)
+{
+ if (RTA_PAYLOAD(rta) < len)
+ return -1;
+ *data = RTA_DATA(rta);
+
+ if (RTA_PAYLOAD(rta) >= RTA_ALIGN(len) + sizeof(struct rtattr)) {
+ rta = RTA_DATA(rta) + RTA_ALIGN(len);
+ return rtattr_parse_nested(tb, maxattr, rta);
+ }
+ memset(tb, 0, sizeof(struct rtattr *) * maxattr);
+ return 0;
+}
+
static struct rtnl_link *rtnl_msg_handlers[NPROTO];
static inline int rtm_msgindex(int msgtype)
@@ -1297,6 +1312,7 @@ void __init rtnetlink_init(void)
EXPORT_SYMBOL(__rta_fill);
EXPORT_SYMBOL(rtattr_strlcpy);
EXPORT_SYMBOL(rtattr_parse);
+EXPORT_SYMBOL(rtattr_parse_nested_compat);
EXPORT_SYMBOL(rtnetlink_put_metrics);
EXPORT_SYMBOL(rtnl_lock);
EXPORT_SYMBOL(rtnl_trylock);
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [RTNETLINK]: Add nested compat attribute
2007-06-22 16:18 [RTNETLINK]: Add nested compat attribute Patrick McHardy
@ 2007-06-22 17:21 ` Patrick McHardy
2007-06-25 17:14 ` Waskiewicz Jr, Peter P
1 sibling, 0 replies; 15+ messages in thread
From: Patrick McHardy @ 2007-06-22 17:21 UTC (permalink / raw)
To: David Miller; +Cc: netdev, PJ Waskiewicz, Stephen Hemminger
[-- Attachment #1: Type: text/plain, Size: 717 bytes --]
Patrick McHardy wrote:
> extern int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len);
> +extern int rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
> + struct rtattr *rta, void **data, int len);
>
This version is a bit nicer because it avoids a cast
in the caller and makes the signature match the
existing functions better.
In the previous version it the call would have looked like this:
if (rtattr_parse_nested_compat(tb, TCA_PRIO_MAX, opt, (void *)&qopt,
sizeof(*qopt)))
return -EINVAL;
now its:
if (rtattr_parse_nested_compat(tb, TCA_PRIO_MAX, opt,
qopt, sizeof(*qopt)))
return -EINVAL;
[-- Attachment #2: x --]
[-- Type: text/plain, Size: 4143 bytes --]
[RTNETLINK]: Add nested compat attribute
Add a nested compat attribute type that can be used to convert
attributes that contain a structure to nested attributes in a
backwards compatible way.
The attribute looks like this:
struct {
[ compat contents ]
struct rtattr {
.rta_len = total size,
.rta_type = type,
} rta;
struct old_structure struct;
[ nested top-level attribute ]
struct rtattr {
.rta_len = nest size,
.rta_type = type,
} nest_attr;
[ optional 0 .. n nested attributes ]
struct rtattr {
.rta_len = private attribute len,
.rta_type = private attribute typ,
} nested_attr;
struct nested_data data;
};
Since both userspace and kernel deal correctly with attributes that are
larger than expected old versions will just parse the compat part and
ignore the rest.
Signed-off-by: Patrick McHardy <kaber@trash.net>
---
commit 1e16b5e521172515c53ce96a0bc3cf0e2d77c001
tree c9880c58391e2df77ecab3d9b6a6849947714eb3
parent c4edf5d552b1450d903a7e7e2d846f2169087e10
author Patrick McHardy <kaber@gw.localnet> Fri, 22 Jun 2007 19:06:54 +0200
committer Patrick McHardy <kaber@gw.localnet> Fri, 22 Jun 2007 19:06:54 +0200
include/linux/rtnetlink.h | 18 ++++++++++++++++++
net/core/rtnetlink.c | 14 ++++++++++++++
2 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
index 6127858..d40b0c9 100644
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
@@ -570,10 +570,16 @@ static __inline__ int rtattr_strcmp(cons
}
extern int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len);
+extern int __rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
+ struct rtattr *rta, int len);
#define rtattr_parse_nested(tb, max, rta) \
rtattr_parse((tb), (max), RTA_DATA((rta)), RTA_PAYLOAD((rta)))
+#define rtattr_parse_nested_compat(tb, max, rta, data, len) \
+({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \
+ __rtattr_parse_nested_compat(tb, max, rta, len); })
+
extern int rtnetlink_send(struct sk_buff *skb, u32 pid, u32 group, int echo);
extern int rtnl_unicast(struct sk_buff *skb, u32 pid);
extern int rtnl_notify(struct sk_buff *skb, u32 pid, u32 group,
@@ -638,6 +644,18 @@ #define RTA_NEST_END(skb, start) \
({ (start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
(skb)->len; })
+#define RTA_NEST_COMPAT(skb, type, attrlen, data) \
+({ struct rtattr *__start = (struct rtattr *)skb_tail_pointer(skb); \
+ RTA_PUT(skb, type, attrlen, data); \
+ RTA_NEST(skb, type); \
+ __start; })
+
+#define RTA_NEST_COMPAT_END(skb, start) \
+({ struct rtattr *__nest = (void *)(start) + NLMSG_ALIGN((start)->rta_len); \
+ (start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
+ RTA_NEST_END(skb, __nest); \
+ (skb)->len; })
+
#define RTA_NEST_CANCEL(skb, start) \
({ if (start) \
skb_trim(skb, (unsigned char *) (start) - (skb)->data); \
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 06c0c5a..54c17e4 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -97,6 +97,19 @@ int rtattr_parse(struct rtattr *tb[], in
return 0;
}
+int __rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
+ struct rtattr *rta, int len)
+{
+ if (RTA_PAYLOAD(rta) < len)
+ return -1;
+ if (RTA_PAYLOAD(rta) >= RTA_ALIGN(len) + sizeof(struct rtattr)) {
+ rta = RTA_DATA(rta) + RTA_ALIGN(len);
+ return rtattr_parse_nested(tb, maxattr, rta);
+ }
+ memset(tb, 0, sizeof(struct rtattr *) * maxattr);
+ return 0;
+}
+
static struct rtnl_link *rtnl_msg_handlers[NPROTO];
static inline int rtm_msgindex(int msgtype)
@@ -1297,6 +1310,7 @@ void __init rtnetlink_init(void)
EXPORT_SYMBOL(__rta_fill);
EXPORT_SYMBOL(rtattr_strlcpy);
EXPORT_SYMBOL(rtattr_parse);
+EXPORT_SYMBOL(__rtattr_parse_nested_compat);
EXPORT_SYMBOL(rtnetlink_put_metrics);
EXPORT_SYMBOL(rtnl_lock);
EXPORT_SYMBOL(rtnl_trylock);
^ permalink raw reply related [flat|nested] 15+ messages in thread
* RE: [RTNETLINK]: Add nested compat attribute
2007-06-22 16:18 [RTNETLINK]: Add nested compat attribute Patrick McHardy
2007-06-22 17:21 ` Patrick McHardy
@ 2007-06-25 17:14 ` Waskiewicz Jr, Peter P
2007-06-25 20:50 ` David Miller
1 sibling, 1 reply; 15+ messages in thread
From: Waskiewicz Jr, Peter P @ 2007-06-25 17:14 UTC (permalink / raw)
To: Patrick McHardy, David Miller; +Cc: netdev, Stephen Hemminger
> This patch adds a new attribute type that can be used to
> replace non-nested attributes that contain structures by
> nested ones in a compatible way.
>
> This can be used in cases like Peter's who is trying to
> extend sch_prio, which currently uses a fixed structure
> without any holes.
>
> Switching to nested attributes makes sure that the next
> person won't run into the same problem.
I've been using this patch and the IPROUTE2 patches Patrick has proposed
with no issues. Can someone else look at these patches when they have
time? I'd be interested in seeing them make it into 2.6.23.
Thanks!!
-PJ Waskiewicz
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [RTNETLINK]: Add nested compat attribute
2007-06-25 17:14 ` Waskiewicz Jr, Peter P
@ 2007-06-25 20:50 ` David Miller
2007-06-25 21:01 ` Waskiewicz Jr, Peter P
2007-06-25 21:08 ` Patrick McHardy
0 siblings, 2 replies; 15+ messages in thread
From: David Miller @ 2007-06-25 20:50 UTC (permalink / raw)
To: peter.p.waskiewicz.jr; +Cc: kaber, netdev, shemminger
From: "Waskiewicz Jr, Peter P" <peter.p.waskiewicz.jr@intel.com>
Date: Mon, 25 Jun 2007 10:14:37 -0700
> > This patch adds a new attribute type that can be used to
> > replace non-nested attributes that contain structures by
> > nested ones in a compatible way.
> >
> > This can be used in cases like Peter's who is trying to
> > extend sch_prio, which currently uses a fixed structure
> > without any holes.
> >
> > Switching to nested attributes makes sure that the next
> > person won't run into the same problem.
>
> I've been using this patch and the IPROUTE2 patches Patrick has proposed
> with no issues. Can someone else look at these patches when they have
> time? I'd be interested in seeing them make it into 2.6.23.
I've just put Patrick's patch into the net-2.6.23 tree.
^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [RTNETLINK]: Add nested compat attribute
2007-06-25 20:50 ` David Miller
@ 2007-06-25 21:01 ` Waskiewicz Jr, Peter P
2007-06-25 21:29 ` David Miller
2007-06-25 21:08 ` Patrick McHardy
1 sibling, 1 reply; 15+ messages in thread
From: Waskiewicz Jr, Peter P @ 2007-06-25 21:01 UTC (permalink / raw)
To: David Miller; +Cc: kaber, netdev, shemminger
> From: "Waskiewicz Jr, Peter P" <peter.p.waskiewicz.jr@intel.com>
> Date: Mon, 25 Jun 2007 10:14:37 -0700
>
> > > This patch adds a new attribute type that can be used to replace
> > > non-nested attributes that contain structures by nested ones in a
> > > compatible way.
> > >
> > > This can be used in cases like Peter's who is trying to extend
> > > sch_prio, which currently uses a fixed structure without
> any holes.
> > >
> > > Switching to nested attributes makes sure that the next
> person won't
> > > run into the same problem.
> >
> > I've been using this patch and the IPROUTE2 patches Patrick has
> > proposed with no issues. Can someone else look at these
> patches when
> > they have time? I'd be interested in seeing them make it
> into 2.6.23.
>
> I've just put Patrick's patch into the net-2.6.23 tree.
Awesome Dave!! Thank you very much. :)
-PJ Waskiewicz
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [RTNETLINK]: Add nested compat attribute
2007-06-25 20:50 ` David Miller
2007-06-25 21:01 ` Waskiewicz Jr, Peter P
@ 2007-06-25 21:08 ` Patrick McHardy
2007-06-25 21:32 ` David Miller
1 sibling, 1 reply; 15+ messages in thread
From: Patrick McHardy @ 2007-06-25 21:08 UTC (permalink / raw)
To: David Miller; +Cc: peter.p.waskiewicz.jr, netdev, shemminger
[-- Attachment #1: Type: text/plain, Size: 498 bytes --]
David Miller wrote:
>
>> I've been using this patch and the IPROUTE2 patches Patrick has proposed
>> with no issues. Can someone else look at these patches when they have
>> time? I'd be interested in seeing them make it into 2.6.23.
>>
>
> I've just put Patrick's patch into the net-2.6.23 tree.
>
You seem to have added the netlink patch for the generic
netlink attributes. Peter needs the rtnetlink attribute
patch since qdiscs still use the old stuff.
Attached again to this mail.
[-- Attachment #2: 01.diff --]
[-- Type: text/x-diff, Size: 3800 bytes --]
[RTNETLINK]: Add nested compat attribute
Add a nested compat attribute type that can be used to convert
attributes that contain a structure to nested attributes in a
backwards compatible way.
The attribute looks like this:
struct {
[ compat contents ]
struct rtattr {
.rta_len = total size,
.rta_type = type,
} rta;
struct old_structure struct;
[ nested top-level attribute ]
struct rtattr {
.rta_len = nest size,
.rta_type = type,
} nest_attr;
[ optional 0 .. n nested attributes ]
struct rtattr {
.rta_len = private attribute len,
.rta_type = private attribute typ,
} nested_attr;
struct nested_data data;
};
Since both userspace and kernel deal correctly with attributes that are
larger than expected old versions will just parse the compat part and
ignore the rest.
Signed-off-by: Patrick McHardy <kaber@trash.net>
---
commit dece87e23c7cfa1159d3be0ea5b0db89a0fc5872
tree c14be602de94b258e0343816b6c1809233a2ff5f
parent c4edf5d552b1450d903a7e7e2d846f2169087e10
author Patrick McHardy <kaber@gw.localnet> Fri, 22 Jun 2007 17:52:21 +0200
committer Patrick McHardy <kaber@gw.localnet> Fri, 22 Jun 2007 17:52:21 +0200
include/linux/rtnetlink.h | 14 ++++++++++++++
net/core/rtnetlink.c | 16 ++++++++++++++++
2 files changed, 30 insertions(+), 0 deletions(-)
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
index 6127858..6731e7f 100644
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
@@ -570,6 +570,8 @@ static __inline__ int rtattr_strcmp(cons
}
extern int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len);
+extern int rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
+ struct rtattr *rta, void **data, int len);
#define rtattr_parse_nested(tb, max, rta) \
rtattr_parse((tb), (max), RTA_DATA((rta)), RTA_PAYLOAD((rta)))
@@ -638,6 +640,18 @@ #define RTA_NEST_END(skb, start) \
({ (start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
(skb)->len; })
+#define RTA_NEST_COMPAT(skb, type, attrlen, data) \
+({ struct rtattr *__start = (struct rtattr *)skb_tail_pointer(skb); \
+ RTA_PUT(skb, type, attrlen, data); \
+ RTA_NEST(skb, type); \
+ __start; })
+
+#define RTA_NEST_COMPAT_END(skb, start) \
+({ struct rtattr *__nest = (void *)(start) + NLMSG_ALIGN((start)->rta_len); \
+ (start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
+ RTA_NEST_END(skb, __nest); \
+ (skb)->len; })
+
#define RTA_NEST_CANCEL(skb, start) \
({ if (start) \
skb_trim(skb, (unsigned char *) (start) - (skb)->data); \
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 06c0c5a..c25d23b 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -97,6 +97,21 @@ int rtattr_parse(struct rtattr *tb[], in
return 0;
}
+int rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
+ struct rtattr *rta, void **data, int len)
+{
+ if (RTA_PAYLOAD(rta) < len)
+ return -1;
+ *data = RTA_DATA(rta);
+
+ if (RTA_PAYLOAD(rta) >= RTA_ALIGN(len) + sizeof(struct rtattr)) {
+ rta = RTA_DATA(rta) + RTA_ALIGN(len);
+ return rtattr_parse_nested(tb, maxattr, rta);
+ }
+ memset(tb, 0, sizeof(struct rtattr *) * maxattr);
+ return 0;
+}
+
static struct rtnl_link *rtnl_msg_handlers[NPROTO];
static inline int rtm_msgindex(int msgtype)
@@ -1297,6 +1312,7 @@ void __init rtnetlink_init(void)
EXPORT_SYMBOL(__rta_fill);
EXPORT_SYMBOL(rtattr_strlcpy);
EXPORT_SYMBOL(rtattr_parse);
+EXPORT_SYMBOL(rtattr_parse_nested_compat);
EXPORT_SYMBOL(rtnetlink_put_metrics);
EXPORT_SYMBOL(rtnl_lock);
EXPORT_SYMBOL(rtnl_trylock);
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [RTNETLINK]: Add nested compat attribute
2007-06-25 21:01 ` Waskiewicz Jr, Peter P
@ 2007-06-25 21:29 ` David Miller
2007-06-25 21:33 ` Waskiewicz Jr, Peter P
0 siblings, 1 reply; 15+ messages in thread
From: David Miller @ 2007-06-25 21:29 UTC (permalink / raw)
To: peter.p.waskiewicz.jr; +Cc: kaber, netdev, shemminger
From: "Waskiewicz Jr, Peter P" <peter.p.waskiewicz.jr@intel.com>
Date: Mon, 25 Jun 2007 14:01:31 -0700
> Awesome Dave!! Thank you very much. :)
Please get your next round of patches ready, Patrick and
I can review them and barring any serious issues we can
finally put this stuff in to net-2.6.23.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [RTNETLINK]: Add nested compat attribute
2007-06-25 21:08 ` Patrick McHardy
@ 2007-06-25 21:32 ` David Miller
2007-06-25 23:23 ` Waskiewicz Jr, Peter P
0 siblings, 1 reply; 15+ messages in thread
From: David Miller @ 2007-06-25 21:32 UTC (permalink / raw)
To: kaber; +Cc: peter.p.waskiewicz.jr, netdev, shemminger
From: Patrick McHardy <kaber@trash.net>
Date: Mon, 25 Jun 2007 23:08:09 +0200
> David Miller wrote:
> >
> >> I've been using this patch and the IPROUTE2 patches Patrick has proposed
> >> with no issues. Can someone else look at these patches when they have
> >> time? I'd be interested in seeing them make it into 2.6.23.
> >>
> >
> > I've just put Patrick's patch into the net-2.6.23 tree.
> >
>
> You seem to have added the netlink patch for the generic
> netlink attributes. Peter needs the rtnetlink attribute
> patch since qdiscs still use the old stuff.
>
> Attached again to this mail.
Thanks for the clarification, I thought they were both the
same patch, resent for the sake of tgraf seeing it.
I've applied this one too, thanks Patrick.
^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [RTNETLINK]: Add nested compat attribute
2007-06-25 21:29 ` David Miller
@ 2007-06-25 21:33 ` Waskiewicz Jr, Peter P
2007-06-25 21:34 ` David Miller
0 siblings, 1 reply; 15+ messages in thread
From: Waskiewicz Jr, Peter P @ 2007-06-25 21:33 UTC (permalink / raw)
To: David Miller; +Cc: kaber, netdev, shemminger
> -----Original Message-----
> From: David Miller [mailto:davem@davemloft.net]
> Sent: Monday, June 25, 2007 2:30 PM
> To: Waskiewicz Jr, Peter P
> Cc: kaber@trash.net; netdev@vger.kernel.org;
> shemminger@linux-foundation.org
> Subject: Re: [RTNETLINK]: Add nested compat attribute
>
> From: "Waskiewicz Jr, Peter P" <peter.p.waskiewicz.jr@intel.com>
> Date: Mon, 25 Jun 2007 14:01:31 -0700
>
> > Awesome Dave!! Thank you very much. :)
>
> Please get your next round of patches ready, Patrick and I
> can review them and barring any serious issues we can finally
> put this stuff in to net-2.6.23.
I'm putting them into the latest 2.6.23 tree right now - I'll have them
tested and sent upstream later today.
Thanks Dave,
-PJ Waskiewicz
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [RTNETLINK]: Add nested compat attribute
2007-06-25 21:33 ` Waskiewicz Jr, Peter P
@ 2007-06-25 21:34 ` David Miller
0 siblings, 0 replies; 15+ messages in thread
From: David Miller @ 2007-06-25 21:34 UTC (permalink / raw)
To: peter.p.waskiewicz.jr; +Cc: kaber, netdev, shemminger
From: "Waskiewicz Jr, Peter P" <peter.p.waskiewicz.jr@intel.com>
Date: Mon, 25 Jun 2007 14:33:12 -0700
> I'm putting them into the latest 2.6.23 tree right now - I'll have them
> tested and sent upstream later today.
Please repull as I just put Patrick's RTNETLINK patch in
"for real this time" :-)
^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [RTNETLINK]: Add nested compat attribute
2007-06-25 21:32 ` David Miller
@ 2007-06-25 23:23 ` Waskiewicz Jr, Peter P
2007-06-26 0:15 ` David Miller
2007-06-26 9:58 ` Patrick McHardy
0 siblings, 2 replies; 15+ messages in thread
From: Waskiewicz Jr, Peter P @ 2007-06-25 23:23 UTC (permalink / raw)
To: David Miller, kaber; +Cc: netdev, shemminger
> From: Patrick McHardy <kaber@trash.net>
> Date: Mon, 25 Jun 2007 23:08:09 +0200
>
> > David Miller wrote:
> > >
> > >> I've been using this patch and the IPROUTE2 patches Patrick has
> > >> proposed with no issues. Can someone else look at these patches
> > >> when they have time? I'd be interested in seeing them
> make it into 2.6.23.
> > >>
> > >
> > > I've just put Patrick's patch into the net-2.6.23 tree.
> > >
> >
> > You seem to have added the netlink patch for the generic netlink
> > attributes. Peter needs the rtnetlink attribute patch since qdiscs
> > still use the old stuff.
> >
> > Attached again to this mail.
>
> Thanks for the clarification, I thought they were both the
> same patch, resent for the sake of tgraf seeing it.
>
> I've applied this one too, thanks Patrick.
It looks like the one Patrick resent was the older version that requires
a typecast. This is the function prototype currently in the kernel:
+extern int rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
+ struct rtattr *rta, void **data,
int len);
This is the newer version:
+extern int __rtattr_parse_nested_compat(struct rtattr *tb[], int
maxattr,
+ struct rtattr *rta, int len);
+#define rtattr_parse_nested_compat(tb, max, rta, data, len) \
+({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \
+ __rtattr_parse_nested_compat(tb, max, rta, len); })
+
I can send the update to what's in 2.6.23 as the first patch of my
series, or I can write my function calls using the older callback (which
isn't a problem). Which would you prefer?
Thanks,
-PJ Waskiewicz
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [RTNETLINK]: Add nested compat attribute
2007-06-25 23:23 ` Waskiewicz Jr, Peter P
@ 2007-06-26 0:15 ` David Miller
2007-06-26 10:04 ` Patrick McHardy
2007-06-26 9:58 ` Patrick McHardy
1 sibling, 1 reply; 15+ messages in thread
From: David Miller @ 2007-06-26 0:15 UTC (permalink / raw)
To: peter.p.waskiewicz.jr; +Cc: kaber, netdev, shemminger
From: "Waskiewicz Jr, Peter P" <peter.p.waskiewicz.jr@intel.com>
Date: Mon, 25 Jun 2007 16:23:02 -0700
> It looks like the one Patrick resent was the older version that requires
> a typecast. This is the function prototype currently in the kernel:
>
> +extern int rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
> + struct rtattr *rta, void **data,
> int len);
>
> This is the newer version:
>
> +extern int __rtattr_parse_nested_compat(struct rtattr *tb[], int
> maxattr,
> + struct rtattr *rta, int len);
> +#define rtattr_parse_nested_compat(tb, max, rta, data, len) \
> +({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \
> + __rtattr_parse_nested_compat(tb, max, rta, len); })
> +
>
> I can send the update to what's in 2.6.23 as the first patch of my
> series, or I can write my function calls using the older callback (which
> isn't a problem). Which would you prefer?
Either way is fine with me, just use the interface in the tree
for now and we can fix it up if we add the prototype change.
Meanwhile, Patrick please clear up the situation :-)
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [RTNETLINK]: Add nested compat attribute
2007-06-25 23:23 ` Waskiewicz Jr, Peter P
2007-06-26 0:15 ` David Miller
@ 2007-06-26 9:58 ` Patrick McHardy
1 sibling, 0 replies; 15+ messages in thread
From: Patrick McHardy @ 2007-06-26 9:58 UTC (permalink / raw)
To: Waskiewicz Jr, Peter P; +Cc: David Miller, netdev, shemminger
Waskiewicz Jr, Peter P wrote:
> It looks like the one Patrick resent was the older version that requires
> a typecast. This is the function prototype currently in the kernel:
Oops, sorry, I messed that up. Will fix immediately.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [RTNETLINK]: Add nested compat attribute
2007-06-26 0:15 ` David Miller
@ 2007-06-26 10:04 ` Patrick McHardy
2007-06-26 10:24 ` David Miller
0 siblings, 1 reply; 15+ messages in thread
From: Patrick McHardy @ 2007-06-26 10:04 UTC (permalink / raw)
To: David Miller; +Cc: peter.p.waskiewicz.jr, netdev, shemminger
[-- Attachment #1: Type: text/plain, Size: 186 bytes --]
David Miller wrote:
> Meanwhile, Patrick please clear up the situation :-)
Attached is both an incremental patch and a complete replacement,
please take whichever you like better :)
[-- Attachment #2: complete.diff --]
[-- Type: text/x-diff, Size: 4143 bytes --]
[RTNETLINK]: Add nested compat attribute
Add a nested compat attribute type that can be used to convert
attributes that contain a structure to nested attributes in a
backwards compatible way.
The attribute looks like this:
struct {
[ compat contents ]
struct rtattr {
.rta_len = total size,
.rta_type = type,
} rta;
struct old_structure struct;
[ nested top-level attribute ]
struct rtattr {
.rta_len = nest size,
.rta_type = type,
} nest_attr;
[ optional 0 .. n nested attributes ]
struct rtattr {
.rta_len = private attribute len,
.rta_type = private attribute typ,
} nested_attr;
struct nested_data data;
};
Since both userspace and kernel deal correctly with attributes that are
larger than expected old versions will just parse the compat part and
ignore the rest.
Signed-off-by: Patrick McHardy <kaber@trash.net>
---
commit 1e16b5e521172515c53ce96a0bc3cf0e2d77c001
tree c9880c58391e2df77ecab3d9b6a6849947714eb3
parent c4edf5d552b1450d903a7e7e2d846f2169087e10
author Patrick McHardy <kaber@gw.localnet> Fri, 22 Jun 2007 19:06:54 +0200
committer Patrick McHardy <kaber@gw.localnet> Fri, 22 Jun 2007 19:06:54 +0200
include/linux/rtnetlink.h | 18 ++++++++++++++++++
net/core/rtnetlink.c | 14 ++++++++++++++
2 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
index 6127858..d40b0c9 100644
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
@@ -570,10 +570,16 @@ static __inline__ int rtattr_strcmp(cons
}
extern int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len);
+extern int __rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
+ struct rtattr *rta, int len);
#define rtattr_parse_nested(tb, max, rta) \
rtattr_parse((tb), (max), RTA_DATA((rta)), RTA_PAYLOAD((rta)))
+#define rtattr_parse_nested_compat(tb, max, rta, data, len) \
+({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \
+ __rtattr_parse_nested_compat(tb, max, rta, len); })
+
extern int rtnetlink_send(struct sk_buff *skb, u32 pid, u32 group, int echo);
extern int rtnl_unicast(struct sk_buff *skb, u32 pid);
extern int rtnl_notify(struct sk_buff *skb, u32 pid, u32 group,
@@ -638,6 +644,18 @@ #define RTA_NEST_END(skb, start) \
({ (start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
(skb)->len; })
+#define RTA_NEST_COMPAT(skb, type, attrlen, data) \
+({ struct rtattr *__start = (struct rtattr *)skb_tail_pointer(skb); \
+ RTA_PUT(skb, type, attrlen, data); \
+ RTA_NEST(skb, type); \
+ __start; })
+
+#define RTA_NEST_COMPAT_END(skb, start) \
+({ struct rtattr *__nest = (void *)(start) + NLMSG_ALIGN((start)->rta_len); \
+ (start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
+ RTA_NEST_END(skb, __nest); \
+ (skb)->len; })
+
#define RTA_NEST_CANCEL(skb, start) \
({ if (start) \
skb_trim(skb, (unsigned char *) (start) - (skb)->data); \
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 06c0c5a..54c17e4 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -97,6 +97,19 @@ int rtattr_parse(struct rtattr *tb[], in
return 0;
}
+int __rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
+ struct rtattr *rta, int len)
+{
+ if (RTA_PAYLOAD(rta) < len)
+ return -1;
+ if (RTA_PAYLOAD(rta) >= RTA_ALIGN(len) + sizeof(struct rtattr)) {
+ rta = RTA_DATA(rta) + RTA_ALIGN(len);
+ return rtattr_parse_nested(tb, maxattr, rta);
+ }
+ memset(tb, 0, sizeof(struct rtattr *) * maxattr);
+ return 0;
+}
+
static struct rtnl_link *rtnl_msg_handlers[NPROTO];
static inline int rtm_msgindex(int msgtype)
@@ -1297,6 +1310,7 @@ void __init rtnetlink_init(void)
EXPORT_SYMBOL(__rta_fill);
EXPORT_SYMBOL(rtattr_strlcpy);
EXPORT_SYMBOL(rtattr_parse);
+EXPORT_SYMBOL(__rtattr_parse_nested_compat);
EXPORT_SYMBOL(rtnetlink_put_metrics);
EXPORT_SYMBOL(rtnl_lock);
EXPORT_SYMBOL(rtnl_trylock);
[-- Attachment #3: incremental.diff --]
[-- Type: text/x-diff, Size: 2277 bytes --]
[RTNETLINK]: Fix rtnetlink compat attribute patch
Sent the wrong patch previously.
Signed-off-by: Patrick McHardy <kaber@trash.net>
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
index 5852921..a37be6a 100644
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
@@ -570,12 +570,16 @@ static __inline__ int rtattr_strcmp(const struct rtattr *rta, const char *str)
}
extern int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len);
-extern int rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
- struct rtattr *rta, void **data, int len);
+extern int __rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
+ struct rtattr *rta, int len);
#define rtattr_parse_nested(tb, max, rta) \
rtattr_parse((tb), (max), RTA_DATA((rta)), RTA_PAYLOAD((rta)))
+#define rtattr_parse_nested_compat(tb, max, rta, data, len) \
+({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \
+ __rtattr_parse_nested_compat(tb, max, rta, len); })
+
extern int rtnetlink_send(struct sk_buff *skb, u32 pid, u32 group, int echo);
extern int rtnl_unicast(struct sk_buff *skb, u32 pid);
extern int rtnl_notify(struct sk_buff *skb, u32 pid, u32 group,
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 012363b..0c4be06 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -97,13 +97,11 @@ int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len)
return 0;
}
-int rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
- struct rtattr *rta, void **data, int len)
+int __rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr,
+ struct rtattr *rta, int len)
{
if (RTA_PAYLOAD(rta) < len)
return -1;
- *data = RTA_DATA(rta);
-
if (RTA_PAYLOAD(rta) >= RTA_ALIGN(len) + sizeof(struct rtattr)) {
rta = RTA_DATA(rta) + RTA_ALIGN(len);
return rtattr_parse_nested(tb, maxattr, rta);
@@ -975,7 +973,7 @@ void __init rtnetlink_init(void)
EXPORT_SYMBOL(__rta_fill);
EXPORT_SYMBOL(rtattr_strlcpy);
EXPORT_SYMBOL(rtattr_parse);
-EXPORT_SYMBOL(rtattr_parse_nested_compat);
+EXPORT_SYMBOL(__rtattr_parse_nested_compat);
EXPORT_SYMBOL(rtnetlink_put_metrics);
EXPORT_SYMBOL(rtnl_lock);
EXPORT_SYMBOL(rtnl_trylock);
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [RTNETLINK]: Add nested compat attribute
2007-06-26 10:04 ` Patrick McHardy
@ 2007-06-26 10:24 ` David Miller
0 siblings, 0 replies; 15+ messages in thread
From: David Miller @ 2007-06-26 10:24 UTC (permalink / raw)
To: kaber; +Cc: peter.p.waskiewicz.jr, netdev, shemminger
From: Patrick McHardy <kaber@trash.net>
Date: Tue, 26 Jun 2007 12:04:21 +0200
> David Miller wrote:
> > Meanwhile, Patrick please clear up the situation :-)
>
>
> Attached is both an incremental patch and a complete replacement,
> please take whichever you like better :)
I applied the incremental, thanks.
I'll combine them next time I rebase.
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2007-06-26 10:23 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-06-22 16:18 [RTNETLINK]: Add nested compat attribute Patrick McHardy
2007-06-22 17:21 ` Patrick McHardy
2007-06-25 17:14 ` Waskiewicz Jr, Peter P
2007-06-25 20:50 ` David Miller
2007-06-25 21:01 ` Waskiewicz Jr, Peter P
2007-06-25 21:29 ` David Miller
2007-06-25 21:33 ` Waskiewicz Jr, Peter P
2007-06-25 21:34 ` David Miller
2007-06-25 21:08 ` Patrick McHardy
2007-06-25 21:32 ` David Miller
2007-06-25 23:23 ` Waskiewicz Jr, Peter P
2007-06-26 0:15 ` David Miller
2007-06-26 10:04 ` Patrick McHardy
2007-06-26 10:24 ` David Miller
2007-06-26 9:58 ` Patrick McHardy
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).