bitkeeper revision 1.7.1.8 (3dfdbdfbe2pZAGaXI4oPfJVdSW3qpg)

minor cleaning up.
This commit is contained in:
akw27@labyrinth.cl.cam.ac.uk committed 2002-12-16 11:50:19 +00:00
1 parent 5a4d8dc794
commit 81ba86ae16
5 files changed
+100 -237

No files matched your search

+80 -15
View File
@@ -1,8 +1,11 @@
/* net_ring.c
/* network.c
*
* ring data structures for buffering messages between hypervisor and
* guestos's. As it stands this is only used for network buffer exchange.
* Network virtualization for Xen. Lower-level network interactions are in
* net/dev.c and in the drivers. This file contains routines to interact
* with the virtual interfaces (vifs) and the virtual firewall/router through
* the use of rules.
*
* Copyright (c) 2002, A K Warfield and K A Fraser
*/
#include <hypervisor-ifs/network.h>
@@ -18,19 +21,30 @@
/* vif globals
* sys_vif_list is a lookup table for vifs, used in packet forwarding.
* it should be replaced later by something a little more flexible.
* it will be replaced later by something a little more flexible.
*/
int sys_vif_count;
net_vif_t *sys_vif_list[MAX_SYSTEM_VIFS];
net_rule_ent_t *net_rule_list;
int sys_vif_count; /* global vif count */
net_vif_t *sys_vif_list[MAX_SYSTEM_VIFS]; /* global vif array */
net_rule_ent_t *net_rule_list; /* global list of rules */
kmem_cache_t *net_vif_cache;
kmem_cache_t *net_rule_cache;
static rwlock_t net_rule_lock = RW_LOCK_UNLOCKED;
static rwlock_t sys_vif_lock = RW_LOCK_UNLOCKED;
static rwlock_t net_rule_lock = RW_LOCK_UNLOCKED; /* rule mutex */
static rwlock_t sys_vif_lock = RW_LOCK_UNLOCKED; /* vif mutex */
void print_net_rule_list();
/* ----[ VIF Functions ]----------------------------------------------------*/
/* create_net_vif - Create a new vif and append it to the specified domain.
*
* the domain is examined to determine how many vifs currently are allocated
* and the newly allocated vif is appended. The vif is also added to the
* global list.
*
*/
net_vif_t *create_net_vif(int domain)
{
net_vif_t *new_vif;
@@ -65,9 +79,12 @@ net_vif_t *create_net_vif(int domain)
return new_vif;
}
/* delete the last vif in the given domain. There doesn't seem to be any reason
* (yet) to be able to axe an arbitrary vif, by vif id.
/* delete_net_vif - Delete the last vif in the given domain.
*
* There doesn't seem to be any reason (yet) to be able to axe an arbitrary
* vif, by vif id.
*/
void destroy_net_vif(struct task_struct *p)
{
struct sk_buff *skb;
@@ -88,6 +105,9 @@ void destroy_net_vif(struct task_struct *p)
kmem_cache_free(net_vif_cache, p->net_vif_list[i]);
}
/* print_vif_list - Print the contents of the global vif table.
*/
void print_vif_list()
{
int i;
@@ -103,6 +123,11 @@ void print_vif_list()
}
}
/* ----[ Net Rule Functions ]-----------------------------------------------*/
/* add_net_rule - Add a new network filter rule.
*/
int add_net_rule(net_rule_t *rule)
{
net_rule_ent_t *new_ent;
@@ -122,6 +147,9 @@ int add_net_rule(net_rule_t *rule)
return 0;
}
/* delete_net_rule - Delete an existing network rule.
*/
int delete_net_rule(net_rule_t *rule)
{
net_rule_ent_t *ent = net_rule_list, *prev = NULL;
@@ -148,10 +176,12 @@ int delete_net_rule(net_rule_t *rule)
return 0;
}
/* add_default_net_rule.
/* add_default_net_rule - Set up default network path (ie for dom0).
*
* this is a utility function to route all traffic with the specified
* ip address to the specified vif. It's used to set up domain zero.
*/
void add_default_net_rule(int vif_id, u32 ipaddr)
{
net_rule_t new_rule;
@@ -178,6 +208,9 @@ void add_default_net_rule(int vif_id, u32 ipaddr)
}
/* print_net_rule - Print a single net rule.
*/
void print_net_rule(net_rule_t *r)
{
printk("===] NET RULE:\n");
@@ -195,11 +228,18 @@ void print_net_rule(net_rule_t *r)
printk("=] action : %u\n", r->action);
}
/* print_net_rule_list - Print the global rule table.
*/
void print_net_rule_list()
{
net_rule_ent_t *ent = net_rule_list;
net_rule_ent_t *ent;
int count = 0;
read_lock(&net_rule_lock);
ent = net_rule_list;
while (ent)
{
print_net_rule(&ent->r);
@@ -207,10 +247,14 @@ void print_net_rule_list()
count++;
}
printk("\nTotal of %d rules.\n", count);
read_unlock(&net_rule_lock);
}
/* Apply the rules to this skbuff and return the vif id that it is bound for.
* -1 to drop.
/* net_find_rule - Find the destination vif according to the current rules.
*
* Apply the rules to this skbuff and return the vif id that it is bound for.
* If there is no match, VIF_DROP is returned.
*/
int net_find_rule(u8 nproto, u8 tproto, u32 src_addr, u32 dst_addr, u16 src_port, u16 dst_port,
@@ -252,6 +296,25 @@ int net_find_rule(u8 nproto, u8 tproto, u32 src_addr, u32 dst_addr, u16 src_port
return dest;
}
/* net_get_target_vif - Find the vif that the given sk_buff is bound for.
*
* This is intended to be the main interface to the VFR rules, where
* net_find_rule (above) is a private aspect of the current matching
* implementation. All in-hypervisor routing should use this function only
* to ensure that this can be rewritten later.
*
* Currently, network rules are stored in a global linked list. New rules are
* added to the front of this list, and (at present) the first matching rule
* determines the vif that a packet is sent to. This is obviously not ideal,
* it might be more advisable to have chains, or at lest most-specific
* matching, and moreover routing latency increases linearly (for old rules)
* as new rules are added.
*
* net_get_target_vif examines the sk_buff and pulls out the relevant fields
* based on the packet type. it then calls net_find_rule to scan the rule
* list.
*/
int net_get_target_vif(struct sk_buff *skb)
{
int target = VIF_DROP;
@@ -296,6 +359,8 @@ int net_get_target_vif(struct sk_buff *skb)
return VIF_DROP;
}
/* ----[ Syscall Interface ]------------------------------------------------*/
/*
* This is the hook function to handle guest-invoked traps requesting
* changes to the network system.
@@ -44,127 +44,6 @@ typedef struct
#define TRAP_INSTR "int $0x82"
static inline int HYPERVISOR_set_trap_table(trap_info_t *table)
{
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_set_trap_table),
"b" (table) );
return ret;
}
static inline int HYPERVISOR_pt_update(page_update_request_t *req, int count)
{
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_pt_update),
"b" (req), "c" (count) );
return ret;
}
static inline int HYPERVISOR_console_write(const char *str, int count)
{
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_console_write),
"b" (str), "c" (count) );
return ret;
}
static inline int HYPERVISOR_set_pagetable(unsigned long ptr)
{
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_set_pagetable),
"b" (ptr) );
return ret;
}
static inline int HYPERVISOR_set_guest_stack(
unsigned long ss, unsigned long esp)
{
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_set_guest_stack),
"b" (ss), "c" (esp) );
return ret;
}
static inline int HYPERVISOR_net_update(void)
{
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_net_update) );
return ret;
}
static inline int HYPERVISOR_fpu_taskswitch(void)
{
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_fpu_taskswitch) );
return ret;
}
static inline int HYPERVISOR_yield(void)
{
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_yield) );
return ret;
}
static inline int HYPERVISOR_exit(void)
{
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_exit) );
return ret;
}
static inline int HYPERVISOR_dom0_op(void *dom0_op)
{
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_dom0_op),
"b" (dom0_op) );
return ret;
}
static inline int HYPERVISOR_network_op(void *network_op)
{
int ret;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_network_op),
"b" (network_op) );
return ret;
}
/* Event message note:
*
* Here, as in the interrupts to the guestos, additional network interfaces
+4 -2
View File
@@ -1,7 +1,9 @@
/* vif.h
*
* this is the hypervisor end of the network code. The net_ring structure
* This is the hypervisor end of the network code. The net_ring structure
* stored in each vif is placed on a shared page to interact with the guest VM.
*
* Copyright (c) 2002, A K Warfield and K A Fraser
*/
/* virtual network interface struct and associated defines. */
@@ -26,7 +28,7 @@ typedef struct net_vif_st {
/* VIF-related defines. */
#define MAX_GUEST_VIFS 2 // each VIF is a small overhead in task_struct
#define MAX_SYSTEM_VIFS 256 // trying to avoid dynamic allocation
#define MAX_SYSTEM_VIFS 256
/* vif globals */
extern int sys_vif_count;
+15 -81
View File
@@ -687,7 +687,6 @@ int netif_rx(struct sk_buff *skb)
unsigned long cpu_mask;
#endif
struct task_struct *p;
// unsigned int dest_dom;
int this_cpu = smp_processor_id();
struct softnet_data *queue;
unsigned long flags;
@@ -703,58 +702,29 @@ int netif_rx(struct sk_buff *skb)
local_irq_save(flags);
netdev_rx_stat[this_cpu].total++;
/*
skb->h.raw = skb->nh.raw = skb->data;
if ( skb->len < 2 ) goto drop;
switch ( ntohs(skb->mac.ethernet->h_proto) )
{
case ETH_P_ARP:
if ( skb->len < 28 ) goto drop;
dest_dom = ntohl(*(unsigned long *)
(skb->nh.raw + 24));
break;
case ETH_P_IP:
if ( skb->len < 20 ) goto drop;
dest_dom = ntohl(*(unsigned long *)
(skb->nh.raw + 16));
break;
default:
goto drop;
}
if ( (dest_dom < opt_ipbase) ||
(dest_dom > (opt_ipbase + 16)) )
goto drop;
dest_dom -= opt_ipbase;
read_lock(&tasklist_lock);
p = &idle0_task;
do {
if ( p->domain != dest_dom ) continue;
skb_queue_tail(&p->net_vif_list[0]->skb_list, skb); // vfr will fix.
cpu_mask = mark_hyp_event(p, _HYP_EVENT_NET_RX);
read_unlock(&tasklist_lock);
goto found;
}
while ( (p = p->next_task) != &idle0_task );
read_unlock(&tasklist_lock);
goto drop;
*/
if (skb->src_vif == VIF_UNKNOWN_INTERFACE)
skb->src_vif = VIF_PHYSICAL_INTERFACE;
if (skb->dst_vif == VIF_UNKNOWN_INTERFACE)
net_get_target_vif(skb);
if (skb->dst_vif > 1)
printk("netifrx got packet bound for system vif %d.\n", skb->dst_vif);
if (sys_vif_list[skb->dst_vif] == NULL)
{
// the target vif does not exist.
goto drop;
}
/* This lock-and-walk of the task list isn't really necessary, and is an
* artifact of the old code. The vif contains a pointer to the skb list
* we are going to queue the packet in, so the lock and the inner loop
* could be removed.
*
* The argument against this is a possible race in which a domain is killed
* as packets are being delivered to it. This would result in the dest vif
* vanishing before we can deliver to it.
*/
if ( skb->dst_vif >= VIF_PHYSICAL_INTERFACE )
{
read_lock(&tasklist_lock);
@@ -770,19 +740,6 @@ printk("netifrx got packet bound for system vif %d.\n", skb->dst_vif);
read_unlock(&tasklist_lock);
goto drop;
}
// found:
#if 0
__skb_queue_tail(&queue->input_pkt_queue,skb);
/* Runs from irqs or BH's, no need to wake BH */
cpu_raise_softirq(this_cpu, NET_RX_SOFTIRQ);
local_irq_restore(flags);
get_sample_stats(this_cpu);
return softnet_data[this_cpu].cng_level;
//#else
hyp_event_notify(cpu_mask);
local_irq_restore(flags);
return 0;
#endif
drop:
netdev_rx_stat[this_cpu].dropped++;
@@ -943,8 +900,6 @@ void flush_rx_queue(void)
while ( (skb = skb_dequeue(&current->net_vif_list[nvif]->skb_list))
!= NULL )
{
if (nvif > 0)
printk("flushrxqueue on vif %d (sys: %d) (pkt_type=%d)\n", nvif, current->net_vif_list[nvif]->id, skb->pkt_type);
/*
* Write the virtual MAC address into the destination field
* of the ethernet packet. Furthermore, do the same for ARP
@@ -952,15 +907,15 @@ printk("flushrxqueue on vif %d (sys: %d) (pkt_type=%d)\n", nvif, current->net_vi
* is always 00-00-00-00-00-00.
*
* Actually, the MAC address is now all zeros, except for the
* first sixteen bits, which are the per-host vif id.
* (so eth0 should be 00-00-..., eth1 is 01-00-...)
* second sixteen bits, which are the per-host vif id.
* (so eth0 should be 00-00-..., eth1 is 00-01-...)
*/
memset(skb->mac.ethernet->h_dest, 0, ETH_ALEN);
*(unsigned int *)(skb->mac.ethernet->h_dest) = nvif;
*(unsigned int *)(skb->mac.ethernet->h_dest + 1) = nvif;
if ( ntohs(skb->mac.ethernet->h_proto) == ETH_P_ARP )
{
memset(skb->nh.raw + 18, 0, ETH_ALEN);
*(unsigned int *)(skb->nh.raw + 18) = nvif;
*(unsigned int *)(skb->nh.raw + 18 + 1) = nvif;
}
i = net_ring->rx_cons;
@@ -1978,8 +1933,6 @@ long do_net_update(void)
net_ring = current_vif->net_ring;
for ( i = net_ring->tx_cons; i != net_ring->tx_prod; i = TX_RING_INC(i) )
{
if (j > 0)
printk("net_update called with packet on vif %d system: %d)\n", j, current_vif->id);
if ( copy_from_user(&tx, net_ring->tx_ring+i, sizeof(tx)) )
continue;
@@ -2028,40 +1981,21 @@ printk("net_update called with packet on vif %d system: %d)\n", j, current_vif->
net_get_target_vif(skb);
if ( skb->dst_vif > VIF_PHYSICAL_INTERFACE )
{
if (j > 0)
printk("Sent to netif_rx.\n");
if (netif_rx(skb) == 0)
/* Give up non-local reference. Packet delivered locally. */
kfree_skb(skb);
}
else if ( skb->dst_vif == VIF_PHYSICAL_INTERFACE )
{
if (j > 0)
printk("Sent to physical device.\n");
skb_push(skb, skb->dev->hard_header_len);
dev_queue_xmit(skb);
}
else
{
if (j > 0)
printk("dropped.\n");
kfree_skb(skb);
}
/*
skb_get(skb);
skb->protocol = eth_type_trans(skb, skb->dev);
if ( netif_rx(skb) == 0 )
{
kfree_skb(skb);
}
else
{
skb_push(skb, skb->dev->hard_header_len);
dev_queue_xmit(skb);
}
*/
}
}
net_ring->tx_cons = i;
@@ -20,7 +20,6 @@
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/init.h>
#include <linux/ip.h> //remove this.
#include <net/sock.h>
@@ -226,11 +225,6 @@ static int network_start_xmit(struct sk_buff *skb, struct net_device *dev)
unsigned int i;
struct net_private *np = (struct net_private *)dev->priv;
if ((np->id > 0) || ((skb->len > 20)
&& (skb->nh.iph != NULL)
&& (skb->nh.iph->protocol == 1)))
printk(KERN_WARNING "TX on vif %d (dev:%p)\n", np->id, dev);
if ( np->tx_full )
{
printk(KERN_WARNING "%s: full queue wasn't stopped!\n", dev->name);
@@ -287,17 +281,8 @@ static void network_rx_int(int irq, void *dev_id, struct pt_regs *ptregs)
skb->protocol = eth_type_trans(skb, dev);
np->stats.rx_packets++;
np->stats.rx_bytes += np->net_ring->rx_ring[i].size;
if (((skb->len > 20)
&& ((*(unsigned char *)(skb->data + 9) == 1) || (np->id > 0)) ))
printk(KERN_WARNING "RX on vif %d (dev:%p)\n", np->id, dev);
if ((skb != NULL) && (skb->data != NULL) && (skb->len > 20) && ntohl(*(unsigned long *)(skb->data + 16)) == 167903489)
printk(KERN_WARNING "RX INT (driver): pkt_type is %d.!", skb->pkt_type);
netif_rx(skb);
dev->last_rx = jiffies;
}
np->rx_idx = i;
@@ -307,7 +292,6 @@ if ((skb != NULL) && (skb->data != NULL) && (skb->len > 20) && ntohl(*(unsigned
/* Deal with hypervisor racing our resetting of rx_event. */
smp_mb();
if ( np->net_ring->rx_cons != i ) {
//printk("redoing network rx...\n");
goto again;
}
}
@@ -371,7 +355,7 @@ int __init init_module(void)
dev->get_stats = network_get_stats;
memset(dev->dev_addr, 0, ETH_ALEN);
*(unsigned int *)(dev->dev_addr) = i;
*(unsigned int *)(dev->dev_addr + 1) = i;
if ( (err = register_netdev(dev)) != 0 )
{
@@ -382,7 +366,6 @@ int __init init_module(void)
np->dev = dev;
np->id = i;
list_add(&np->list, &dev_list);
printk(KERN_WARNING "Added VIF, ifindex is %d.\n", dev->ifindex);
}
return 0;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.