diff options
author | Jiri Pirko <jiri@resnulli.us> | 2014-02-18 14:53:18 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-02-18 18:15:42 -0500 |
commit | f7b12606b5de323a2bb5ca1696558efde8f25441 (patch) | |
tree | 1989b7416a95d38161438e73ddff945519984191 /net | |
parent | e83abe37ba492514943f45f7bb1ba6b055eb88b0 (diff) |
rtnl: make ifla_policy static
The only place this is used outside rtnetlink.c is veth. So provide
wrapper function for this usage.
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/rtnetlink.c | 107 |
1 files changed, 56 insertions, 51 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 048dc8d183aa..7b2ad564b303 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -1121,56 +1121,7 @@ nla_put_failure: | |||
1121 | return -EMSGSIZE; | 1121 | return -EMSGSIZE; |
1122 | } | 1122 | } |
1123 | 1123 | ||
1124 | static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | 1124 | static const struct nla_policy ifla_policy[IFLA_MAX+1] = { |
1125 | { | ||
1126 | struct net *net = sock_net(skb->sk); | ||
1127 | int h, s_h; | ||
1128 | int idx = 0, s_idx; | ||
1129 | struct net_device *dev; | ||
1130 | struct hlist_head *head; | ||
1131 | struct nlattr *tb[IFLA_MAX+1]; | ||
1132 | u32 ext_filter_mask = 0; | ||
1133 | |||
1134 | s_h = cb->args[0]; | ||
1135 | s_idx = cb->args[1]; | ||
1136 | |||
1137 | rcu_read_lock(); | ||
1138 | cb->seq = net->dev_base_seq; | ||
1139 | |||
1140 | if (nlmsg_parse(cb->nlh, sizeof(struct ifinfomsg), tb, IFLA_MAX, | ||
1141 | ifla_policy) >= 0) { | ||
1142 | |||
1143 | if (tb[IFLA_EXT_MASK]) | ||
1144 | ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]); | ||
1145 | } | ||
1146 | |||
1147 | for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { | ||
1148 | idx = 0; | ||
1149 | head = &net->dev_index_head[h]; | ||
1150 | hlist_for_each_entry_rcu(dev, head, index_hlist) { | ||
1151 | if (idx < s_idx) | ||
1152 | goto cont; | ||
1153 | if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, | ||
1154 | NETLINK_CB(cb->skb).portid, | ||
1155 | cb->nlh->nlmsg_seq, 0, | ||
1156 | NLM_F_MULTI, | ||
1157 | ext_filter_mask) <= 0) | ||
1158 | goto out; | ||
1159 | |||
1160 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); | ||
1161 | cont: | ||
1162 | idx++; | ||
1163 | } | ||
1164 | } | ||
1165 | out: | ||
1166 | rcu_read_unlock(); | ||
1167 | cb->args[1] = idx; | ||
1168 | cb->args[0] = h; | ||
1169 | |||
1170 | return skb->len; | ||
1171 | } | ||
1172 | |||
1173 | const struct nla_policy ifla_policy[IFLA_MAX+1] = { | ||
1174 | [IFLA_IFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ-1 }, | 1125 | [IFLA_IFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ-1 }, |
1175 | [IFLA_ADDRESS] = { .type = NLA_BINARY, .len = MAX_ADDR_LEN }, | 1126 | [IFLA_ADDRESS] = { .type = NLA_BINARY, .len = MAX_ADDR_LEN }, |
1176 | [IFLA_BROADCAST] = { .type = NLA_BINARY, .len = MAX_ADDR_LEN }, | 1127 | [IFLA_BROADCAST] = { .type = NLA_BINARY, .len = MAX_ADDR_LEN }, |
@@ -1197,7 +1148,6 @@ const struct nla_policy ifla_policy[IFLA_MAX+1] = { | |||
1197 | [IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 }, | 1148 | [IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 }, |
1198 | [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_PORT_ID_LEN }, | 1149 | [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_PORT_ID_LEN }, |
1199 | }; | 1150 | }; |
1200 | EXPORT_SYMBOL(ifla_policy); | ||
1201 | 1151 | ||
1202 | static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { | 1152 | static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { |
1203 | [IFLA_INFO_KIND] = { .type = NLA_STRING }, | 1153 | [IFLA_INFO_KIND] = { .type = NLA_STRING }, |
@@ -1235,6 +1185,61 @@ static const struct nla_policy ifla_port_policy[IFLA_PORT_MAX+1] = { | |||
1235 | [IFLA_PORT_RESPONSE] = { .type = NLA_U16, }, | 1185 | [IFLA_PORT_RESPONSE] = { .type = NLA_U16, }, |
1236 | }; | 1186 | }; |
1237 | 1187 | ||
1188 | static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | ||
1189 | { | ||
1190 | struct net *net = sock_net(skb->sk); | ||
1191 | int h, s_h; | ||
1192 | int idx = 0, s_idx; | ||
1193 | struct net_device *dev; | ||
1194 | struct hlist_head *head; | ||
1195 | struct nlattr *tb[IFLA_MAX+1]; | ||
1196 | u32 ext_filter_mask = 0; | ||
1197 | |||
1198 | s_h = cb->args[0]; | ||
1199 | s_idx = cb->args[1]; | ||
1200 | |||
1201 | rcu_read_lock(); | ||
1202 | cb->seq = net->dev_base_seq; | ||
1203 | |||
1204 | if (nlmsg_parse(cb->nlh, sizeof(struct ifinfomsg), tb, IFLA_MAX, | ||
1205 | ifla_policy) >= 0) { | ||
1206 | |||
1207 | if (tb[IFLA_EXT_MASK]) | ||
1208 | ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]); | ||
1209 | } | ||
1210 | |||
1211 | for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { | ||
1212 | idx = 0; | ||
1213 | head = &net->dev_index_head[h]; | ||
1214 | hlist_for_each_entry_rcu(dev, head, index_hlist) { | ||
1215 | if (idx < s_idx) | ||
1216 | goto cont; | ||
1217 | if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, | ||
1218 | NETLINK_CB(cb->skb).portid, | ||
1219 | cb->nlh->nlmsg_seq, 0, | ||
1220 | NLM_F_MULTI, | ||
1221 | ext_filter_mask) <= 0) | ||
1222 | goto out; | ||
1223 | |||
1224 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); | ||
1225 | cont: | ||
1226 | idx++; | ||
1227 | } | ||
1228 | } | ||
1229 | out: | ||
1230 | rcu_read_unlock(); | ||
1231 | cb->args[1] = idx; | ||
1232 | cb->args[0] = h; | ||
1233 | |||
1234 | return skb->len; | ||
1235 | } | ||
1236 | |||
1237 | int rtnl_nla_parse_ifla(struct nlattr **tb, const struct nlattr *head, int len) | ||
1238 | { | ||
1239 | return nla_parse(tb, IFLA_MAX, head, len, ifla_policy); | ||
1240 | } | ||
1241 | EXPORT_SYMBOL(rtnl_nla_parse_ifla); | ||
1242 | |||
1238 | struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]) | 1243 | struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]) |
1239 | { | 1244 | { |
1240 | struct net *net; | 1245 | struct net *net; |