// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package syscall

import 

func ( *anyMessage) ( []byte) RoutingMessage {
	switch .Type {
	case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE:
		 := (*RouteMessage)(unsafe.Pointer())
		return &RouteMessage{Header: .Header, Data: [SizeofRtMsghdr:.Msglen]}
	case RTM_IFINFO:
		 := (*InterfaceMessage)(unsafe.Pointer())
		return &InterfaceMessage{Header: .Header, Data: [SizeofIfMsghdr:.Msglen]}
	case RTM_NEWADDR, RTM_DELADDR:
		 := (*InterfaceAddrMessage)(unsafe.Pointer())
		return &InterfaceAddrMessage{Header: .Header, Data: [SizeofIfaMsghdr:.Msglen]}
	case RTM_NEWMADDR2, RTM_DELMADDR:
		 := (*InterfaceMulticastAddrMessage)(unsafe.Pointer())
		return &InterfaceMulticastAddrMessage{Header: .Header, Data: [SizeofIfmaMsghdr2:.Msglen]}
	}
	return nil
}

// InterfaceMulticastAddrMessage represents a routing message
// containing network interface address entries.
//
// Deprecated: Use golang.org/x/net/route instead.
type InterfaceMulticastAddrMessage struct {
	Header IfmaMsghdr2
	Data   []byte
}

func ( *InterfaceMulticastAddrMessage) () ([]Sockaddr, error) {
	var  [RTAX_MAX]Sockaddr
	 := .Data[:]
	for  := uint(0);  < RTAX_MAX && len() >= minRoutingSockaddrLen; ++ {
		if .Header.Addrs&(1<<) == 0 {
			continue
		}
		 := (*RawSockaddr)(unsafe.Pointer(&[0]))
		switch .Family {
		case AF_LINK:
			,  := parseSockaddrLink()
			if  != nil {
				return nil, 
			}
			[] = 
			 = [rsaAlignOf(int(.Len)):]
		case AF_INET, AF_INET6:
			,  := parseSockaddrInet(, .Family)
			if  != nil {
				return nil, 
			}
			[] = 
			 = [rsaAlignOf(int(.Len)):]
		default:
			, ,  := parseLinkLayerAddr()
			if  != nil {
				return nil, 
			}
			[] = 
			 = [:]
		}
	}
	return [:], nil
}