]>
git.ipfire.org Git - people/ms/rstp.git/blob - netif_utils.c
1 /*****************************************************************************
2 Copyright (c) 2006 EMC Corporation.
4 This program is free software; you can redistribute it and/or modify it
5 under the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2 of the License, or (at your option)
9 This program is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 You should have received a copy of the GNU General Public License along with
15 this program; if not, write to the Free Software Foundation, Inc., 59
16 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 The full GNU General Public License is included in this distribution in the
21 Authors: Srinivas Aji <Aji_Srinivas@emc.com>
23 ******************************************************************************/
25 #include "netif_utils.h"
32 #include <sys/socket.h>
33 #include <sys/ioctl.h>
37 #include <linux/if_ether.h>
38 #include <linux/ethtool.h>
39 #include <linux/sockios.h>
47 int netsock_init(void)
50 netsock
= socket(AF_INET
, SOCK_DGRAM
, 0);
52 ERROR("Couldn't open inet socket for ioctls: %m\n");
58 int get_hwaddr(char *ifname
, unsigned char *hwaddr
)
61 memset(&ifr
, 0, sizeof(ifr
));
62 strncpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
63 if (ioctl(netsock
, SIOCGIFHWADDR
, &ifr
) < 0) {
64 ERROR("%s: get hw address failed: %m", ifname
);
67 memcpy(hwaddr
, ifr
.ifr_hwaddr
.sa_data
, ETH_ALEN
);
71 int ethtool_get_speed_duplex(char *ifname
, int *speed
, int *duplex
)
74 memset(&ifr
, 0, sizeof(ifr
));
75 strncpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
76 struct ethtool_cmd ecmd
;
78 ecmd
.cmd
= ETHTOOL_GSET
;
79 ifr
.ifr_data
= (caddr_t
)&ecmd
;
80 if (ioctl(netsock
, SIOCETHTOOL
, &ifr
) < 0) {
81 ERROR("Cannot get link status for %s: %m\n", ifname
);
84 *speed
= ecmd
.speed
; /* Ethtool speed is in Mbps */
85 *duplex
= ecmd
.duplex
; /* We have same convention as ethtool.
91 /********* Sysfs based utility functions *************/
93 /* This sysfs stuff might break with interface renames */
94 int is_bridge(char *if_name
)
96 char path
[32 + IFNAMSIZ
];
97 sprintf(path
, "/sys/class/net/%s/bridge", if_name
);
98 return (access(path
, R_OK
) == 0);
101 /* This will work even less if the bridge port is renamed after being
102 joined to the bridge.
104 int is_bridge_slave(char *br_name
, char *if_name
)
106 char path
[32 + 2 * IFNAMSIZ
];
107 sprintf(path
, "/sys/class/net/%s/brif/%s", br_name
, if_name
);
108 return (access(path
, R_OK
) == 0);
111 int get_bridge_portno(char *if_name
)
113 char path
[32 + IFNAMSIZ
];
114 sprintf(path
, "/sys/class/net/%s/brport/port_no", if_name
);
118 TSTM((fd
= open(path
, O_RDONLY
)) >= 0, -1, "%m");
120 TSTM((l
= read(fd
, buf
, sizeof(buf
) - 1)) >= 0, -1, "%m");
122 ERROR("Empty port index file");
125 else if (l
== sizeof(buf
) - 1) {
126 ERROR("port_index file too long");
130 if (buf
[l
-1] == '\n')
133 res
= strtoul(buf
, &end
, 0);
134 if (*end
!= 0 || res
> INT_MAX
) {
135 ERROR("Invalid port index %s", buf
);