22
22
#include <string.h>
23
23
#include <sys/fcntl.h>
24
24
#include <sys/ioctl.h>
26
#include <sys/utsname.h>
27
26
#include "libbridge.h"
28
27
#include "libbridge_private.h"
30
static int br_ioctl32(unsigned long arg0, unsigned long arg1, unsigned long arg2)
38
return ioctl(br_socket_fd, SIOCGIFBR, arg);
42
static int br_ioctl64(unsigned long arg0, unsigned long arg1, unsigned long arg2)
44
unsigned long long arg[3];
50
return ioctl(br_socket_fd, SIOCGIFBR, arg);
53
int __kernel_is_64_bit()
55
static int kernel_is_64_bit = -1;
57
if (kernel_is_64_bit == -1) {
61
kernel_is_64_bit = !strcmp(buf.machine, "sparc64");
64
return kernel_is_64_bit;
68
int br_ioctl(unsigned long arg0, unsigned long arg1, unsigned long arg2)
71
if (__kernel_is_64_bit())
72
return br_ioctl64(arg0, arg1, arg2);
75
return br_ioctl32(arg0, arg1, arg2);
80
return br_ioctl(BRCTL_GET_VERSION, 0, 0);
83
int br_add_bridge(char *brname)
87
memcpy(_br, brname, IFNAMSIZ);
88
if (br_ioctl(BRCTL_ADD_BRIDGE, (unsigned long)_br, 0) < 0)
94
int br_del_bridge(char *brname)
98
memcpy(_br, brname, IFNAMSIZ);
99
if (br_ioctl(BRCTL_DEL_BRIDGE, (unsigned long)_br, 0) < 0)
30
int br_add_bridge(const char *brname)
35
ret = ioctl(br_socket_fd, SIOCBRADDBR, brname);
41
= { BRCTL_ADD_BRIDGE, (unsigned long) _br };
43
strncpy(_br, brname, IFNAMSIZ);
44
ret = ioctl(br_socket_fd, SIOCSIFBR, arg);
47
return ret < 0 ? errno : 0;
50
int br_del_bridge(const char *brname)
55
ret = ioctl(br_socket_fd, SIOCBRDELBR, brname);
61
= { BRCTL_DEL_BRIDGE, (unsigned long) _br };
63
strncpy(_br, brname, IFNAMSIZ);
64
ret = ioctl(br_socket_fd, SIOCSIFBR, arg);
66
return ret < 0 ? errno : 0;
69
int br_add_interface(const char *bridge, const char *dev)
73
int ifindex = if_nametoindex(dev);
78
strncpy(ifr.ifr_name, bridge, IFNAMSIZ);
80
ifr.ifr_ifindex = ifindex;
81
err = ioctl(br_socket_fd, SIOCBRADDIF, &ifr);
85
unsigned long args[4] = { BRCTL_ADD_IF, ifindex, 0, 0 };
87
ifr.ifr_data = (char *) args;
88
err = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr);
91
return err < 0 ? errno : 0;
94
int br_del_interface(const char *bridge, const char *dev)
98
int ifindex = if_nametoindex(dev);
103
strncpy(ifr.ifr_name, bridge, IFNAMSIZ);
105
ifr.ifr_ifindex = ifindex;
106
err = ioctl(br_socket_fd, SIOCBRDELIF, &ifr);
110
unsigned long args[4] = { BRCTL_DEL_IF, ifindex, 0, 0 };
112
ifr.ifr_data = (char *) args;
113
err = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr);
116
return err < 0 ? errno : 0;