~ubuntu-branches/ubuntu/trusty/iproute/trusty-proposed

« back to all changes in this revision

Viewing changes to ip/iplink.c

  • Committer: Bazaar Package Importer
  • Author(s): Alexander Wirt
  • Date: 2008-05-11 11:18:29 UTC
  • mto: This revision was merged to the branch mainline in revision 19.
  • Revision ID: james.westby@ubuntu.com-20080511111829-20tzx317pijcou6h
Tags: upstream-20080417
ImportĀ upstreamĀ versionĀ 20080417

Show diffs side-by-side

added added

removed removed

Lines of Context:
107
107
{
108
108
        struct nlmsgerr *err = (struct nlmsgerr *)NLMSG_DATA(n);
109
109
 
110
 
        if (n->nlmsg_type == NLMSG_ERROR && err->error == -EOPNOTSUPP)
 
110
        if (n->nlmsg_type == NLMSG_ERROR &&
 
111
            (err->error == -EOPNOTSUPP || err->error == -EINVAL))
111
112
                have_rtnl_newlink = 0;
112
113
        else
113
114
                have_rtnl_newlink = 1;
142
143
}
143
144
#endif /* ! IPLINK_IOCTL_COMPAT */
144
145
 
 
146
struct iplink_req {
 
147
        struct nlmsghdr         n;
 
148
        struct ifinfomsg        i;
 
149
        char                    buf[1024];
 
150
};
 
151
 
 
152
int iplink_parse(int argc, char **argv, struct iplink_req *req,
 
153
                char **name, char **type, char **link, char **dev)
 
