Commit f90a0a74 authored by Thomas Graf's avatar Thomas Graf Committed by David S. Miller

[RTNETLINK] Fix & cleanup rtm_min/rtm_max

Converts rtm_min and rtm_max arrays to use c99 designated
initializers for easier insertion of new message families.
RTM_GETMULTICAST and RTM_GETANYCAST did not have the minimal
message size specified which means that the netlink message
was parsed for routing attributes starting from the header.
Adds the proper minimal message sizes for these messages
(netlink header + common rtnetlink header) to fix this issue.
Signed-off-by: default avatarThomas Graf <tgraf@suug.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d775fc09
...@@ -93,6 +93,8 @@ enum { ...@@ -93,6 +93,8 @@ enum {
#define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) #define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1)
}; };
#define RTM_FAM(cmd) (((cmd) - RTM_BASE) >> 2)
/* /*
Generic structure for encapsulation of optional route information. Generic structure for encapsulation of optional route information.
It is reminiscent of sockaddr, but with sa_family replaced It is reminiscent of sockaddr, but with sa_family replaced
......
...@@ -88,28 +88,31 @@ struct rtnetlink_link * rtnetlink_links[NPROTO]; ...@@ -88,28 +88,31 @@ struct rtnetlink_link * rtnetlink_links[NPROTO];
static const int rtm_min[(RTM_MAX+1-RTM_BASE)/4] = static const int rtm_min[(RTM_MAX+1-RTM_BASE)/4] =
{ {
NLMSG_LENGTH(sizeof(struct ifinfomsg)), [RTM_FAM(RTM_NEWLINK)] = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
NLMSG_LENGTH(sizeof(struct ifaddrmsg)), [RTM_FAM(RTM_NEWADDR)] = NLMSG_LENGTH(sizeof(struct ifaddrmsg)),
NLMSG_LENGTH(sizeof(struct rtmsg)), [RTM_FAM(RTM_NEWROUTE)] = NLMSG_LENGTH(sizeof(struct rtmsg)),
NLMSG_LENGTH(sizeof(struct ndmsg)), [RTM_FAM(RTM_NEWNEIGH)] = NLMSG_LENGTH(sizeof(struct ndmsg)),
NLMSG_LENGTH(sizeof(struct rtmsg)), [RTM_FAM(RTM_NEWRULE)] = NLMSG_LENGTH(sizeof(struct rtmsg)),
NLMSG_LENGTH(sizeof(struct tcmsg)), [RTM_FAM(RTM_NEWQDISC)] = NLMSG_LENGTH(sizeof(struct tcmsg)),
NLMSG_LENGTH(sizeof(struct tcmsg)), [RTM_FAM(RTM_NEWTCLASS)] = NLMSG_LENGTH(sizeof(struct tcmsg)),
NLMSG_LENGTH(sizeof(struct tcmsg)), [RTM_FAM(RTM_NEWTFILTER)] = NLMSG_LENGTH(sizeof(struct tcmsg)),
NLMSG_LENGTH(sizeof(struct tcamsg)) [RTM_FAM(RTM_NEWACTION)] = NLMSG_LENGTH(sizeof(struct tcamsg)),
[RTM_FAM(RTM_NEWPREFIX)] = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
[RTM_FAM(RTM_GETMULTICAST)] = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
[RTM_FAM(RTM_GETANYCAST)] = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
}; };
static const int rta_max[(RTM_MAX+1-RTM_BASE)/4] = static const int rta_max[(RTM_MAX+1-RTM_BASE)/4] =
{ {
IFLA_MAX, [RTM_FAM(RTM_NEWLINK)] = IFLA_MAX,
IFA_MAX, [RTM_FAM(RTM_NEWADDR)] = IFA_MAX,
RTA_MAX, [RTM_FAM(RTM_NEWROUTE)] = RTA_MAX,
NDA_MAX, [RTM_FAM(RTM_NEWNEIGH)] = NDA_MAX,
RTA_MAX, [RTM_FAM(RTM_NEWRULE)] = RTA_MAX,
TCA_MAX, [RTM_FAM(RTM_NEWQDISC)] = TCA_MAX,
TCA_MAX, [RTM_FAM(RTM_NEWTCLASS)] = TCA_MAX,
TCA_MAX, [RTM_FAM(RTM_NEWTFILTER)] = TCA_MAX,
TCAA_MAX [RTM_FAM(RTM_NEWACTION)] = TCAA_MAX,
}; };
void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data) void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment