Skip to content

Commit 93996ad

Browse files
committed
ofp-util: Add type-safe functions for serializing actions.
1 parent 333eba2 commit 93996ad

7 files changed

Lines changed: 122 additions & 114 deletions

File tree

lib/autopath.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,7 @@ autopath_parse(struct nx_action_autopath *ap, const char *s_)
6767
"less than required 65536", s_, n_bits, 1u << n_bits);
6868
}
6969

70-
memset(ap, 0, sizeof *ap);
71-
ap->type = htons(OFPAT_VENDOR);
72-
ap->len = htons(sizeof *ap);
73-
ap->vendor = htonl(NX_VENDOR_ID);
74-
ap->subtype = htons(NXAST_AUTOPATH);
70+
ofputil_init_NXAST_AUTOPATH(ap);
7571
ap->id = htonl(id_int);
7672
ap->ofs_nbits = nxm_encode_ofs_nbits(ofs, n_bits);
7773
ap->dst = htonl(reg);

lib/bundle.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ bundle_parse__(struct ofpbuf *b, const char *s, char **save_ptr,
193193
const char *slave_type, const char *dst,
194194
const char *slave_delim)
195195
{
196+
enum ofputil_action_code code;
196197
struct nx_action_bundle *nab;
197198
uint16_t n_slaves;
198199

@@ -205,7 +206,8 @@ bundle_parse__(struct ofpbuf *b, const char *s, char **save_ptr,
205206
s, slave_delim);
206207
}
207208

208-
b->l2 = ofpbuf_put_zeros(b, sizeof *nab);
209+
code = dst ? OFPUTIL_NXAST_BUNDLE_LOAD : OFPUTIL_NXAST_BUNDLE;
210+
b->l2 = ofputil_put_action(code, b);
209211

210212
n_slaves = 0;
211213
for (;;) {
@@ -229,10 +231,7 @@ bundle_parse__(struct ofpbuf *b, const char *s, char **save_ptr,
229231
}
230232

231233
nab = b->l2;
232-
nab->type = htons(OFPAT_VENDOR);
233234
nab->len = htons(b->size - ((char *) b->l2 - (char *) b->data));
234-
nab->vendor = htonl(NX_VENDOR_ID);
235-
nab->subtype = htons(dst ? NXAST_BUNDLE_LOAD: NXAST_BUNDLE);
236235
nab->n_slaves = htons(n_slaves);
237236
nab->basis = htons(atoi(basis));
238237

lib/multipath.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,7 @@ multipath_parse(struct nx_action_multipath *mp, const char *s_)
180180
ovs_fatal(0, "%s: not enough arguments to multipath action", s_);
181181
}
182182

183-
memset(mp, 0, sizeof *mp);
184-
mp->type = htons(OFPAT_VENDOR);
185-
mp->len = htons(sizeof *mp);
186-
mp->vendor = htonl(NX_VENDOR_ID);
187-
mp->subtype = htons(NXAST_MULTIPATH);
183+
ofputil_init_NXAST_MULTIPATH(mp);
188184
if (!strcasecmp(fields, "eth_src")) {
189185
mp->fields = htons(NX_HASH_FIELDS_ETH_SRC);
190186
} else if (!strcasecmp(fields, "symmetric_l4")) {

lib/nx-match.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,10 +1093,7 @@ nxm_parse_reg_move(struct nx_action_reg_move *move, const char *s)
10931093
"%d bits wide", full_s, src_n_bits, dst_n_bits);
10941094
}
10951095

1096-
move->type = htons(OFPAT_VENDOR);
1097-
move->len = htons(sizeof *move);
1098-
move->vendor = htonl(NX_VENDOR_ID);
1099-
move->subtype = htons(NXAST_REG_MOVE);
1096+
ofputil_init_NXAST_REG_MOVE(move);
11001097
move->n_bits = htons(src_n_bits);
11011098
move->src_ofs = htons(src_ofs);
11021099
move->dst_ofs = htons(dst_ofs);
@@ -1127,10 +1124,7 @@ nxm_parse_reg_load(struct nx_action_reg_load *load, const char *s)
11271124
full_s, value, n_bits);
11281125
}
11291126