154
{
 
155
        int ret, len;
 
156
        char abuf[32];
 
157
        int qlen = -1;
 
158
        int mtu = -1;
 
159
 
 
160
        ret = argc;
 
161
 
 
162
        while (argc > 0) {
 
163
                if (strcmp(*argv, "up") == 0) {
 
164
                        req->i.ifi_change |= IFF_UP;
 
165
                        req->i.ifi_flags |= IFF_UP;
 
166
                } else if (strcmp(*argv, "down") == 0) {
 
167
                        req->i.ifi_change |= IFF_UP;
 
168
                        req->i.ifi_flags &= ~IFF_UP;
 
169
                } else if (strcmp(*argv, "name") == 0) {
 
170
                        NEXT_ARG();
 
171
                        *name = *argv;
 
172
                } else if (matches(*argv, "link") == 0) {
 
173
                        NEXT_ARG();
 
174
                        *link = *argv;
 
175
                } else if (matches(*argv, "address") == 0) {
 
176
                        NEXT_ARG();
 
177
                        len = ll_addr_a2n(abuf, sizeof(abuf), *argv);
 
178
                        addattr_l(&req->n, sizeof(*req), IFLA_ADDRESS, abuf, len);
 
179
                } else if (matches(*argv, "broadcast") == 0 ||
 
180
                                strcmp(*argv, "brd") == 0) {
 
181
                        NEXT_ARG();
 
182
                        len = ll_addr_a2n(abuf, sizeof(abuf), *argv);
 
183
                        addattr_l(&req->n, sizeof(*req), IFLA_BROADCAST, abuf, len);
 
184
                } else if (matches(*argv, "txqueuelen") == 0 ||
 
185
                                strcmp(*argv, "qlen") == 0 ||
 
186
                                matches(*argv, "txqlen") == 0) {
 
187
                        NEXT_ARG();
 
188
                        if (qlen != -1)
 
189
                                duparg("txqueuelen", *argv);
 
190
                        if (get_integer(&qlen,  *argv, 0))
 
191
                                invarg("Invalid \"txqueuelen\" value\n", *argv);
 
192
                        addattr_l(&req->n, sizeof(*req), IFLA_TXQLEN, &qlen, 4);
 
193
                } else if (strcmp(*argv, "mtu") == 0) {
 
194
                        NEXT_ARG();
 
195
                        if (mtu != -1)
 
196
                                duparg("mtu", *argv);
 
197
                        if (get_integer(&mtu, *argv, 0))
 
198
                                invarg("Invalid \"mtu\" value\n", *argv);
 
199
                        addattr_l(&req->n, sizeof(*req), IFLA_MTU, &mtu, 4);
 
200
                } else if (strcmp(*argv, "multicast") == 0) {
 
201
                        NEXT_ARG();
 
202
                        req->i.ifi_change |= IFF_MULTICAST;
 
203
                        if (strcmp(*argv, "on") == 0) {
 
204
                                req->i.ifi_flags |= IFF_MULTICAST;
 
205
                        } else if (strcmp(*argv, "off") == 0) {
 
206
                                req->i.ifi_flags &= ~IFF_MULTICAST;
 
207
                        } else
 
208
                                return on_off("multicast");
 
209
                } else if (strcmp(*argv, "allmulticast") == 0) {
 
210
                        NEXT_ARG();
 
211
                        req->i.ifi_change |= IFF_ALLMULTI;
 
212
                        if (strcmp(*argv, "on") == 0) {
 
213
                                req->i.ifi_flags |= IFF_ALLMULTI;
 
214
                        } else if (strcmp(*argv, "off") == 0) {
 
215
                                req->i.ifi_flags &= ~IFF_ALLMULTI;
 
216
                        } else
 
217
                                return on_off("allmulticast");
 
218
                } else if (strcmp(*argv, "promisc") == 0) {
 
219
                        NEXT_ARG();
 
220
                        req->i.ifi_change |= IFF_PROMISC;
 
221
                        if (strcmp(*argv, "on") == 0) {
 
222
                                req->i.ifi_flags |= IFF_PROMISC;
 
223
                        } else if (strcmp(*argv, "off") == 0) {
 
224
                                req->i.ifi_flags &= ~IFF_PROMISC;
 
225
                        } else
 
226
                                return on_off("promisc");
 
227
                } else if (strcmp(*argv, "trailers") == 0) {
 
228
                        NEXT_ARG();
 
229
                        req->i.ifi_change |= IFF_NOTRAILERS;
 
230
                        if (strcmp(*argv, "off") == 0) {
 
231
                                req->i.ifi_flags |= IFF_NOTRAILERS;
 
232
                        } else if (strcmp(*argv, "on") == 0) {
 
233
                                req->i.ifi_flags &= ~IFF_NOTRAILERS;
 
234
                        } else
 
235
                                return on_off("trailers");
 
236
                } else if (strcmp(*argv, "arp") == 0) {
 
237
                        NEXT_ARG();
 
238
                        req->i.ifi_change |= IFF_NOARP;
 
239
                        if (strcmp(*argv, "on") == 0) {
 
240
                                req->i.ifi_flags &= ~IFF_NOARP;
 
241
                        } else if (strcmp(*argv, "off") == 0) {
 
242
                                req->i.ifi_flags |= IFF_NOARP;
 
243
                        } else
 
244
                                return on_off("noarp");
 
245
#ifdef IFF_DYNAMIC
 
246
                } else if (matches(*argv, "dynamic") == 0) {
 
247
                        NEXT_ARG();
 
248
                        req->i.ifi_change |= IFF_DYNAMIC;
 
249
                        if (strcmp(*argv, "on") == 0) {
 
250
                                req->i.ifi_flags |= IFF_DYNAMIC;
 
251
                        } else if (strcmp(*argv, "off") == 0) {
 
252
                                req->i.ifi_flags &= ~IFF_DYNAMIC;
 
253
                        } else
 
254
                                return on_off("dynamic");
 
255
#endif
 
256
                } else if (matches(*argv, "type") == 0) {
 
257
                        NEXT_ARG();
 
258
                        *type = *argv;
 
259
                        argc--; argv++;
 
260
                        break;
 
261
                } else {
 
262
                        if (strcmp(*argv, "dev") == 0) {
 
263
                                NEXT_ARG();
 
264
                        }
 
265
                        if (*dev)
 
266
                                duparg2("dev", *argv);
 
267
                        *dev = *argv;
 
268
                }
 
269
                argc--; argv++;
 
270
        }
 
271
 
 
272
        return ret - argc;
 
273
}
 
