mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-30 00:50:03 +00:00
commit
2e310ba9c3
3
lib/if.h
3
lib/if.h
@ -229,6 +229,9 @@ struct interface
|
|||||||
/* Interface metric */
|
/* Interface metric */
|
||||||
uint32_t metric;
|
uint32_t metric;
|
||||||
|
|
||||||
|
/* Interface Speed in Mb/s */
|
||||||
|
uint32_t speed;
|
||||||
|
|
||||||
/* Interface MTU. */
|
/* Interface MTU. */
|
||||||
unsigned int mtu; /* IPv4 MTU */
|
unsigned int mtu; /* IPv4 MTU */
|
||||||
unsigned int mtu6; /* IPv6 MTU - probably, but not neccessarily same as mtu */
|
unsigned int mtu6; /* IPv6 MTU - probably, but not neccessarily same as mtu */
|
||||||
|
@ -1003,6 +1003,8 @@ zebra_router_id_update_read (struct stream *s, struct prefix *rid)
|
|||||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
* | metric |
|
* | metric |
|
||||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | speed |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
* | ifmtu |
|
* | ifmtu |
|
||||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
* | ifmtu6 |
|
* | ifmtu6 |
|
||||||
@ -1185,6 +1187,7 @@ zebra_interface_if_set_value (struct stream *s, struct interface *ifp)
|
|||||||
ifp->ptm_enable = stream_getc (s);
|
ifp->ptm_enable = stream_getc (s);
|
||||||
ifp->ptm_status = stream_getc (s);
|
ifp->ptm_status = stream_getc (s);
|
||||||
ifp->metric = stream_getl (s);
|
ifp->metric = stream_getl (s);
|
||||||
|
ifp->speed = stream_getl (s);
|
||||||
ifp->mtu = stream_getl (s);
|
ifp->mtu = stream_getl (s);
|
||||||
ifp->mtu6 = stream_getl (s);
|
ifp->mtu6 = stream_getl (s);
|
||||||
ifp->bandwidth = stream_getl (s);
|
ifp->bandwidth = stream_getl (s);
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
|
|
||||||
#include <zebra.h>
|
#include <zebra.h>
|
||||||
#include <net/if_arp.h>
|
#include <net/if_arp.h>
|
||||||
|
#include <linux/sockios.h>
|
||||||
|
#include <linux/ethtool.h>
|
||||||
|
|
||||||
#include "linklist.h"
|
#include "linklist.h"
|
||||||
#include "if.h"
|
#include "if.h"
|
||||||
@ -298,6 +300,47 @@ netlink_vrf_change (struct nlmsghdr *h, struct rtattr *tb, const char *name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_iflink_speed (const char *ifname)
|
||||||
|
{
|
||||||
|
struct ifreq ifdata;
|
||||||
|
struct ethtool_cmd ecmd;
|
||||||
|
int sd;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* initialize struct */
|
||||||
|
memset(&ifdata, 0, sizeof(ifdata));
|
||||||
|
|
||||||
|
/* set interface name */
|
||||||
|
strcpy(ifdata.ifr_name, ifname);
|
||||||
|
|
||||||
|
/* initialize ethtool interface */
|
||||||
|
memset(&ecmd, 0, sizeof(ecmd));
|
||||||
|
ecmd.cmd = ETHTOOL_GSET; /* ETHTOOL_GLINK */
|
||||||
|
ifdata.ifr_data = (__caddr_t) &ecmd;
|
||||||
|
|
||||||
|
/* use ioctl to get IP address of an interface */
|
||||||
|
sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
|
||||||
|
if(sd < 0) {
|
||||||
|
zlog_debug ("Failure to read interface %s speed: %d %s",
|
||||||
|
ifname, errno, safe_strerror(errno));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the current link state for the interface */
|
||||||
|
rc = ioctl(sd, SIOCETHTOOL, (char *)&ifdata);
|
||||||
|
if(rc < 0) {
|
||||||
|
zlog_debug("IOCTL failure to read interface %s speed: %d %s",
|
||||||
|
ifname, errno, safe_strerror(errno));
|
||||||
|
ecmd.speed_hi = 0;
|
||||||
|
ecmd.speed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(sd);
|
||||||
|
|
||||||
|
return (ecmd.speed_hi << 16 ) | ecmd.speed;
|
||||||
|
}
|
||||||
|
|
||||||
/* Called from interface_lookup_netlink(). This function is only used
|
/* Called from interface_lookup_netlink(). This function is only used
|
||||||
during bootstrap. */
|
during bootstrap. */
|
||||||
static int
|
static int
|
||||||
@ -382,6 +425,7 @@ netlink_interface (struct sockaddr_nl *snl, struct nlmsghdr *h,
|
|||||||
SET_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK);
|
SET_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK);
|
||||||
ifp->mtu6 = ifp->mtu = *(uint32_t *) RTA_DATA (tb[IFLA_MTU]);
|
ifp->mtu6 = ifp->mtu = *(uint32_t *) RTA_DATA (tb[IFLA_MTU]);
|
||||||
ifp->metric = 0;
|
ifp->metric = 0;
|
||||||
|
ifp->speed = get_iflink_speed (name);
|
||||||
ifp->ptm_status = ZEBRA_PTM_STATUS_UNKNOWN;
|
ifp->ptm_status = ZEBRA_PTM_STATUS_UNKNOWN;
|
||||||
|
|
||||||
/* Hardware type and address. */
|
/* Hardware type and address. */
|
||||||
|
@ -1056,8 +1056,8 @@ if_dump_vty (struct vty *vty, struct interface *ifp)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
vty_out (vty, " index %d metric %d mtu %d ",
|
vty_out (vty, " index %d metric %d mtu %d speed %u ",
|
||||||
ifp->ifindex, ifp->metric, ifp->mtu);
|
ifp->ifindex, ifp->metric, ifp->mtu, ifp->speed);
|
||||||
if (ifp->mtu6 != ifp->mtu)
|
if (ifp->mtu6 != ifp->mtu)
|
||||||
vty_out (vty, "mtu6 %d ", ifp->mtu6);
|
vty_out (vty, "mtu6 %d ", ifp->mtu6);
|
||||||
vty_out (vty, "%s flags: %s%s", VTY_NEWLINE,
|
vty_out (vty, "%s flags: %s%s", VTY_NEWLINE,
|
||||||
|
@ -167,6 +167,7 @@ zserv_encode_interface (struct stream *s, struct interface *ifp)
|
|||||||
stream_putc (s, ifp->ptm_enable);
|
stream_putc (s, ifp->ptm_enable);
|
||||||
stream_putc (s, ifp->ptm_status);
|
stream_putc (s, ifp->ptm_status);
|
||||||
stream_putl (s, ifp->metric);
|
stream_putl (s, ifp->metric);
|
||||||
|
stream_putl (s, ifp->speed);
|
||||||
stream_putl (s, ifp->mtu);
|
stream_putl (s, ifp->mtu);
|
||||||
stream_putl (s, ifp->mtu6);
|
stream_putl (s, ifp->mtu6);
|
||||||
stream_putl (s, ifp->bandwidth);
|
stream_putl (s, ifp->bandwidth);
|
||||||
|
Loading…
Reference in New Issue
Block a user