X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=vswitchd%2Fovs-brcompatd.c;h=f98d3f577f7ba928272515cfe4c0d3f04916818d;hb=a8643e447601201aabd1159966bd716e48378f97;hp=41aabe48205c260f9d62ce60f3942cf3f5d23629;hpb=5b44dc995c4fac16d63a980158245ebcf3db7b62;p=sliver-openvswitch.git diff --git a/vswitchd/ovs-brcompatd.c b/vswitchd/ovs-brcompatd.c index 41aabe482..f98d3f577 100644 --- a/vswitchd/ovs-brcompatd.c +++ b/vswitchd/ovs-brcompatd.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks +/* Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -76,7 +76,7 @@ static char *appctl_program; static char *vsctl_program; /* Options that we should generally pass to ovs-vsctl. */ -#define VSCTL_OPTIONS "--timeout=5", "-vANY:console:WARN" +#define VSCTL_OPTIONS "--timeout=5", "-vconsole:warn" /* Netlink socket to bridge compatibility kernel module. */ static struct nl_sock *brc_sock; @@ -280,25 +280,25 @@ parse_command(struct ofpbuf *buffer, uint32_t *seq, const char **br_name, return 0; } -/* Composes and returns a reply to a request made by the datapath with Netlink - * sequence number 'seq' and error code 'error'. The caller may add additional - * attributes to the message, then it may send it with send_reply(). */ +/* Composes and returns a reply to a request made by the datapath with error + * code 'error'. The caller may add additional attributes to the message, then + * it may send it with send_reply(). */ static struct ofpbuf * -compose_reply(uint32_t seq, int error) +compose_reply(int error) { struct ofpbuf *reply = ofpbuf_new(4096); nl_msg_put_genlmsghdr(reply, 32, brc_family, NLM_F_REQUEST, BRC_GENL_C_DP_RESULT, 1); - ((struct nlmsghdr *) reply->data)->nlmsg_seq = seq; nl_msg_put_u32(reply, BRC_GENL_A_ERR_CODE, error); return reply; } -/* Sends 'reply' to the datapath and frees it. */ +/* Sends 'reply' to the datapath, using sequence number 'nlmsg_seq', and frees + * it. */ static void -send_reply(struct ofpbuf *reply) +send_reply(struct ofpbuf *reply, uint32_t nlmsg_seq) { - int retval = nl_sock_send(brc_sock, reply, false); + int retval = nl_sock_send_seq(brc_sock, reply, nlmsg_seq, false); if (retval) { VLOG_WARN_RL(&rl, "replying to brcompat request: %s", strerror(retval)); @@ -311,7 +311,7 @@ send_reply(struct ofpbuf *reply) static void send_simple_reply(uint32_t seq, int error) { - send_reply(compose_reply(seq, error)); + send_reply(compose_reply(error), seq); } static int @@ -456,7 +456,7 @@ handle_fdb_query_cmd(struct ofpbuf *buffer) uint32_t seq; int error; - /* Parse the command received from brcompat_mod. */ + /* Parse the command received from brcompat. */ error = parse_command(buffer, &seq, &linux_name, NULL, &count, &skip); if (error) { return error; @@ -555,10 +555,10 @@ handle_fdb_query_cmd(struct ofpbuf *buffer) free(output); /* Compose and send reply to datapath. */ - reply = compose_reply(seq, 0); + reply = compose_reply(0); nl_msg_put_unspec(reply, BRC_GENL_A_FDB_DATA, query_data.data, query_data.size); - send_reply(reply); + send_reply(reply, seq); /* Free memory. */ ofpbuf_uninit(&query_data); @@ -594,10 +594,10 @@ send_ifindex_reply(uint32_t seq, char *output) } /* Compose and send reply. */ - reply = compose_reply(seq, 0); + reply = compose_reply(0); nl_msg_put_unspec(reply, BRC_GENL_A_IFINDEXES, indices, n_indices * sizeof *indices); - send_reply(reply); + send_reply(reply, seq); /* Free memory. */ free(indices); @@ -654,56 +654,53 @@ handle_get_ports_cmd(struct ofpbuf *buffer) return 0; } -static struct ofpbuf * -brc_recv_update__(void) +static bool +brc_recv_update__(struct ofpbuf *buffer) { for (;;) { - struct ofpbuf *buffer; - int retval; - - retval = nl_sock_recv(brc_sock, &buffer, false); + int retval = nl_sock_recv(brc_sock, buffer, false); switch (retval) { case 0: if (nl_msg_nlmsgerr(buffer, NULL) || nl_msg_nlmsghdr(buffer)->nlmsg_type == NLMSG_DONE) { break; } - return buffer; + return true; case ENOBUFS: break; case EAGAIN: - return NULL; + return false; default: VLOG_WARN_RL(&rl, "brc_recv_update: %s", strerror(retval)); - return NULL; + return false; } - ofpbuf_delete(buffer); } } static void brc_recv_update(void) { - struct ofpbuf *buffer; struct genlmsghdr *genlmsghdr; + uint64_t buffer_stub[1024 / 8]; + struct ofpbuf buffer; - buffer = brc_recv_update__(); - if (!buffer) { - return; + ofpbuf_use_stub(&buffer, buffer_stub, sizeof buffer_stub); + if (!brc_recv_update__(&buffer)) { + goto error; } - genlmsghdr = nl_msg_genlmsghdr(buffer); + genlmsghdr = nl_msg_genlmsghdr(&buffer); if (!genlmsghdr) { VLOG_WARN_RL(&rl, "received packet too short for generic NetLink"); goto error; } - if (nl_msg_nlmsghdr(buffer)->nlmsg_type != brc_family) { + if (nl_msg_nlmsghdr(&buffer)->nlmsg_type != brc_family) { VLOG_DBG_RL(&rl, "received type (%"PRIu16") != brcompat family (%d)", - nl_msg_nlmsghdr(buffer)->nlmsg_type, brc_family); + nl_msg_nlmsghdr(&buffer)->nlmsg_type, brc_family); goto error; } @@ -729,31 +726,31 @@ brc_recv_update(void) switch (genlmsghdr->cmd) { case BRC_GENL_C_DP_ADD: - handle_bridge_cmd(buffer, true); + handle_bridge_cmd(&buffer, true); break; case BRC_GENL_C_DP_DEL: - handle_bridge_cmd(buffer, false); + handle_bridge_cmd(&buffer, false); break; case BRC_GENL_C_PORT_ADD: - handle_port_cmd(buffer, true); + handle_port_cmd(&buffer, true); break; case BRC_GENL_C_PORT_DEL: - handle_port_cmd(buffer, false); + handle_port_cmd(&buffer, false); break; case BRC_GENL_C_FDB_QUERY: - handle_fdb_query_cmd(buffer); + handle_fdb_query_cmd(&buffer); break; case BRC_GENL_C_GET_BRIDGES: - handle_get_bridges_cmd(buffer); + handle_get_bridges_cmd(&buffer); break; case BRC_GENL_C_GET_PORTS: - handle_get_ports_cmd(buffer); + handle_get_ports_cmd(&buffer); break; default: @@ -763,7 +760,7 @@ brc_recv_update(void) } error: - ofpbuf_delete(buffer); + ofpbuf_uninit(&buffer); } static void @@ -808,6 +805,8 @@ main(int argc, char *argv[]) set_program_name(argv[0]); vlog_set_levels(&VLM_reconnect, VLF_ANY_FACILITY, VLL_WARN); + VLOG_WARN("Bridge compatibility is deprecated and may be removed " + "no earlier than February 2013"); parse_options(argc, argv); signal(SIGPIPE, SIG_IGN); process_init();