]>
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>
38 #include <linux/if_ether.h>
39 #include <linux/ethtool.h>
40 #include <linux/sockios.h>
46 int netsock_init(void)
49 netsock
= socket(AF_INET
, SOCK_DGRAM
, 0);
51 ERROR("Couldn't open inet socket for ioctls: %m\n");
57 int get_hwaddr(char *ifname
, unsigned char *hwaddr
)
60 memset(&ifr
, 0, sizeof(ifr
));
61 strncpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
62 if (ioctl(netsock
, SIOCGIFHWADDR
, &ifr
) < 0) {
63 ERROR("%s: get hw address failed: %m", ifname
);
66 memcpy(hwaddr
, ifr
.ifr_hwaddr
.sa_data
, ETH_ALEN
);
70 int ethtool_get_speed_duplex(char *ifname
, int *speed
, int *duplex
)
73 memset(&ifr
, 0, sizeof(ifr
));
74 strncpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
75 struct ethtool_cmd ecmd
;
77 ecmd
.cmd
= ETHTOOL_GSET
;
78 ifr
.ifr_data
= (caddr_t
) & ecmd
;
79 if (ioctl(netsock
, SIOCETHTOOL
, &ifr
) < 0) {
80 ERROR("Cannot get link status for %s: %m\n", ifname
);
83 *speed
= ecmd
.speed
; /* Ethtool speed is in Mbps */
84 *duplex
= ecmd
.duplex
; /* We have same convention as ethtool.
89 /********* Sysfs based utility functions *************/
91 /* This sysfs stuff might break with interface renames */
92 int is_bridge(char *if_name
)
94 char path
[32 + IFNAMSIZ
];
95 sprintf(path
, "/sys/class/net/%s/bridge", if_name
);
96 return (access(path
, R_OK
) == 0);
99 /* This will work even less if the bridge port is renamed after being
100 joined to the bridge.
102 int is_bridge_slave(char *br_name
, char *if_name
)
104 char path
[32 + 2 * IFNAMSIZ
];
105 sprintf(path
, "/sys/class/net/%s/brif/%s", br_name
, if_name
);
106 return (access(path
, R_OK
) == 0);
109 int get_bridge_portno(char *if_name
)
111 char path
[32 + IFNAMSIZ
];
112 sprintf(path
, "/sys/class/net/%s/brport/port_no", if_name
);
116 TSTM((fd
= open(path
, O_RDONLY
)) >= 0, -1, "%m");
118 TSTM((l
= read(fd
, buf
, sizeof(buf
) - 1)) >= 0, -1, "%m");
120 ERROR("Empty port index file");
122 } else if (l
== sizeof(buf
) - 1) {
123 ERROR("port_index file too long");
127 if (buf
[l
- 1] == '\n')
130 res
= strtoul(buf
, &end
, 0);
131 if (*end
!= 0 || res
> INT_MAX
) {
132 ERROR("Invalid port index %s", buf
);