int v3_vnet_add_route(struct v3_vnet_route route) {
struct vnet_route_info * new_route = NULL;
- unsigned long flags;
+ vnet_intr_flags_t flags;
new_route = (struct vnet_route_info *)Vnet_Malloc(sizeof(struct vnet_route_info));
void v3_vnet_del_route(uint32_t route_idx){
struct vnet_route_info * route = NULL;
- unsigned long flags;
+ vnet_intr_flags_t flags;
flags = vnet_lock_irqsave(vnet_state.lock);
/* delete all route entries with specfied src or dst device id */
static void inline del_routes_by_dev(int dev_id){
struct vnet_route_info * route, *tmp_route;
- unsigned long flags;
+ vnet_intr_flags_t flags;
flags = vnet_lock_irqsave(vnet_state.lock);
vnet_unlock_irqrestore(vnet_state.lock, flags);
}
+
+
+
/* At the end allocate a route_list
* This list will be inserted into the cache so we don't need to free it
*/
return matches;
}
+int v3_vnet_query_header(uint8_t src_mac[6],
+ uint8_t dest_mac[6],
+ int recv, // 0 = send, 1=recv
+ struct v3_vnet_header *header)
+{
+ struct route_list *routes;
+ struct vnet_route_info *r;
+ struct v3_vnet_pkt p;
+
+ p.size=14;
+ p.data=p.header;
+ memcpy(p.header,dest_mac,6);
+ memcpy(p.header+6,src_mac,6);
+ memset(p.header+12,0,2);
+
+ p.src_type = LINK_EDGE;
+ p.src_id = 0;
+
+ memcpy(header->src_mac,src_mac,6);
+ memcpy(header->dst_mac,dest_mac,6);
+
+
+ look_into_cache(&p,&routes);
+
+ if (!routes) {
+ routes = match_route(&p);
+ if (!routes) {
+ PrintError("Cannot match route\n");
+ header->header_type=VNET_HEADER_NOMATCH;
+ header->header_len=0;
+ return -1;
+ } else {
+ add_route_to_cache(&p,routes);
+ }
+ }
+
+ if (routes->num_routes<1) {
+ PrintError("Less than one route\n");
+ header->header_type=VNET_HEADER_NOMATCH;
+ header->header_len=0;
+ return -1;
+ }
+
+ if (routes->num_routes>1) {
+ PrintError("More than one route, building header for the first one only\n");
+ }
+
+ r=routes->routes[0];
+
+ switch (r->route_def.dst_type) {
+ case LINK_EDGE: {
+ // switch based on the link type
+ // for mac-in-udp, we would want to generate a mac, ip, and udp header
+ // direct transmission
+
+ // for now we will say we have no encapsulation
+ //
+ header->header_type=VNET_HEADER_NONE;
+ header->header_len=0;
+ header->src_mac_qual=r->route_def.src_mac_qual;
+ header->dst_mac_qual=r->route_def.dst_mac_qual;
+
+ }
+
+ return 0;
+ break;
+
+
+ case LINK_INTERFACE:
+ // direct transmission
+ // let's guess that it goes to the same interface...
+ header->header_type=VNET_HEADER_NONE;
+ header->header_len=0;
+ header->src_mac_qual=r->route_def.src_mac_qual;
+ header->dst_mac_qual=r->route_def.dst_mac_qual;
+
+ return 0;
+ break;
+
+ default:
+ PrintError("Unknown destination type\n");
+ return -1;
+ break;
+
+ }
+
+}
+
+
+
int v3_vnet_send_pkt(struct v3_vnet_pkt * pkt, void * private_data) {
struct route_list * matched_routes = NULL;
- unsigned long flags;
+ vnet_intr_flags_t flags;
int i;
int cpu = V3_Get_CPU();
struct v3_vnet_dev_ops * ops, int quote, int poll_state,
void * priv_data){
struct vnet_dev * new_dev = NULL;
- unsigned long flags;
+ vnet_intr_flags_t flags;
new_dev = (struct vnet_dev *)Vnet_Malloc(sizeof(struct vnet_dev));
int v3_vnet_del_dev(int dev_id){
struct vnet_dev * dev = NULL;
- unsigned long flags;
+ vnet_intr_flags_t flags;
flags = vnet_lock_irqsave(vnet_state.lock);
struct v3_vnet_bridge_ops * ops,
uint8_t type,
void * priv_data) {
- unsigned long flags;
+ vnet_intr_flags_t flags;
int bridge_free = 0;
struct vnet_brg_dev * tmp_bridge = NULL;
void v3_vnet_del_bridge(uint8_t type) {
- unsigned long flags;
+ vnet_intr_flags_t flags;
struct vnet_brg_dev * tmp_bridge = NULL;
flags = vnet_lock_irqsave(vnet_state.lock);