X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fnetdev-linux.c;h=736b588a8a11638555e83a047960402f20ac8755;hb=87eeed4c03ebb0847c093eeb8a6b7af5f2fd33af;hp=6d46b09e923a0c7f8aecee416cdcfad26f2e626e;hpb=b62aeed2ab06ecb9a3b3a82dc42ebfc2703ef52f;p=openvswitch diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 6d46b09e..736b588a 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -123,10 +123,12 @@ struct gre_config { uint32_t remote_ip; uint32_t in_key; uint32_t out_key; + uint8_t tos; bool have_in_key; bool have_out_key; bool in_csum; bool out_csum; + bool pmtud; }; static struct { @@ -216,7 +218,7 @@ netdev_linux_wait(void) static void netdev_linux_cache_cb(const struct rtnetlink_change *change, - void *aux UNUSED) + void *aux OVS_UNUSED) { struct netdev_dev_linux *dev; if (change) { @@ -242,8 +244,8 @@ netdev_linux_cache_cb(const struct rtnetlink_change *change, /* The arguments are marked as unused to prevent warnings on platforms where * the Netlink interface isn't supported. */ static int -setup_gre_netlink(const char *name UNUSED, struct gre_config *config UNUSED, - bool create UNUSED) +setup_gre_netlink(const char *name OVS_UNUSED, + struct gre_config *config OVS_UNUSED, bool create OVS_UNUSED) { #ifdef GRE_IOCTL_ONLY return EOPNOTSUPP; @@ -256,7 +258,6 @@ setup_gre_netlink(const char *name UNUSED, struct gre_config *config UNUSED, struct nlattr *info_data_hdr; uint16_t iflags = 0; uint16_t oflags = 0; - uint8_t pmtudisc = 0; VLOG_DBG("%s: attempting to create gre device using netlink", name); @@ -315,9 +316,9 @@ setup_gre_netlink(const char *name UNUSED, struct gre_config *config UNUSED, nl_msg_put_u16(&request, IFLA_GRE_OFLAGS, oflags); nl_msg_put_u32(&request, IFLA_GRE_LOCAL, config->local_ip); nl_msg_put_u32(&request, IFLA_GRE_REMOTE, config->remote_ip); - nl_msg_put_u8(&request, IFLA_GRE_PMTUDISC, pmtudisc); - nl_msg_put_u8(&request, IFLA_GRE_TTL, 0); - nl_msg_put_u8(&request, IFLA_GRE_TOS, 0); + nl_msg_put_u8(&request, IFLA_GRE_PMTUDISC, config->pmtud); + nl_msg_put_u8(&request, IFLA_GRE_TTL, IPDEFTTL); + nl_msg_put_u8(&request, IFLA_GRE_TOS, config->tos); info_data_hdr->nla_len = (char *)ofpbuf_tail(&request) - (char *)info_data_hdr; @@ -356,6 +357,8 @@ setup_gre_ioctl(const char *name, struct gre_config *config, bool create) p.iph.protocol = IPPROTO_GRE; p.iph.saddr = config->local_ip; p.iph.daddr = config->remote_ip; + p.iph.ttl = IPDEFTTL; + p.iph.tos = config->tos; if (config->have_in_key) { p.i_flags |= GRE_KEY; @@ -373,6 +376,10 @@ setup_gre_ioctl(const char *name, struct gre_config *config, bool create) p.o_flags |= GRE_CSUM; } + if (config->pmtud) { + p.iph.frag_off = htons(IP_DONT_FRAGMENT); + } + strncpy(ifr.ifr_name, create ? GRE_IOCTL_DEVICE : name, IFNAMSIZ); ifr.ifr_ifru.ifru_data = (void *)&p; @@ -397,7 +404,7 @@ setup_gre_ioctl(const char *name, struct gre_config *config, bool create) /* The arguments are marked as unused to prevent warnings on platforms where * the Netlink interface isn't supported. */ static bool -check_gre_device_netlink(const char *name UNUSED) +check_gre_device_netlink(const char *name OVS_UNUSED) { #ifdef GRE_IOCTL_ONLY return false; @@ -486,6 +493,7 @@ setup_gre(const char *name, const struct shash *args, bool create) memset(&config, 0, sizeof config); config.in_csum = true; config.out_csum = true; + config.pmtud = true; SHASH_FOR_EACH (node, args) { if (!strcmp(node->name, "remote_ip")) { @@ -511,11 +519,17 @@ setup_gre(const char *name, const struct shash *args, bool create) } else if (!strcmp(node->name, "out_key")) { config.have_out_key = true; config.out_key = htonl(atoi(node->data)); + } else if (!strcmp(node->name, "tos")) { + config.tos = atoi(node->data); } else if (!strcmp(node->name, "csum")) { if (!strcmp(node->data, "false")) { config.in_csum = false; config.out_csum = false; } + } else if (!strcmp(node->name, "pmtud")) { + if (!strcmp(node->data, "false")) { + config.pmtud = false; + } } else { VLOG_WARN("unknown gre argument '%s'", node->name); } @@ -569,7 +583,7 @@ error: /* Creates the netdev device of 'type' with 'name'. */ static int -netdev_linux_create_system(const char *name, const char *type UNUSED, +netdev_linux_create_system(const char *name, const char *type OVS_UNUSED, const struct shash *args, struct netdev_dev **netdev_devp) { struct netdev_dev_linux *netdev_dev; @@ -602,7 +616,7 @@ netdev_linux_create_system(const char *name, const char *type UNUSED, * buffers, across all readers. Therefore once data is read it will * be unavailable to other reads for tap devices. */ static int -netdev_linux_create_tap(const char *name, const char *type UNUSED, +netdev_linux_create_tap(const char *name, const char *type OVS_UNUSED, const struct shash *args, struct netdev_dev **netdev_devp) { struct netdev_dev_linux *netdev_dev; @@ -669,7 +683,7 @@ if_up(const char *name) } static int -netdev_linux_create_gre(const char *name, const char *type UNUSED, +netdev_linux_create_gre(const char *name, const char *type OVS_UNUSED, const struct shash *args, struct netdev_dev **netdev_devp) { struct netdev_dev_linux *netdev_dev; @@ -708,7 +722,7 @@ netdev_linux_reconfigure_gre(struct netdev_dev *netdev_dev_, /* The arguments are marked as unused to prevent warnings on platforms where * the Netlink interface isn't supported. */ static int -destroy_gre_netlink(const char *name UNUSED) +destroy_gre_netlink(const char *name OVS_UNUSED) { #ifdef GRE_IOCTL_ONLY return EOPNOTSUPP; @@ -1707,7 +1721,7 @@ do_set_addr(struct netdev *netdev, /* Adds 'router' as a default IP gateway. */ static int -netdev_linux_add_router(struct netdev *netdev UNUSED, struct in_addr router) +netdev_linux_add_router(struct netdev *netdev OVS_UNUSED, struct in_addr router) { struct in_addr any = { INADDR_ANY }; struct rtentry rt; @@ -1874,7 +1888,7 @@ poll_notify(struct list *list) static void netdev_linux_poll_cb(const struct rtnetlink_change *change, - void *aux UNUSED) + void *aux OVS_UNUSED) { if (change) { struct list *list = shash_find_data(&netdev_linux_notifiers,