static netdev_tx_t ipddp_xmit(struct sk_buff *skb, struct net_device *dev) { __be32 paddr = skb_rtable(skb)->rt_gateway; struct ddpehdr *ddp; struct ipddp_route *rt; struct atalk_addr *our_addr; spin_lock(&ipddp_route_lock); for(rt = ipddp_route_list; rt != NULL; rt = rt->next) { if(rt->ip == paddr) break; } if(rt == NULL) { spin_unlock(&ipddp_route_lock); return NETDEV_TX_OK; } our_addr = atalk_find_dev_addr(rt->dev); if(ipddp_mode == IPDDP_DECAP) skb_pull(skb, 35-(sizeof(struct ddpehdr)+1)); ddp = (struct ddpehdr *)skb->data; ddp->deh_len_hops = htons(skb->len + (1<<10)); ddp->deh_sum = 0; if(rt->dev->type == ARPHRD_LOCALTLK) { ddp->deh_dnet = 0; ddp->deh_snet = 0; } else { ddp->deh_dnet = rt->at.s_net; ddp->deh_snet = our_addr->s_net; } ddp->deh_dnode = rt->at.s_node; ddp->deh_snode = our_addr->s_node; ddp->deh_dport = 72; ddp->deh_sport = 72; *((__u8 *)(ddp+1)) = 22; skb->protocol = htons(ETH_P_ATALK); dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; aarp_send_ddp(rt->dev, skb, &rt->at, NULL); spin_unlock(&ipddp_route_lock); return NETDEV_TX_OK; }
static netdev_tx_t ipddp_xmit(struct sk_buff *skb, struct net_device *dev) { __be32 paddr = skb_rtable(skb)->rt_gateway; struct ddpehdr *ddp; struct ipddp_route *rt; struct atalk_addr *our_addr; spin_lock(&ipddp_route_lock); /* * Find appropriate route to use, based only on IP number. */ for(rt = ipddp_route_list; rt != NULL; rt = rt->next) { if(rt->ip == paddr) break; } if(rt == NULL) { spin_unlock(&ipddp_route_lock); return NETDEV_TX_OK; } our_addr = atalk_find_dev_addr(rt->dev); if(ipddp_mode == IPDDP_DECAP) /* * Pull off the excess room that should not be there. * This is due to a hard-header problem. This is the * quick fix for now though, till it breaks. */ skb_pull(skb, 35-(sizeof(struct ddpehdr)+1)); /* Create the Extended DDP header */ ddp = (struct ddpehdr *)skb->data; ddp->deh_len_hops = htons(skb->len + (1<<10)); ddp->deh_sum = 0; /* * For Localtalk we need aarp_send_ddp to strip the * long DDP header and place a shot DDP header on it. */ if(rt->dev->type == ARPHRD_LOCALTLK) { ddp->deh_dnet = 0; /* FIXME more hops?? */ ddp->deh_snet = 0; } else { ddp->deh_dnet = rt->at.s_net; /* FIXME more hops?? */ ddp->deh_snet = our_addr->s_net; } ddp->deh_dnode = rt->at.s_node; ddp->deh_snode = our_addr->s_node; ddp->deh_dport = 72; ddp->deh_sport = 72; *((__u8 *)(ddp+1)) = 22; /* ddp type = IP */ skb->protocol = htons(ETH_P_ATALK); /* Protocol has changed */ dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; aarp_send_ddp(rt->dev, skb, &rt->at, NULL); spin_unlock(&ipddp_route_lock); return NETDEV_TX_OK; }
/* * Transmit LLAP/ELAP frame using aarp_send_ddp. */ static int ipddp_xmit(struct sk_buff *skb, struct net_device *dev) { u32 paddr = ((struct rtable*)skb->dst)->rt_gateway; struct ddpehdr *ddp; struct ipddp_route *rt; struct atalk_addr *our_addr; /* * Find appropriate route to use, based only on IP number. */ for(rt = ipddp_route_list; rt != NULL; rt = rt->next) { if(rt->ip == paddr) break; } if(rt == NULL) return 0; our_addr = atalk_find_dev_addr(rt->dev); if(ipddp_mode == IPDDP_DECAP) /* * Pull off the excess room that should not be there. * This is due to a hard-header problem. This is the * quick fix for now though, till it breaks. */ skb_pull(skb, 35-(sizeof(struct ddpehdr)+1)); /* Create the Extended DDP header */ ddp = (struct ddpehdr *)skb->data; ddp->deh_len = skb->len; ddp->deh_hops = 1; ddp->deh_pad = 0; ddp->deh_sum = 0; /* * For Localtalk we need aarp_send_ddp to strip the * long DDP header and place a shot DDP header on it. */ if(rt->dev->type == ARPHRD_LOCALTLK) { ddp->deh_dnet = 0; /* FIXME more hops?? */ ddp->deh_snet = 0; } else { ddp->deh_dnet = rt->at.s_net; /* FIXME more hops?? */ ddp->deh_snet = our_addr->s_net; } ddp->deh_dnode = rt->at.s_node; ddp->deh_snode = our_addr->s_node; ddp->deh_dport = 72; ddp->deh_sport = 72; *((__u8 *)(ddp+1)) = 22; /* ddp type = IP */ *((__u16 *)ddp)=ntohs(*((__u16 *)ddp)); /* fix up length field */ skb->protocol = htons(ETH_P_ATALK); /* Protocol has changed */ ((struct net_device_stats *) dev->priv)->tx_packets++; ((struct net_device_stats *) dev->priv)->tx_bytes+=skb->len; if(aarp_send_ddp(rt->dev, skb, &rt->at, NULL) < 0) dev_kfree_skb(skb); return 0; }