Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.22-rc7 130 lines 3.1 kB view raw
1/* 2 * user-mode-linux networking multicast transport 3 * Copyright (C) 2001 by Harald Welte <laforge@gnumonks.org> 4 * 5 * based on the existing uml-networking code, which is 6 * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and 7 * James Leu (jleu@mindspring.net). 8 * Copyright (C) 2001 by various other people who didn't put their name here. 9 * 10 * Licensed under the GPL. 11 */ 12 13#include "linux/kernel.h" 14#include "linux/init.h" 15#include "linux/netdevice.h" 16#include "linux/etherdevice.h" 17#include "linux/in.h" 18#include "linux/inet.h" 19#include "net_kern.h" 20#include "net_user.h" 21#include "mcast.h" 22 23struct mcast_init { 24 char *addr; 25 int port; 26 int ttl; 27}; 28 29static void mcast_init(struct net_device *dev, void *data) 30{ 31 struct uml_net_private *pri; 32 struct mcast_data *dpri; 33 struct mcast_init *init = data; 34 35 pri = dev->priv; 36 dpri = (struct mcast_data *) pri->user; 37 dpri->addr = init->addr; 38 dpri->port = init->port; 39 dpri->ttl = init->ttl; 40 dpri->dev = dev; 41 42 printk("mcast backend "); 43 printk("multicast address: %s:%u, TTL:%u ", 44 dpri->addr, dpri->port, dpri->ttl); 45 46 printk("\n"); 47} 48 49static int mcast_read(int fd, struct sk_buff **skb, struct uml_net_private *lp) 50{ 51 *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); 52 if(*skb == NULL) return(-ENOMEM); 53 return(net_recvfrom(fd, skb_mac_header(*skb), 54 (*skb)->dev->mtu + ETH_HEADER_OTHER)); 55} 56 57static int mcast_write(int fd, struct sk_buff **skb, 58 struct uml_net_private *lp) 59{ 60 return mcast_user_write(fd, (*skb)->data, (*skb)->len, 61 (struct mcast_data *) &lp->user); 62} 63 64static const struct net_kern_info mcast_kern_info = { 65 .init = mcast_init, 66 .protocol = eth_protocol, 67 .read = mcast_read, 68 .write = mcast_write, 69}; 70 71int mcast_setup(char *str, char **mac_out, void *data) 72{ 73 struct mcast_init *init = data; 74 char *port_str = NULL, *ttl_str = NULL, *remain; 75 char *last; 76 77 *init = ((struct mcast_init) 78 { .addr = "239.192.168.1", 79 .port = 1102, 80 .ttl = 1 }); 81 82 remain = split_if_spec(str, mac_out, &init->addr, &port_str, &ttl_str, 83 NULL); 84 if(remain != NULL){ 85 printk(KERN_ERR "mcast_setup - Extra garbage on " 86 "specification : '%s'\n", remain); 87 return(0); 88 } 89 90 if(port_str != NULL){ 91 init->port = simple_strtoul(port_str, &last, 10); 92 if((*last != '\0') || (last == port_str)){ 93 printk(KERN_ERR "mcast_setup - Bad port : '%s'\n", 94 port_str); 95 return(0); 96 } 97 } 98 99 if(ttl_str != NULL){ 100 init->ttl = simple_strtoul(ttl_str, &last, 10); 101 if((*last != '\0') || (last == ttl_str)){ 102 printk(KERN_ERR "mcast_setup - Bad ttl : '%s'\n", 103 ttl_str); 104 return(0); 105 } 106 } 107 108 printk(KERN_INFO "Configured mcast device: %s:%u-%u\n", init->addr, 109 init->port, init->ttl); 110 111 return(1); 112} 113 114static struct transport mcast_transport = { 115 .list = LIST_HEAD_INIT(mcast_transport.list), 116 .name = "mcast", 117 .setup = mcast_setup, 118 .user = &mcast_user_info, 119 .kern = &mcast_kern_info, 120 .private_size = sizeof(struct mcast_data), 121 .setup_size = sizeof(struct mcast_init), 122}; 123 124static int register_mcast(void) 125{ 126 register_transport(&mcast_transport); 127 return 0; 128} 129 130late_initcall(register_mcast);