274
 
145
275
static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
146
276
{
147
 
        int qlen = -1;
148
 
        int mtu = -1;
149
277
        int len;
150
 
        char abuf[32];
151
278
        char *dev = NULL;
152
279
        char *name = NULL;
153
280
        char *link = NULL;
154
281
        char *type = NULL;
155
282
        struct link_util *lu = NULL;
156
 
        struct {
157
 
                struct nlmsghdr         n;
158
 
                struct ifinfomsg        i;
159
 
                char                    buf[1024];
160
 
        } req;
 
283
        struct iplink_req req;
 
284
        int ret;
161
285
 
162
286
        memset(&req, 0, sizeof(req));
163
287
 
166
290
        req.n.nlmsg_type = cmd;
167
291
        req.i.ifi_family = preferred_family;
168
292
 
169
 
        while (argc > 0) {
170
 
                if (strcmp(*argv, "up") == 0) {
171
 
                        req.i.ifi_change |= IFF_UP;
172
 
                        req.i.ifi_flags |= IFF_UP;
173
 
                } else if (strcmp(*argv, "down") == 0) {
174
 
                        req.i.ifi_change |= IFF_UP;
175
 
                        req.i.ifi_flags &= ~IFF_UP;
176
 
                } else if (strcmp(*argv, "name") == 0) {
177
 
                        NEXT_ARG();
178
 
                        name = *argv;
179
 
                } else if (matches(*argv, "link") == 0) {
180
 
                        NEXT_ARG();
181
 
                        link = *argv;
182
 
                } else if (matches(*argv, "address") == 0) {
183
 
                        NEXT_ARG();
184
 
                        len = ll_addr_a2n(abuf, sizeof(abuf), *argv);
185
 
                        addattr_l(&req.n, sizeof(req), IFLA_ADDRESS, abuf, len);
186
 
                } else if (matches(*argv, "broadcast") == 0 ||
187
 
                           strcmp(*argv, "brd") == 0) {
188
 
                        NEXT_ARG();
189
 
                        len = ll_addr_a2n(abuf, sizeof(abuf), *argv);
190
 
                        addattr_l(&req.n, sizeof(req), IFLA_BROADCAST, abuf, len);
191
 
                } else if (matches(*argv, "txqueuelen") == 0 ||
192
 
                           strcmp(*argv, "qlen") == 0 ||
193
 
                           matches(*argv, "txqlen") == 0) {
194
 
                        NEXT_ARG();
195
 
                        if (qlen != -1)
196
 
                                duparg("txqueuelen", *argv);
197
 
                        if (get_integer(&qlen,  *argv, 0))
198
 
                                invarg("Invalid \"txqueuelen\" value\n", *argv);
199
 
                        addattr_l(&req.n, sizeof(req), IFLA_TXQLEN, &qlen, 4);
200
 
                } else if (strcmp(*argv, "mtu") == 0) {
201
 
                        NEXT_ARG();
202
 
                        if (mtu != -1)
203
 
                                duparg("mtu", *argv);
204
 
                        if (get_integer(&mtu, *argv, 0))
205
 
                                invarg("Invalid \"mtu\" value\n", *argv);
206
 
                        addattr_l(&req.n, sizeof(req), IFLA_MTU, &mtu, 4);
207
 
                } else if (strcmp(*argv, "multicast") == 0) {
208
 
                        NEXT_ARG();
209
 
                        req.i.ifi_change |= IFF_MULTICAST;
210
 
                        if (strcmp(*argv, "on") == 0) {
211
 
                                req.i.ifi_flags |= IFF_MULTICAST;
212
 
                        } else if (strcmp(*argv, "off") == 0) {
213
 
                                req.i.ifi_flags &= ~IFF_MULTICAST;
214
 
                        } else
215
 
                                return on_off("multicast");
216
 
                } else if (strcmp(*argv, "allmulticast") == 0) {
217
 
                        NEXT_ARG();
218
 
                        req.i.ifi_change |= IFF_ALLMULTI;
219
 
                        if (strcmp(*argv, "on") == 0) {
220
 
                                req.i.ifi_flags |= IFF_ALLMULTI;
221
 
                        } else if (strcmp(*argv, "off") == 0) {
222
 
                                req.i.ifi_flags &= ~IFF_ALLMULTI;
223
 
                        } else
224
 
                                return on_off("allmulticast");
225
 
                } else if (strcmp(*argv, "promisc") == 0) {
226
 
                        NEXT_ARG();
227
 
                        req.i.ifi_change |= IFF_PROMISC;
228
 
                        if (strcmp(*argv, "on") == 0) {
229
 
                                req.i.ifi_flags |= IFF_PROMISC;
230
 
                        } else if (strcmp(*argv, "off") == 0) {
231
 
                                req.i.ifi_flags &= ~IFF_PROMISC;
232
 
                        } else
233
 
                                return on_off("promisc");
234
 
                } else if (strcmp(*argv, "trailers") == 0) {
235
 
                        NEXT_ARG();
236
 
                        req.i.ifi_change |= IFF_NOTRAILERS;
237
 
                        if (strcmp(*argv, "off") == 0) {
238
 
                                req.i.ifi_flags |= IFF_NOTRAILERS;
239
 
                        } else if (strcmp(*argv, "on") == 0) {
240
 
                                req.i.ifi_flags &= ~IFF_NOTRAILERS;
241
 
                        } else
242
 
                                return on_off("trailers");
243
 
                } else if (strcmp(*argv, "arp") == 0) {
244
 
                        NEXT_ARG();
245
 
                        req.i.ifi_change |= IFF_NOARP;
246
 
                        if (strcmp(*argv, "on") == 0) {
247
 
                                req.i.ifi_flags &= ~IFF_NOARP;
248
 
                        } else if (strcmp(*argv, "off") == 0) {
249
 
                                req.i.ifi_flags |= IFF_NOARP;
250
 
                        } else
251
 
                                return on_off("noarp");
252
 
#ifdef IFF_DYNAMIC
253
 
                } else if (matches(*argv, "dynamic") == 0) {
254
 
                        NEXT_ARG();
255
 
                        req.i.ifi_change |= IFF_DYNAMIC;
256
 
                        if (strcmp(*argv, "on") == 0) {
257
 
                                req.i.ifi_flags |= IFF_DYNAMIC;
258
 
                        } else if (strcmp(*argv, "off") == 0) {
259
 
                                req.i.ifi_flags &= ~IFF_DYNAMIC;
260
 
                        } else
261
 
                                return on_off("dynamic");
262
 
#endif
263
 
                } else if (matches(*argv, "type") == 0) {
264
 
                        NEXT_ARG();
265
 
                        type = *argv;
266
 
                        argc--; argv++;
267
 
                        break;
268
 
                } else {
269
 
                        if (strcmp(*argv, "dev") == 0) {
270
 
                                NEXT_ARG();
271
 
                        }
272
 
                        if (dev)
273
 
                                duparg2("dev", *argv);
274
 
                        dev = *argv;
275
 
                }
276
 
                argc--; argv++;
277
 
        }
 
293
        ret = iplink_parse(argc, argv, &req, &name, &type, &link, &dev);
 
294
        if (ret < 0)
 
295
                return ret;
278
296
 
 
297
        argc -= ret;
 
298
        argv += ret;
279
299
        ll_init_map(&rth);
280
300
 
281
301
        if (type) {