Beispiel #1
0
bool
ofp_role_mp_check(struct channel *channel,
                  struct pbuf *pbuf,
                  struct ofp_multipart_request *multipart) {
  bool ret = false;

  if (channel != NULL && multipart != NULL &&
      pbuf != NULL) {
    if (channel_role_get(channel) == OFPCR_ROLE_SLAVE) {
      switch (multipart->type) {
        case OFPMP_TABLE_FEATURES:
          /* Check length */
          if (pbuf_plen_equal_check(pbuf, 0) == LAGOPUS_RESULT_OK) {
            /* Body is empty. */
            ret = true;
          } else {
            ret = false;
          }
          break;
        default:
          ret = true;
          break;
      }
    } else {
      ret = true;
    }
  } else {
    ret = false;
  }

  return ret;
}
lagopus_result_t
ofp_meter_features_request_handle(struct channel *channel,
                                  struct pbuf *pbuf,
                                  struct ofp_header *xid_header,
                                  struct ofp_error *error) {
  lagopus_result_t res = LAGOPUS_RESULT_ANY_FAILURES;
  uint64_t dpid;
  struct ofp_meter_features ofp_meter_features;
  struct pbuf_list *send_pbuf_list = NULL;

  /* check params */
  if (channel != NULL && pbuf != NULL &&
      xid_header != NULL && error != NULL) {
    if (pbuf_plen_equal_check(pbuf, 0) == LAGOPUS_RESULT_OK) {
      /* get datas */
      memset(&ofp_meter_features, 0, sizeof(ofp_meter_features));
      dpid = channel_dpid_get(channel);
      res = ofp_meter_features_get(dpid, &ofp_meter_features, error);
      if (res == LAGOPUS_RESULT_OK) {
        /* create desc reply. */
        res = ofp_meter_features_reply_create(channel,
                                              &send_pbuf_list,
                                              &ofp_meter_features,
                                              xid_header);
        if (res == LAGOPUS_RESULT_OK) {
          /* send desc reply */
          res = channel_send_packet_list(channel, send_pbuf_list);
          if (res != LAGOPUS_RESULT_OK) {
            lagopus_msg_warning("Socket write error (%s).\n",
                                lagopus_error_get_string(res));
          }
        } else {
          lagopus_msg_warning("reply creation failed, (%s).\n",
                              lagopus_error_get_string(res));
        }
        /* free. */
        if (send_pbuf_list != NULL) {
          pbuf_list_free(send_pbuf_list);
        }
      }
    } else {
      lagopus_msg_warning("over packet length.\n");
      ofp_error_set(error, OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
      res = LAGOPUS_RESULT_OFP_ERROR;
    }
  } else {
    res = LAGOPUS_RESULT_INVALID_ARGS;
  }
  return res;
}
/* Group Features Request packet receive. */
lagopus_result_t
ofp_group_features_request_handle(struct channel *channel, struct pbuf *pbuf,
                                  struct ofp_header *xid_header,
                                  struct ofp_error *error) {
  lagopus_result_t ret;
  uint64_t dpid;
  struct ofp_group_features group_features;
  struct pbuf_list *pbuf_list = NULL;

  if (channel != NULL && pbuf != NULL &&
      xid_header != NULL && error != NULL) {
    if (pbuf_plen_equal_check(pbuf, 0) == LAGOPUS_RESULT_OK) {
      dpid = channel_dpid_get(channel);

      ret = ofp_group_features_get(dpid,
                                   &group_features,
                                   error);
      if (ret == LAGOPUS_RESULT_OK) {
        ret = ofp_group_features_reply_create(channel, &pbuf_list,
                                              &group_features,
                                              xid_header);
        if (ret == LAGOPUS_RESULT_OK) {
          /* write packets. */
          ret = channel_send_packet_list(channel, pbuf_list);
          if (ret != LAGOPUS_RESULT_OK) {
            lagopus_msg_warning("Can't write\n");
          }
        } else {
          lagopus_msg_warning("FAILED (%s)\n", lagopus_error_get_string(ret));
        }
      } else {
        lagopus_msg_warning("FAILED (%s)\n", lagopus_error_get_string(ret));
      }
    } else {
      lagopus_msg_warning("over packet length.\n");
      ofp_error_set(error, OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
      ret = LAGOPUS_RESULT_OFP_ERROR;
    }

    /* free. */
    if (pbuf_list != NULL) {
      pbuf_list_free(pbuf_list);
    }
  } else {
    ret = LAGOPUS_RESULT_INVALID_ARGS;
  }

  return ret;
}