func (r *RipRouter) ifClose(i int) { p := r.ports[i] log.Printf("RipRouter.ifDel: %s", p.iface.Name) if err := sock.Leave(p.msock, r.group, p.iface); err != nil { // warning only log.Printf("RipRouter.ifClose: leave group error: %v", err) } sock.Close(p.msock) // break reader goroutine }
func (r *RipRouter) Join(ifi *net.Interface) error { ripPort := RIP_PORT m, err1 := sock.MulticastListener(ripPort, ifi.Name) if err1 != nil { return fmt.Errorf("RipRouter.Join: open: %v", err1) } if err := sock.Join(m, r.group, ifi.Name); err != nil { sock.Close(m) return fmt.Errorf("RipRouter.Join: join: %v", err) } newPort := &port{iface: ifi, msock: m} r.ports = append(r.ports, newPort) go udpReader(m.P, r.input, ifi.Name, r.readerDone, ripPort) r.readerCount++ return nil }