/* Adds a reassmebled packet to the list of reassembled packets, awaiting some * processing, such as being sent through conntrack. */ static void ipf_reassembled_list_add(struct ovs_list *reassembled_pkt_list, struct reassembled_pkt *rp) /* OVS_REQUIRES(ipf_lock) */ { ovs_list_push_back(reassembled_pkt_list, &rp->rp_list_node); }
/* Adds a list of fragments to the list of completed packets, which will be * subsequently transmitted. */ static void ipf_completed_list_add(struct ovs_list *frag_complete_list, struct ipf_list *ipf_list) /* OVS_REQUIRES(ipf_lock) */ { ovs_list_push_back(frag_complete_list, &ipf_list->list_node); }
void ofputil_encode_bundle_msgs(const struct ofputil_bundle_msg *bms, size_t n_bms, struct ovs_list *requests, enum ofputil_protocol protocol) { enum ofp_version version = ofputil_protocol_to_ofp_version(protocol); for (size_t i = 0; i < n_bms; i++) { struct ofpbuf *request = NULL; switch ((int)bms[i].type) { case OFPTYPE_FLOW_MOD: request = ofputil_encode_flow_mod(&bms[i].fm, protocol); break; case OFPTYPE_GROUP_MOD: request = ofputil_encode_group_mod(version, &bms[i].gm, NULL, -1); break; case OFPTYPE_PACKET_OUT: request = ofputil_encode_packet_out(&bms[i].po, protocol); break; default: break; } if (request) { ovs_list_push_back(requests, &request->list_node); } } }
/* Adds a list of fragments to the list tracking expiry of yet to be * completed reassembled packets, hence subject to expirty. */ static void ipf_expiry_list_add(struct ovs_list *frag_exp_list, struct ipf_list *ipf_list, long long now) /* OVS_REQUIRES(ipf->ipf_lock) */ { enum { IPF_FRAG_LIST_TIMEOUT = 15000, }; ipf_list->expiration = now + IPF_FRAG_LIST_TIMEOUT; ovs_list_push_back(frag_exp_list, &ipf_list->list_node); }
/* Creates a new oftrace_node, populates it with the given 'type' and a copy of * 'text', and appends it to list 'super'. The caller retains ownership of * 'text'. */ struct oftrace_node * oftrace_report(struct ovs_list *super, enum oftrace_node_type type, const char *text) { struct oftrace_node *node = xmalloc(sizeof *node); ovs_list_push_back(super, &node->node); node->type = type; node->text = xstrdup(text); ovs_list_init(&node->subs); return node; }
/* Constructs and returns the beginning of a reply to * OFPT_QUEUE_GET_CONFIG_REQUEST or OFPMP_QUEUE_DESC request 'oh'. The caller * may append information about individual queues with * ofputil_append_queue_get_config_reply(). */ void ofputil_start_queue_get_config_reply(const struct ofp_header *request, struct ovs_list *replies) { struct ofpbuf *reply; ofp_port_t port; uint32_t queue; ovs_assert(!ofputil_decode_queue_get_config_request(request, &port, &queue)); enum ofpraw raw = ofpraw_decode_assert(request); switch ((int) raw) { case OFPRAW_OFPT10_QUEUE_GET_CONFIG_REQUEST: reply = ofpraw_alloc_reply(OFPRAW_OFPT10_QUEUE_GET_CONFIG_REPLY, request, 0); struct ofp10_queue_get_config_reply *qgcr10 = ofpbuf_put_zeros(reply, sizeof *qgcr10); qgcr10->port = htons(ofp_to_u16(port)); break; case OFPRAW_OFPT11_QUEUE_GET_CONFIG_REQUEST: reply = ofpraw_alloc_reply(OFPRAW_OFPT11_QUEUE_GET_CONFIG_REPLY, request, 0); struct ofp11_queue_get_config_reply *qgcr11 = ofpbuf_put_zeros(reply, sizeof *qgcr11); qgcr11->port = ofputil_port_to_ofp11(port); break; case OFPRAW_OFPST14_QUEUE_DESC_REQUEST: reply = ofpraw_alloc_stats_reply(request, 0); break; default: OVS_NOT_REACHED(); } ovs_list_init(replies); ovs_list_push_back(replies, &reply->list_node); }