size_t ofl_structs_match_pack(struct ofl_match_header *src, struct ofp_match *dst, uint8_t* oxm_fields, enum byte_order order, struct ofl_exp *exp) { switch (src->type) { case (OFPMT_OXM): { struct ofl_match *m = (struct ofl_match *)src; struct ofpbuf *b = ofpbuf_new(0); int oxm_len; dst->type = htons(m->header.type); oxm_fields = (uint8_t*) &dst->oxm_fields; dst->length = htons(sizeof(struct ofp_match)); if (src->length){ if (order == HOST_ORDER) oxm_len = oxm_put_match(b, m); else oxm_len = oxm_put_packet_match(b,m); memcpy(oxm_fields, (uint8_t*) ofpbuf_pull(b,oxm_len), oxm_len); dst->length = htons(oxm_len + ((sizeof(struct ofp_match )-4))); ofpbuf_delete(b); return ntohs(dst->length); } else return 0; } default: { if (exp == NULL || exp->match == NULL || exp->match->pack == NULL) { OFL_LOG_WARN(LOG_MODULE, "Trying to pack experimenter match, but no callback was given."); return -1; } return exp->match->pack(src, dst); } } }
size_t ofl_structs_match_pack(struct ofl_match_header *src, struct ofp_match *dst, uint8_t* oxm_fields, struct ofl_exp *exp) { switch (src->type) { case (OFPMT_OXM): { struct ofl_match *m = (struct ofl_match *)src; struct ofpbuf *b = ofpbuf_new(0); int oxm_len; dst->type = htons(m->header.type); oxm_fields = (uint8_t*) &dst->oxm_fields; dst->length = htons(sizeof(struct ofp_match) - 4); if (src->length){ oxm_len = oxm_put_match(b, m); memcpy(oxm_fields, (uint8_t*) ofpbuf_pull(b,oxm_len), oxm_len); dst->length = htons(oxm_len + ((sizeof(struct ofp_match )-4))); ofpbuf_delete(b); return ntohs(dst->length); } else return 0; } //*********************************** // Modified by Bence Ladoczki //case (OFPMT_STANDARD): { //struct ofl_match_standard *m = (struct ofl_match_standard *)src; // //dst->type = htons( m->header.type); //dst->length = htons( OFPMT_STANDARD_LENGTH); //dst->in_port = htonl( m->in_port); //dst->wildcards = htonl( m->wildcards); //memcpy(&(dst->dl_src), &(m->dl_src), OFP_ETH_ALEN); //memcpy(&(dst->dl_src_mask), &(m->dl_src_mask), OFP_ETH_ALEN); //memcpy(&(dst->dl_dst), &(m->dl_dst), OFP_ETH_ALEN); //memcpy(&(dst->dl_dst_mask), &(m->dl_dst_mask), OFP_ETH_ALEN); //dst->dl_vlan = htons( m->dl_vlan); //dst->dl_vlan_pcp = m->dl_vlan_pcp; //memset(dst->pad1, 0x00, 1); //dst->dl_type = htons( m->dl_type); //dst->nw_tos = m->nw_tos; //dst->nw_proto = m->nw_proto; //dst->nw_src = m->nw_src; //dst->nw_src_mask = m->nw_src_mask; //dst->nw_dst = m ->nw_dst; //dst->nw_dst_mask = m->nw_dst_mask; //dst->tp_src = htons( m->tp_src); //dst->tp_dst = htons( m->tp_dst); //dst->mpls_label = htonl( m->mpls_label); //dst->mpls_tc = m->mpls_tc; //memset(dst->pad2, 0x00, 3); //dst->metadata = hton64(m->metadata); //dst->metadata_mask = hton64(m->metadata_mask); // //return sizeof(struct ofp_match); //} //*********************************** default: { if (exp == NULL || exp->match == NULL || exp->match->pack == NULL) { OFL_LOG_WARN(LOG_MODULE, "Setting leak logging file size limit to %"PRIdMAX" bytes", src->type); OFL_LOG_WARN(LOG_MODULE, "Trying to pack experimenter match, but no callback was given."); return -1; } return exp->match->pack(src, dst); } } }