+
+ case OFPUTIL_NXAST_PUSH_MPLS: {
+ struct nx_action_push_mpls *nxapm = (struct nx_action_push_mpls *)a;
+ if (!eth_type_mpls(nxapm->ethertype)) {
+ return OFPERR_OFPBAC_BAD_ARGUMENT;
+ }
+ ofpact_put_PUSH_MPLS(out)->ethertype = nxapm->ethertype;
+ break;
+ }
+
+ case OFPUTIL_NXAST_SET_MPLS_TTL: {
+ struct nx_action_mpls_ttl *nxamt = (struct nx_action_mpls_ttl *)a;
+ ofpact_put_SET_MPLS_TTL(out)->ttl = nxamt->ttl;
+ break;
+ }
+
+ case OFPUTIL_NXAST_DEC_MPLS_TTL:
+ ofpact_put_DEC_MPLS_TTL(out);
+ break;
+
+ case OFPUTIL_NXAST_POP_MPLS: {
+ struct nx_action_pop_mpls *nxapm = (struct nx_action_pop_mpls *)a;
+ if (eth_type_mpls(nxapm->ethertype)) {
+ return OFPERR_OFPBAC_BAD_ARGUMENT;
+ }
+ ofpact_put_POP_MPLS(out)->ethertype = nxapm->ethertype;
+ break;
+ }
+
+ case OFPUTIL_NXAST_SAMPLE:
+ error = sample_from_openflow(
+ (const struct nx_action_sample *) a, out);
+ break;