00001
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
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){
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){
00091 (*XIAN_Manager_relay)(saddr, stat);
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
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 if(skb->protocol==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);
00124 }
00125 }
00126 XIAN_EXPORT_SYMBOL(xian_netif_rx);
00127
00128
00129
00130
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));
00184
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
00206
00207
00208 skb->pkt_type=PACKET_HOST;
00209
00210 if(0){
00211 printk(KERN_ALERT "OUTPUT");
00212 for (i=0 ; i<skb->len; i++){
00213 printk(" %02x",skb->data[i]&0xff);
00214 }
00215 printk("\n");
00216 }
00217
00218 dev_queue_xmit(skb);
00219 dev_put(xian_if);
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
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
00243
00244
00245
00246
00247
00248
00249
00250
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);
00272 }
00273 XIAN_EXPORT_SYMBOL(ksend_metric);