1130-
load->type = htons(OFPAT_VENDOR);
1131-
load->len = htons(sizeof *load);
1132-
load->vendor = htonl(NX_VENDOR_ID);
1133-
load->subtype = htons(NXAST_REG_LOAD);
1127+
ofputil_init_NXAST_REG_LOAD(load);
11341128
load->ofs_nbits = nxm_encode_ofs_nbits(ofs, n_bits);
11351129
load->dst = htonl(dst);
11361130
load->value = htonll(value);

lib/ofp-parse.c

Lines changed: 36 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -253,19 +253,12 @@ str_to_ipv6(const char *str_, struct in6_addr *addrp, struct in6_addr *maskp)
253253
free(str);
254254
}
255255

256-
static void *
257-
put_action(struct ofpbuf *b, size_t size, uint16_t type)
258-
{
259-
struct ofp_action_header *ah = ofpbuf_put_zeros(b, size);
260-
ah->type = htons(type);
261-
ah->len = htons(size);
262-
return ah;
263-
}
264-
265256
static struct ofp_action_output *
266257
put_output_action(struct ofpbuf *b, uint16_t port)
267258
{
268-
struct ofp_action_output *oao = put_action(b, sizeof *oao, OFPAT_OUTPUT);
259+
struct ofp_action_output *oao;
260+
261+
oao = ofputil_put_OFPAT_OUTPUT(b);
269262
oao->port = htons(port);
270263
return oao;
271264
}
@@ -282,18 +275,11 @@ parse_enqueue(struct ofpbuf *b, char *arg)
282275
ovs_fatal(0, "\"enqueue\" syntax is \"enqueue:PORT:QUEUE\"");
283276
}
284277

285-
oae = put_action(b, sizeof *oae, OFPAT_ENQUEUE);
278+
oae = ofputil_put_OFPAT_ENQUEUE(b);
286279
oae->port = htons(str_to_u32(port));
287280
oae->queue_id = htonl(str_to_u32(queue));
288281
}
289282

290-
static void
291-
put_dl_addr_action(struct ofpbuf *b, uint16_t type, const char *addr)
292-
{
293-
struct ofp_action_dl_addr *oada = put_action(b, sizeof *oada, type);
294-
str_to_mac(addr, oada->dl_addr);
295-
}
296-
297283
static void
298284
parse_output(struct ofpbuf *b, char *arg)
299285
{
@@ -304,9 +290,7 @@ parse_output(struct ofpbuf *b, char *arg)
304290

305291
nxm_parse_field_bits(arg, &src, &ofs, &n_bits);
306292

307-
naor = put_action(b, sizeof *naor, OFPAT_VENDOR);
308-
naor->vendor = htonl(NX_VENDOR_ID);
309-
naor->subtype = htons(NXAST_OUTPUT_REG);
293+
naor = ofputil_put_NXAST_OUTPUT_REG(b);
310294
naor->ofs_nbits = nxm_encode_ofs_nbits(ofs, n_bits);
311295
naor->src = htonl(src);
312296
naor->max_len = htons(UINT16_MAX);
@@ -316,8 +300,9 @@ parse_output(struct ofpbuf *b, char *arg)
316300
}
317301

318302
static void
319-
parse_resubmit(struct nx_action_resubmit *nar, char *arg)
303+
parse_resubmit(struct ofpbuf *b, char *arg)
320304
{
305+
struct nx_action_resubmit *nar;
321306
char *in_port_s, *table_s;
322307
uint16_t in_port;
323308
uint8_t table;
@@ -339,33 +324,23 @@ parse_resubmit(struct nx_action_resubmit *nar, char *arg)
339324
" on resubmit");
340325
}
341326

342-
nar->vendor = htonl(NX_VENDOR_ID);
343-
nar->in_port = htons(in_port);
344327
if (in_port != OFPP_IN_PORT && table == 255) {
345-
nar->subtype = htons(NXAST_RESUBMIT);
328+
nar = ofputil_put_NXAST_RESUBMIT(b);
346329
} else {
347-
nar->subtype = htons(NXAST_RESUBMIT_TABLE);
330+
nar = ofputil_put_NXAST_RESUBMIT_TABLE(b);
348331
nar->table = table;
349332
}
333+
nar->in_port = htons(in_port);
350334
}
351335

