aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJiri Pirko <jiri@resnulli.us>2014-02-18 14:53:18 -0500
committerDavid S. Miller <davem@davemloft.net>2014-02-18 18:15:42 -0500
commitf7b12606b5de323a2bb5ca1696558efde8f25441 (patch)
tree1989b7416a95d38161438e73ddff945519984191 /net
parente83abe37ba492514943f45f7bb1ba6b055eb88b0 (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.c107
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
1124static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) 1124static 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));
1161cont:
1162 idx++;
1163 }
1164 }
1165out:
1166 rcu_read_unlock();
1167 cb->args[1] = idx;
1168 cb->args[0] = h;
1169
1170 return skb->len;
1171}
1172
1173const 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};
1200EXPORT_SYMBOL(ifla_policy);
1201 1151
1202static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { 1152static 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
1188static 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));
1225cont:
1226 idx++;
1227 }
1228 }
1229out:
1230 rcu_read_unlock();
1231 cb->args[1] = idx;
1232 cb->args[0] = h;
1233
1234 return skb->len;
1235}
1236
1237int 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}
1241EXPORT_SYMBOL(rtnl_nla_parse_ifla);
1242
1238struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]) 1243struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[])
1239{ 1244{
1240 struct net *net; 1245 struct net *net;