X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fdpif-netlink.c;h=5e4839378c9c4f83c02741f49a008b3e1940bb3b;hb=d262ac2c60ce1da7b477737f70e8efd38b32502d;hp=ffeb124eb90081fa8f746d2aa90a5096480e6ce0;hpb=e4e74c3a2b9a83544cb976e5049fb65da9ecbed5;p=cascardo%2Fovs.git diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index ffeb124eb..5e4839378 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -40,6 +40,7 @@ #include "netdev.h" #include "netdev-linux.h" #include "netdev-vport.h" +#include "netlink-conntrack.h" #include "netlink-notifier.h" #include "netlink-socket.h" #include "netlink.h" @@ -1547,6 +1548,9 @@ dpif_netlink_encode_execute(int dp_ifindex, const struct dpif_execute *d_exec, if (d_exec->probe) { nl_msg_put_flag(buf, OVS_PACKET_ATTR_PROBE); } + if (d_exec->mtu) { + nl_msg_put_u16(buf, OVS_PACKET_ATTR_MRU, d_exec->mtu); + } } /* Executes, against 'dpif', up to the first 'n_ops' operations in 'ops'. @@ -1965,6 +1969,7 @@ parse_odp_packet(const struct dpif_netlink *dpif, struct ofpbuf *buf, [OVS_PACKET_ATTR_USERDATA] = { .type = NL_A_UNSPEC, .optional = true }, [OVS_PACKET_ATTR_EGRESS_TUN_KEY] = { .type = NL_A_NESTED, .optional = true }, [OVS_PACKET_ATTR_ACTIONS] = { .type = NL_A_NESTED, .optional = true }, + [OVS_PACKET_ATTR_MRU] = { .type = NL_A_U16, .optional = true } }; struct ovs_header *ovs_header; @@ -2002,6 +2007,7 @@ parse_odp_packet(const struct dpif_netlink *dpif, struct ofpbuf *buf, upcall->userdata = a[OVS_PACKET_ATTR_USERDATA]; upcall->out_tun_key = a[OVS_PACKET_ATTR_EGRESS_TUN_KEY]; upcall->actions = a[OVS_PACKET_ATTR_ACTIONS]; + upcall->mru = a[OVS_PACKET_ATTR_MRU]; /* Allow overwriting the netlink attribute header without reallocating. */ dp_packet_use_stub(&upcall->packet, @@ -2274,6 +2280,69 @@ dpif_netlink_get_datapath_version(void) return version_str; } +#ifdef __linux__ +struct dpif_netlink_ct_dump_state { + struct ct_dpif_dump_state up; + struct nl_ct_dump_state *nl_ct_dump; +}; + +static int +dpif_netlink_ct_dump_start(struct dpif *dpif OVS_UNUSED, + struct ct_dpif_dump_state **dump_, + const uint16_t *zone) +{ + struct dpif_netlink_ct_dump_state *dump; + int err; + + dump = xzalloc(sizeof *dump); + err = nl_ct_dump_start(&dump->nl_ct_dump, zone); + if (err) { + free(dump); + return err; + } + + *dump_ = &dump->up; + + return 0; +} + +static int +dpif_netlink_ct_dump_next(struct dpif *dpif OVS_UNUSED, + struct ct_dpif_dump_state *dump_, + struct ct_dpif_entry *entry) +{ + struct dpif_netlink_ct_dump_state *dump; + + INIT_CONTAINER(dump, dump_, up); + + return nl_ct_dump_next(dump->nl_ct_dump, entry); +} + +static int +dpif_netlink_ct_dump_done(struct dpif *dpif OVS_UNUSED, + struct ct_dpif_dump_state *dump_) +{ + struct dpif_netlink_ct_dump_state *dump; + int err; + + INIT_CONTAINER(dump, dump_, up); + + err = nl_ct_dump_done(dump->nl_ct_dump); + free(dump); + return err; +} + +static int +dpif_netlink_ct_flush(struct dpif *dpif OVS_UNUSED, const uint16_t *zone) +{ + if (zone) { + return nl_ct_flush_zone(*zone); + } else { + return nl_ct_flush(); + } +} +#endif + const struct dpif_class dpif_netlink_class = { "system", NULL, /* init */ @@ -2314,6 +2383,17 @@ const struct dpif_class dpif_netlink_class = { NULL, /* enable_upcall */ NULL, /* disable_upcall */ dpif_netlink_get_datapath_version, /* get_datapath_version */ +#ifdef __linux__ + dpif_netlink_ct_dump_start, + dpif_netlink_ct_dump_next, + dpif_netlink_ct_dump_done, + dpif_netlink_ct_flush, +#else + NULL, /* ct_dump_start */ + NULL, /* ct_dump_next */ + NULL, /* ct_dump_done */ + NULL, /* ct_flush */ +#endif }; static int