コード例 #1
0
ファイル: ofl-structs-pack.c プロジェクト: CPqD/nox12oflib
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);
        }
    }
}
コード例 #2
0
ファイル: ofl-structs-pack.c プロジェクト: zoh90/openflow1.3
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);
        }
    }
}