Skip to content

Commit

Permalink
Several fixes for MPLS match and actions.
Browse files Browse the repository at this point in the history
- Set variable to check if packet is valid to false, after set mpls fields.
- Fix wrong parsing of bit masked fields.
  • Loading branch information
ederlf committed Jan 14, 2013
1 parent 19fdd69 commit 5a8c9ba
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 21 deletions.
64 changes: 45 additions & 19 deletions nbee_link/nbee_link.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

#include "nbee_link.h"
#include "oflib/oxm-match.h"
#include "oflib/ofl-utils.h"
#include "lib/hash.h"
#include "lib/fatal-signal.h"

Expand Down Expand Up @@ -182,15 +183,49 @@ int nblink_extract_proto_fields(struct ofpbuf * pktin, _nbPDMLField * field, str
{
uint8_t i;
uint8_t *masked_field;
masked_field = (uint8_t *) malloc(field->Size);
uint32_t true_value = strtol(field->Value,&pEnd,10);
for (i=0;i<field->Size;i++)
{
masked_field[i] = (uint8_t)((true_value >> (8*(field->Size-i-1)) ) & 0xFF);
}
memcpy(pktout_field->value, masked_field,field->Size);

free(masked_field);
if (header == OXM_OF_VLAN_VID){
uint16_t m_value;
sscanf(field->Value, "%hx", &m_value);
m_value = htons((m_value & VLAN_VID_MASK) >> VLAN_VID_SHIFT);
memcpy(pktout_field->value, &m_value, field->Size);
}
else if (header == OXM_OF_VLAN_PCP){
uint16_t m_value;
sscanf(field->Value, "%hx", &m_value);
m_value = (m_value & VLAN_PCP_MASK) >> VLAN_PCP_SHIFT;
memcpy(pktout_field->value, &m_value, field->Size);
}
else if(header == OXM_OF_IP_DSCP){
uint8_t m_value;
sscanf(field->Value, "%hhx", &m_value);
m_value = m_value & IP_DSCP_MASK;
memcpy(pktout_field->value, &m_value, field->Size);
}
else if(header == OXM_OF_IP_ECN){
uint8_t m_value;
sscanf(field->Value, "%hhx", &m_value);
m_value = m_value & OXM_OF_IP_ECN;
memcpy(pktout_field->value, &m_value, field->Size);
}
else if(header == OXM_OF_MPLS_LABEL){
uint32_t m_value;
sscanf(field->Value, "%x", &m_value);
m_value = htonl((m_value & MPLS_LABEL_MASK) >> MPLS_LABEL_SHIFT);
memcpy(pktout_field->value, &m_value, field->Size);
}
else if (OXM_OF_MPLS_TC){
uint32_t m_value;
sscanf(field->Value, "%x", &m_value);
m_value = (m_value & MPLS_TC_MASK) >> MPLS_TC_SHIFT;
memcpy(pktout_field->value, &m_value, field->Size);
}
else if (OXM_OF_MPLS_BOS){
uint32_t m_value;
sscanf(field->Value, "%x", &m_value);
m_value = (m_value & MPLS_S_MASK) >> MPLS_S_SHIFT;
memcpy(pktout_field->value, &m_value, field->Size);
}

}
else
{
Expand Down Expand Up @@ -248,7 +283,6 @@ int nblink_extract_exthdr_fields(struct ofpbuf * pktin, struct hmap * pktout, ui
next_header == IPV6_TYPE_ESP ){
*ext_hdrs ^= OFPIEH_DEST;
*ext_hdrs ^= OFPIEH_UNSEQ;
printf("here %d\n", *ext_hdrs);
*ext_hdrs = htons(*ext_hdrs);
return 0;
}
Expand Down Expand Up @@ -296,21 +330,14 @@ extern "C" int nblink_packet_parse(struct ofpbuf * pktin, struct hmap * pktout,
ext_hdr_orders.insert( pair<uint16_t,uint16_t>(OFPIEH_FRAG,FRAG_ALLOWED));
ext_hdr_orders.insert( pair<uint16_t,uint16_t>(OFPIEH_AUTH,AUTH_ALLOWED));
ext_hdr_orders.insert( pair<uint16_t,uint16_t>(OFPIEH_ESP,ESP_ALLOWED));

//struct timeval start, end;

//gettimeofday(&start, NULL);
/* Decode packet */
if (Decoder->DecodePacket(LinkLayerType, PacketCounter, pkhdr, (const unsigned char*) (pktin->data)) == nbFAILURE)
{
printf("\nError decoding a packet %s\n\n", Decoder->GetLastError());
// Something went wrong
return -1;
}
/*gettimeofday(&end, NULL);
printf("Elapsed time %ld\n", ((end.tv_sec * 1000000 + end.tv_usec)
- (start.tv_sec * 1000000 + start.tv_usec)));*/
}

PDMLReader->GetCurrentPacket(&curr_packet);

Expand Down Expand Up @@ -461,7 +488,6 @@ extern "C" int nblink_packet_parse(struct ofpbuf * pktin, struct hmap * pktout,
else if (protocol_Name.compare("udp") == 0 && pkt_proto->udp == NULL)
{
pkt_proto->udp = (struct udp_header *) ((uint8_t*) pktin->data + proto->Position);
pkt_proto->tcp = (struct tcp_header *) ((uint8_t*) pktin->data + proto->Position);
PDMLReader->GetPDMLField(proto->Name, (char*) "sport", proto->FirstField, &field);
nblink_extract_proto_fields(pktin, field, pktout, OXM_OF_UDP_SRC);
PDMLReader->GetPDMLField(proto->Name, (char*) "dport", proto->FirstField, &field);
Expand Down
2 changes: 1 addition & 1 deletion oflib/ofl-structs-unpack.c
Original file line number Diff line number Diff line change
Expand Up @@ -1141,7 +1141,7 @@ ofl_structs_oxm_match_unpack(struct ofp_match* src, uint8_t* buf, size_t *len, s
if(ntohs(src->length) > sizeof(struct ofp_match)){
ofpbuf_put(b, buf, ntohs(src->length) - (sizeof(struct ofp_match) -4));
error = oxm_pull_match(b, m, ntohs(src->length) - (sizeof(struct ofp_match) -4));
m->header.length = ntohs(src->length);
m->header.length = ntohs(src->length) - 4;
}
else {
m->header.length = 0;
Expand Down
2 changes: 1 addition & 1 deletion oflib/oxm-match.c
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,7 @@ oxm_entry_ok(const void *p, unsigned int match_len)
unsigned int payload_len;
uint32_t header;

if (match_len < 4) {
if (match_len <= 4) {
if (match_len) {
VLOG_DBG(LOG_MODULE,"oxm_match ends with partial oxm_header");
}
Expand Down
7 changes: 7 additions & 0 deletions udatapath/dp_actions.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,18 +187,21 @@ set_field(struct packet *pkt, struct ofl_action_set_field *act )
mpls = pkt->handle_std->proto->mpls;
mpls->fields = (mpls->fields & ~ntohl(MPLS_LABEL_MASK)) | ntohl((mpls_label << MPLS_LABEL_SHIFT) & MPLS_LABEL_MASK);
memcpy(((uint8_t*)pkt->buffer->data + iter->pos) , &mpls->fields , OXM_LENGTH(iter->header));
pkt->handle_std->valid = false;
return;
}
if (iter->header == OXM_OF_MPLS_TC){
mpls = pkt->handle_std->proto->mpls;
mpls->fields = (mpls->fields & ~ntohl(MPLS_TC_MASK)) | ntohl((*act->field->value << MPLS_TC_SHIFT) & MPLS_TC_MASK);
memcpy(((uint8_t*)pkt->buffer->data + iter->pos) , &mpls->fields , OXM_LENGTH(iter->header));
pkt->handle_std->valid = false;
return;
}
if (iter->header == OXM_OF_MPLS_BOS){
mpls = pkt->handle_std->proto->mpls;
mpls->fields = (mpls->fields & ~ntohl(MPLS_S_MASK)) | ntohl((*act->field->value << MPLS_S_SHIFT) & MPLS_S_MASK);
memcpy(((uint8_t*)pkt->buffer->data + iter->pos) , &mpls->fields , OXM_LENGTH(iter->header));
pkt->handle_std->valid = false;
return;
}
tmp = (uint8_t*) malloc(OXM_LENGTH(iter->header));
Expand Down Expand Up @@ -844,6 +847,10 @@ dp_actions_output_port(struct packet *pkt, uint32_t out_port, uint32_t out_queue
msg.data_length = pkt->buffer->size;
}


if (!pkt->handle_std->valid){
packet_handle_std_validate(pkt->handle_std);
}
m = xmalloc (sizeof(struct ofl_match));
ofl_structs_match_init(m);
/* In this implementation the fields in_port and in_phy_port
Expand Down

0 comments on commit 5a8c9ba

Please sign in to comment.