> On Wed, 27 Nov 2013 09:54:12 +0900 (JST) > [email protected] (YAMAMOTO Takashi) wrote: > >>> On Wed, 27 Nov 2013 09:19:14 +0900 (JST) >>> [email protected] (YAMAMOTO Takashi) wrote: >>> >>>>> sysfs is architecture independent. >>>>> >>>>> Signed-off-by: FUJITA Tomonori <[email protected]> >>>>> --- >>>>> ryu/services/protocols/vrrp/monitor_linux.py | 40 >>>>> +++------------------------- >>>>> 1 file changed, 4 insertions(+), 36 deletions(-) >>>>> >>>>> diff --git a/ryu/services/protocols/vrrp/monitor_linux.py >>>>> b/ryu/services/protocols/vrrp/monitor_linux.py >>>>> index f1b5efb..2c3569e 100644 >>>>> --- a/ryu/services/protocols/vrrp/monitor_linux.py >>>>> +++ b/ryu/services/protocols/vrrp/monitor_linux.py >>>>> @@ -14,12 +14,7 @@ >>>>> # See the License for the specific language governing permissions and >>>>> # limitations under the License. >>>>> >>>>> -# tested on 64bit linux. >>>>> -# On other platform like 32bit Linux, the structure can be different >>>>> -# due to alignment difference. >>>> >>>> have you taken a look at _join_vrrp_group? >>> >>> The structures used in the function is defined in RFC and are aligned >>> properly in every architectures? >> >> they look so. if they are, please add a comment. > > Ok, how about the following?
looks good to me. thanks. YAMAMOTO Takashi > >>From 872926964e22e7b3de1aee92b74ecaee7b92b404 Mon Sep 17 00:00:00 2001 > From: FUJITA Tomonori <[email protected]> > Date: Tue, 26 Nov 2013 17:23:22 -0800 > Subject: [PATCH v2] vrrp: use sysfs instead of ioctl to get ifindex > > sysfs is architecture independent. > > Signed-off-by: FUJITA Tomonori <[email protected]> > --- > ryu/services/protocols/vrrp/monitor_linux.py | 48 > +++++++--------------------- > 1 file changed, 12 insertions(+), 36 deletions(-) > > diff --git a/ryu/services/protocols/vrrp/monitor_linux.py > b/ryu/services/protocols/vrrp/monitor_linux.py > index f1b5efb..a1226e9 100644 > --- a/ryu/services/protocols/vrrp/monitor_linux.py > +++ b/ryu/services/protocols/vrrp/monitor_linux.py > @@ -14,12 +14,7 @@ > # See the License for the specific language governing permissions and > # limitations under the License. > > -# tested on 64bit linux. > -# On other platform like 32bit Linux, the structure can be different > -# due to alignment difference. > - > import contextlib > -import fcntl > import socket > import struct > > @@ -36,9 +31,7 @@ from ryu.services.protocols.vrrp import utils > > > # Those are not defined in socket module > -IFNAMSIZ = 16 > SS_MAXSIZE = 128 > -SIOCGIFINDEX = 0x8933 # This is for Linux x64. May differ on other Linux > MCAST_JOIN_GROUP = 42 > MCAST_LEAVE_GROUP = 45 > PACKET_ADD_MEMBERSHIP = 1 > @@ -48,35 +41,10 @@ SOL_PACKET = 263 > > > def if_nametoindex(ifname): > - # can the one defined in libc.so be used? > - # > - # IFNAMSIZE = 16 > - # struct ifreq { > - # char ifr_name[IFNAMSIZ]; /* Interface name */ > - # union { > - # struct sockaddr ifr_addr; > - # struct sockaddr ifr_dstaddr; > - # struct sockaddr ifr_broadaddr; > - # struct sockaddr ifr_netmask; > - # struct sockaddr ifr_hwaddr; > - # short ifr_flags; > - # int ifr_ifindex; > - # int ifr_metric; > - # int ifr_mtu; > - # struct ifmap ifr_map; > - # char ifr_slave[IFNAMSIZ]; > - # char ifr_newname[IFNAMSIZ]; > - # char *ifr_data; > - # }; > - # }; > - PACK_STR = '16sI12x' > - > - # get ip address of the given interface > - with contextlib.closing(socket.socket(socket.AF_INET, > - socket.SOCK_DGRAM, 0)) as > udp_socket: > - ifreq = struct.pack(PACK_STR, ifname, 0) > - res = fcntl.ioctl(udp_socket, SIOCGIFINDEX, ifreq) > - return struct.unpack(PACK_STR, res)[1] > + filename = '/sys/class/net/' + ifname + '/ifindex' > + with contextlib.closing(open(filename)) as f: > + for line in f: > + return int(line) > > > @monitor.VRRPInterfaceMonitor.register(vrrp_event.VRRPInterfaceNetworkDevice) > @@ -132,6 +100,8 @@ class > VRRPInterfaceMonitorNetworkDevice(monitor.VRRPInterfaceMonitor): > self.__is_active = False > super(VRRPInterfaceMonitorNetworkDevice, self).stop() > > + # we assume that the structures in the following two functions for > + # multicast are aligned in the same way on all the archtectures. > def _join_multicast_membership(self, join_leave): > config = self.config > if config.is_ipv6: > @@ -142,6 +112,12 @@ class > VRRPInterfaceMonitorNetworkDevice(monitor.VRRPInterfaceMonitor): > add_drop = PACKET_ADD_MEMBERSHIP > else: > add_drop = PACKET_DROP_MEMBERSHIP > + # struct packet_mreq { > + # int mr_ifindex; > + # unsigned short mr_type; > + # unsigned short mr_alen; > + # unsigned char mr_mr_address[8]; > + # }; > packet_mreq = struct.pack('IHH8s', self.ifindex, > PACKET_MR_MULTICAST, 6, > addrconv.mac.text_to_bin(mac_address)) > -- > 1.8.3.4 (Apple Git-47) > > > ------------------------------------------------------------------------------ > Rapidly troubleshoot problems before they affect your business. Most IT > organizations don't have a clear picture of how application performance > affects their revenue. With AppDynamics, you get 100% visibility into your > Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro! > http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk > _______________________________________________ > Ryu-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/ryu-devel ------------------------------------------------------------------------------ Rapidly troubleshoot problems before they affect your business. Most IT organizations don't have a clear picture of how application performance affects their revenue. With AppDynamics, you get 100% visibility into your Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro! http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk _______________________________________________ Ryu-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ryu-devel
