ofconn_send_error(const struct ofconn *ofconn,
const struct ofp_header *request, int error)
{
- struct ofpbuf *msg = ofputil_encode_error_msg(error, request);
+ struct ofpbuf *msg;
+
+ msg = ofputil_encode_error_msg(error, request);
if (msg) {
+ static struct vlog_rate_limit err_rl = VLOG_RATE_LIMIT_INIT(10, 10);
+
+ if (!VLOG_DROP_INFO(&err_rl)) {
+ const struct ofputil_msg_type *type;
+ const char *type_name;
+ size_t request_len;
+ char *error_s;
+
+ request_len = ntohs(request->length);
+ type_name = (!ofputil_decode_msg_type_partial(request,
+ MIN(64, request_len),
+ &type)
+ ? ofputil_msg_type_name(type)
+ : "invalid");
+
+ error_s = ofputil_error_to_string(error);
+ VLOG_INFO("%s: sending %s error reply to %s message",
+ rconn_get_name(ofconn->rconn), error_s, type_name);
+ free(error_s);
+ }
ofconn_send_reply(ofconn, msg);
}
}
return !list_is_empty(&ofconn->opgroups);
}
-/* Returns the number of pending opgroups on 'ofconn'. */
-size_t
-ofconn_n_pending_opgroups(const struct ofconn *ofconn)
-{
- return list_size(&ofconn->opgroups);
-}
-
/* Adds 'ofconn_node' to 'ofconn''s list of pending opgroups.
*
* If 'ofconn' is destroyed or its connection drops, then 'ofconn' will remove