]>
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>
45 int netsock_init(void)
48 netsock
= socket(AF_INET
, SOCK_DGRAM
, 0);
50 ERROR("Couldn't open inet socket for ioctls: %m\n");
56 int get_hwaddr(char *ifname
, unsigned char *hwaddr
)
59 memset(&ifr
, 0, sizeof(ifr
));
60 strncpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
61 if (ioctl(netsock
, SIOCGIFHWADDR
, &ifr
) < 0) {
62 ERROR("%s: get hw address failed: %m", ifname
);
65 memcpy(hwaddr
, ifr
.ifr_hwaddr
.sa_data
, ETH_ALEN
);
69 int ethtool_get_speed_duplex(char *ifname
, int *speed
, int *duplex
)
72 memset(&ifr
, 0, sizeof(ifr
));
73 strncpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
74 struct ethtool_cmd ecmd
;
76 ecmd
.cmd
= ETHTOOL_GSET
;
77 ifr
.ifr_data
= (caddr_t
) & ecmd
;
78 if (ioctl(netsock
, SIOCETHTOOL
, &ifr
) < 0) {
79 ERROR("Cannot get link status for %s: %m\n", ifname
);
82 *speed
= ecmd
.speed
; /* Ethtool speed is in Mbps */
83 *duplex
= ecmd
.duplex
; /* We have same convention as ethtool.
88 /********* Sysfs based utility functions *************/
90 /* This sysfs stuff might break with interface renames */
91 int is_bridge(char *if_name
)
93 char path
[32 + IFNAMSIZ
];
94 sprintf(path
, "/sys/class/net/%s/bridge", if_name
);
95 return (access(path
, R_OK
) == 0);
98 /* This will work even less if the bridge port is renamed after being
101 int is_bridge_slave(char *br_name
, char *if_name
)
103 char path
[32 + 2 * IFNAMSIZ
];
104 sprintf(path
, "/sys/class/net/%s/brif/%s", br_name
, if_name
);
105 return (access(path
, R_OK
) == 0);
108 int get_bridge_portno(char *if_name
)
110 char path
[32 + IFNAMSIZ
];
111 sprintf(path
, "/sys/class/net/%s/brport/port_no", if_name
);
115 TSTM((fd
= open(path
, O_RDONLY
)) >= 0, -1, "%m");
117 TSTM((l
= read(fd
, buf
, sizeof(buf
) - 1)) >= 0, -1, "%m");
119 ERROR("Empty port index file");
121 } else if (l
== sizeof(buf
) - 1) {
122 ERROR("port_index file too long");
126 if (buf
[l
- 1] == '\n')
129 res
= strtoul(buf
, &end
, 0);
130 if (*end
!= 0 || res
> INT_MAX
) {
131 ERROR("Invalid port index %s", buf
);