/home/tai/chorist/xian-1.2/src/xnp.c

Go to the documentation of this file.
00001 /*
00010  *
00011  *  Copyright (C) 2006 THALES Communications
00012  *
00013  *  This file is part of XIAN software.
00014  *
00015  *  XIAN is free software; you can redistribute it and/or modify it
00016  *  under the terms of the GNU General Public License as published by
00017  *  the Free Software Foundation.
00018  *
00019  *  XIAN software is distributed in the hope that it will be useful,
00020  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00021  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00022  *  GNU General Public License for more details.
00023  *
00024  *  You should have received a copy of the GNU General Public License
00025  *  along with XIAN software; if not, write to the Free Software
00026  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00027  *
00028  *  */
00029 /************************************************************************************************/
00030  
00031 
00032 #include <linux/init.h>
00033 #include <linux/module.h>
00034 #include <linux/netdevice.h>
00035 #include "include/xian_proto.h"
00036 
00037 MODULE_DESCRIPTION("XIAN - Module XNP:  XIAN Nano-Protocol Handler");
00038 MODULE_LICENSE("GPL");
00039 
00040 void (*XIAN_Manager_relay)(unsigned char *saddr, struct xian_msg * stat);
00041 
00042 /***********************************************************************************/
00047 void config_relay(void *pf){
00048   if(pf!=NULL){
00049     printk(KERN_ALERT "XNP's relaying configured by XMM\n");
00050   }
00051   XIAN_Manager_relay=pf;
00052 }
00053 XIAN_EXPORT_SYMBOL(config_relay);
00054 
00055 int xian_handler_init(void)
00056 {
00057   printk(KERN_ALERT "Init XIAN XNP (XIAN Nano-Protocol Handler module)\n");
00058   XIAN_Manager_relay=NULL;
00059   return 0;
00060 }
00061 
00062 void xian_handler_exit(void)
00063 {
00064   printk(KERN_ALERT "Unload XIAN XNP (XIAN Nano-Protocol Handler)\n");
00065 }
00066 
00067 module_init(xian_handler_init);
00068 module_exit(xian_handler_exit);
00069 
00070 /***********************************************************************************/
00075 void recv_msg(unsigned char *saddr, struct xian_msg *stat){
00076   int i;
00077   if(0){// !=0 to see input
00078     printk(KERN_ALERT "[XNP] INPUT");
00079     printk(" version=%u", stat->version);
00080     printk(" id=%u", stat->id);  
00081     printk(" length=%u\n", stat->length);  
00082     for(i=0; i<stat->length; i++){ 
00083       printk("[%d]", i);
00084       printk(" type=%u", stat->msg[i].type);
00085       printk(" id=%u", stat->msg[i].id);
00086       printk(" value=%llu/%llu\n", stat->msg[i].value.numerator, stat->msg[i].value.denominator);
00087     }
00088     printk("\n");
00089   }
00090   if(XIAN_Manager_relay!=NULL){//XIAN  Metric Manager present
00091     (*XIAN_Manager_relay)(saddr, stat);//relaying
00092   }
00093 }
00094 /***********************************************************************************/
00100 extern void xian_netif_rx(struct sk_buff *skb){
00101   struct xian_msg *stat;
00102   struct ethhdr *eth;
00103   unsigned char *saddr;
00104     
00105   /*char *data;
00106   int len;
00107   int i;
00108   data = skb->data;
00109   len = skb->len;
00110   printk("INPUT");
00111   for (i=0 ; i<len; i++){
00112     printk(" %02x", data[i]&0xff);//affichage
00113   }
00114   printk("\n");*/
00115   if(skb->protocol==1024){//Warning XIAN_NANO_PROTOCOL 1 => 1024
00116     eth=(struct ethhdr *)skb->mac.raw;
00117     saddr=kmalloc(ETH_ALEN, GFP_ATOMIC);
00118     memcpy(saddr, eth->h_source, ETH_ALEN);
00119 
00120     stat=(struct xian_msg *)(skb->data);
00121     recv_msg(saddr, stat);
00122   }else{
00123     netif_rx(skb);//relaying to the upper layer
00124   }
00125 }
00126 XIAN_EXPORT_SYMBOL(xian_netif_rx);
00127 
00128 
00129 /****************************************************************************************************************************************
00130  * SEND FUNCTIONS
00131  ***************************************************************************************************************************************/
00132 
00133 /**************************************************************************************************************************************/
00143 int hard_header(struct sk_buff *skb, struct net_device *dev,
00144                 unsigned short type, void *daddr, void *saddr,
00145                 unsigned int len)
00146 {
00147         struct ethhdr *eth = (struct ethhdr *)skb_push(skb,ETH_HLEN);
00148 
00149         eth->h_proto = __constant_htons(type);
00150         memcpy(eth->h_source, saddr ? saddr : dev->dev_addr, dev->addr_len);
00151         memcpy(eth->h_dest,   daddr ? daddr : dev->dev_addr, dev->addr_len);
00152         return (dev->hard_header_len);
00153 }
00154  
00155 unsigned int incrementer(void){
00156   static unsigned int inc=0;
00157   if(inc>65530){
00158     inc=0;
00159   }
00160   return inc++;
00161 }
00162 
00163 /**************************************************************************************************************************************/
00172 extern void xian_if_send(char *dev_name, void *daddr, void *saddr, struct qos_metric_proto_msg message){
00173   int i;
00174   struct sk_buff *skb;
00175   struct net_device *xian_if;
00176   struct xian_msg *stat;
00177   stat=kmalloc(sizeof(struct xian_msg),GFP_KERNEL);
00178   skb = dev_alloc_skb(HEADER_SIZE+XIAN_HEADER_SIZE+METRIC_MSG_LEN*message.nb);
00179   if(!skb){
00180     printk("[XNP] dev_alloc_skb() No Memory");
00181   }
00182   xian_if = dev_get_by_name(dev_name);
00183   skb_reserve(skb, LL_RESERVED_SPACE(xian_if));//alignement
00184   //skb->input_dev=xian_if; // not in 2.4 kernel version
00185   skb->dev=xian_if;
00186   
00187   skb->data=skb_put(skb, XIAN_HEADER_SIZE+METRIC_MSG_LEN*message.nb);
00188 
00189   stat=(struct xian_msg *)skb->data;
00190   memset(stat, 0, XIAN_HEADER_SIZE+METRIC_MSG_LEN*message.nb);
00191 
00192   stat->version=XIAN_NANO_PROTOCOL_VERSION;
00193   stat->id=incrementer();
00194  
00195   stat->length=message.nb;
00196   for(i=0; i<message.nb; i++){
00197     stat->msg[i].type=message.metric_name[i];
00198     stat->msg[i].id=message.id[i];
00199     stat->msg[i].encoding_type=message.encoding_type[i];
00200     memcpy(stat->msg[i].mac,message.mac[i],ETH_ALEN);
00201     stat->msg[i].value=message.metric[i].value;
00202   }
00203 
00204   hard_header(skb, xian_if, XIAN_NANO_PROTOCOL, daddr, saddr, 0);
00205   //skb->len;
00206   //skb->data_len;
00207   
00208   skb->pkt_type=PACKET_HOST;
00209 
00210   if(0){// !=0 to see output
00211     printk(KERN_ALERT "OUTPUT");
00212     for (i=0 ; i<skb->len; i++){
00213       printk(" %02x",skb->data[i]&0xff);//affichage
00214     }
00215     printk("\n");
00216   }
00217 
00218   dev_queue_xmit(skb);//transmit
00219   dev_put(xian_if);//release device
00220 }
00221 XIAN_EXPORT_SYMBOL(xian_if_send);
00222 
00223 /**************************************************************************************************************************************/
00233 void kinsert_metric(struct qos_metric_proto_msg *msg, unsigned int type, unsigned int id, unsigned int encoding_type, unsigned char mac[ETH_ALEN], struct xian_float value){
00234   //int i;
00235   int nb;
00236   nb=msg->nb;
00237   if(nb<NB_METRICS){
00238     msg->metric_name[nb]=type;
00239     msg->id[nb]=id; 
00240     msg->encoding_type[nb]=encoding_type;
00241     memcpy(msg->mac[nb],mac,ETH_ALEN);
00242     /*printk(KERN_ALERT "[XIAN Nano-Protocol Handler] KINSERT mac inserted=");
00243     for (i=0 ; i<ETH_ALEN; i++){
00244       printk("%02x", mac[i]&0xff);//affichage
00245     }
00246     printk(" mac recorded=");
00247     for (i=0 ; i<ETH_ALEN; i++){
00248       printk("%02x", msg->mac[nb][i]&0xff);//affichage
00249     }
00250     printk("\n");*/
00251     msg->metric[nb].value=value;
00252     msg->nb=nb+1;
00253     if(msg->nb>NB_METRICS){
00254        msg->nb=NB_METRICS;
00255     }
00256   }
00257 }
00258 XIAN_EXPORT_SYMBOL(kinsert_metric);
00259 
00260 /**************************************************************************************************************************************/
00268 void ksend_metric(char * dev_name, char * macadd, struct qos_metric_proto_msg msg, unsigned int * code_err){
00269   unsigned char mac_addr_converted[ETH_ALEN];
00270   convert_mac_addr(macadd, mac_addr_converted, &(msg.id_error));
00271   xian_if_send(dev_name, mac_addr_converted, NULL, msg);//xian_if
00272 }
00273 XIAN_EXPORT_SYMBOL(ksend_metric);

Generated on Mon Jan 21 12:31:46 2008 for XIAN by  doxygen 1.5.3