352336
static void
353-
parse_set_tunnel(struct ofpbuf *b, enum ofputil_action_code code,
354-
const char *arg)
337+
parse_set_tunnel(struct ofpbuf *b, const char *arg)
355338
{
356339
uint64_t tun_id = str_to_u64(arg);
357-
if (code == OFPUTIL_NXAST_SET_TUNNEL64 || tun_id > UINT32_MAX) {
358-
struct nx_action_set_tunnel64 *nast64;
359-
nast64 = put_action(b, sizeof *nast64, OFPAT_VENDOR);
360-
nast64->vendor = htonl(NX_VENDOR_ID);
361-
nast64->subtype = htons(NXAST_SET_TUNNEL64);
362-
nast64->tun_id = htonll(tun_id);
340+
if (tun_id > UINT32_MAX) {
341+
ofputil_put_NXAST_SET_TUNNEL64(b)->tun_id = htonll(tun_id);
363342
} else {
364-
struct nx_action_set_tunnel *nast;
365-
nast = put_action(b, sizeof *nast, OFPAT_VENDOR);
366-
nast->vendor = htonl(NX_VENDOR_ID);
367-
nast->subtype = htons(NXAST_SET_TUNNEL);
368-
nast->tun_id = htonl(tun_id);
343+
ofputil_put_NXAST_SET_TUNNEL(b)->tun_id = htonl(tun_id);
369344
}
370345
}
371346

@@ -377,9 +352,7 @@ parse_note(struct ofpbuf *b, const char *arg)
377352
int remainder;
378353
size_t len;
379354

380-
nan = put_action(b, sizeof *nan, OFPAT_VENDOR);
381-
nan->vendor = htonl(NX_VENDOR_ID);
382-
nan->subtype = htons(NXAST_NOTE);
355+
nan = ofputil_put_NXAST_NOTE(b);
383356

384357
b->size -= sizeof nan->note;
385358
while (*arg != '\0') {
@@ -414,68 +387,50 @@ parse_note(struct ofpbuf *b, const char *arg)
414387
static void
415388
parse_named_action(enum ofputil_action_code code, struct ofpbuf *b, char *arg)
416389
{
390+
struct ofp_action_dl_addr *oada;
417391
struct ofp_action_vlan_pcp *oavp;
418392
struct ofp_action_vlan_vid *oavv;
419393
struct ofp_action_nw_addr *oana;
420-
struct ofp_action_nw_tos *oant;
421394
struct ofp_action_tp_port *oata;
422-
struct nx_action_header *nah;
423-
struct nx_action_resubmit *nar;
424-
struct nx_action_set_queue *nasq;
425-
struct nx_action_reg_move *move;
426-
struct nx_action_reg_load *load;
427-
struct nx_action_multipath *nam;
428-
struct nx_action_autopath *naa;
429395

430396
switch (code) {
431397
case OFPUTIL_OFPAT_OUTPUT:
432398
parse_output(b, arg);
433399
break;
434400

435401
case OFPUTIL_OFPAT_SET_VLAN_VID:
436-
oavv = put_action(b, sizeof *oavv, OFPAT_SET_VLAN_VID);
402+
oavv = ofputil_put_OFPAT_SET_VLAN_VID(b);
437403
oavv->vlan_vid = htons(str_to_u32(arg));
438404
break;
439405

440406
case OFPUTIL_OFPAT_SET_VLAN_PCP:
441-
oavp = put_action(b, sizeof *oavp, OFPAT_SET_VLAN_PCP);
407+
oavp = ofputil_put_OFPAT_SET_VLAN_PCP(b);
442408
oavp->vlan_pcp = str_to_u32(arg);
443409
break;
444410

445411
case OFPUTIL_OFPAT_STRIP_VLAN:
446-
put_action(b, sizeof(struct ofp_action_header), OFPAT_STRIP_VLAN);
412+
ofputil_put_OFPAT_STRIP_VLAN(b);
447413
break;
448414

449415
case OFPUTIL_OFPAT_SET_DL_SRC:
450-
put_dl_addr_action(b, OFPAT_SET_DL_SRC, arg);
451-
break;
452-
453416
case OFPUTIL_OFPAT_SET_DL_DST:
454-
put_dl_addr_action(b, OFPAT_SET_DL_DST, arg);
417+
oada = ofputil_put_action(code, b);
418+
str_to_mac(arg, oada->dl_addr);
455419
break;
456420

457421
case OFPUTIL_OFPAT_SET_NW_SRC:
458-
oana = put_action(b, sizeof *oana, OFPAT_SET_NW_SRC);
459-
str_to_ip(arg, &oana->nw_addr, NULL);
460-
break;
461-
462422
case OFPUTIL_OFPAT_SET_NW_DST:
463-
oana = put_action(b, sizeof *oana, OFPAT_SET_NW_DST);
423+
oana = ofputil_put_action(code, b);
464424
str_to_ip(arg, &oana->nw_addr, NULL);
465425
break;
466426

467427
case OFPUTIL_OFPAT_SET_NW_TOS:
468-
oant = put_action(b, sizeof *oant, OFPAT_SET_NW_TOS);
469-
oant->nw_tos = str_to_u32(arg);
428+
ofputil_put_OFPAT_SET_NW_TOS(b)->nw_tos = str_to_u32(arg);
470429
break;
471430

472431
case OFPUTIL_OFPAT_SET_TP_SRC:
473-
oata = put_action(b, sizeof *oata, OFPAT_SET_TP_SRC);
474-
oata->tp_port = htons(str_to_u32(arg));
475-
break;
476-
477432
case OFPUTIL_OFPAT_SET_TP_DST:
478-
oata = put_action(b, sizeof *oata, OFPAT_SET_TP_DST);
433+
oata = ofputil_put_action(code, b);
479434
oata->tp_port = htons(str_to_u32(arg));
480435
break;
481436

@@ -484,50 +439,43 @@ parse_named_action(enum ofputil_action_code code, struct ofpbuf *b, char *arg)
484439
break;
485440

486441
case OFPUTIL_NXAST_RESUBMIT:
487-
nar = put_action(b, sizeof *nar, OFPAT_VENDOR);
488-
parse_resubmit(nar, arg);
442+
parse_resubmit(b, arg);
489443
break;
490444

491445
case OFPUTIL_NXAST_SET_TUNNEL:
492-
case OFPUTIL_NXAST_SET_TUNNEL64:
493-
parse_set_tunnel(b, code, arg);
446+
parse_set_tunnel(b, arg);
494447
break;
495448

496449
case OFPUTIL_NXAST_SET_QUEUE:
497-
nasq = put_action(b, sizeof *nasq, OFPAT_VENDOR);
498-
nasq->vendor = htonl(NX_VENDOR_ID);
499-
nasq->subtype = htons(NXAST_SET_QUEUE);
500-
nasq->queue_id = htonl(str_to_u32(arg));
450+
ofputil_put_NXAST_SET_QUEUE(b)->queue_id = htonl(str_to_u32(arg));
501451
break;
502452

503453
case OFPUTIL_NXAST_POP_QUEUE:
504-
nah = put_action(b, sizeof *nah, OFPAT_VENDOR);
505-
nah->vendor = htonl(NX_VENDOR_ID);
506-
nah->subtype = htons(NXAST_POP_QUEUE);
454+
ofputil_put_NXAST_POP_QUEUE(b);
507455
break;
508456

509457
case OFPUTIL_NXAST_REG_MOVE:
510-
move = ofpbuf_put_uninit(b, sizeof *move);
511-
nxm_parse_reg_move(move, arg);
458+
nxm_parse_reg_move(ofputil_put_NXAST_REG_MOVE(b), arg);
512459
break;
513460

514461
case OFPUTIL_NXAST_REG_LOAD:
515-
load = ofpbuf_put_uninit(b, sizeof *load);
516-
nxm_parse_reg_load(load, arg);
462+
nxm_parse_reg_load(ofputil_put_NXAST_REG_LOAD(b), arg);
517463
break;
518464

519465
case OFPUTIL_NXAST_NOTE:
520466
parse_note(b, arg);
521467
break;
522468

469+
case OFPUTIL_NXAST_SET_TUNNEL64:
470+
ofputil_put_NXAST_SET_TUNNEL64(b)->tun_id = htonll(str_to_u64(arg));
471+
break;
472+
523473
case OFPUTIL_NXAST_MULTIPATH:
524-
nam = ofpbuf_put_uninit(b, sizeof *nam);
525-
multipath_parse(nam, arg);
474+
multipath_parse(ofputil_put_NXAST_MULTIPATH(b), arg);
526475
break;
527476

528477
case OFPUTIL_NXAST_AUTOPATH:
529-
naa = ofpbuf_put_uninit(b, sizeof *naa);
530-
autopath_parse(naa, arg);
478+
autopath_parse(ofputil_put_NXAST_AUTOPATH(b), arg);
531479
break;
532480

533481
case OFPUTIL_NXAST_BUNDLE:

0 commit comments

Comments
 (0)