Lines Matching refs:mpc

35 #include "mpc.h"
39 * mpc.c: Implementation of MPOA client kernel part
69 static void MPOA_trigger_rcvd(struct k_message *msg, struct mpoa_client *mpc);
70 static void MPOA_res_reply_rcvd(struct k_message *msg, struct mpoa_client *mpc);
71 static void ingress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc);
72 static void egress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc);
73 static void mps_death(struct k_message *msg, struct mpoa_client *mpc);
74 static void clean_up(struct k_message *msg, struct mpoa_client *mpc,
77 struct mpoa_client *mpc);
79 struct mpoa_client *mpc);
81 struct mpoa_client *mpc);
83 static const uint8_t *copy_macs(struct mpoa_client *mpc,
89 static void send_set_mps_ctrl_addr(const char *addr, struct mpoa_client *mpc);
130 struct mpoa_client *mpc;
132 mpc = mpcs; /* our global linked list */
133 while (mpc != NULL) {
134 if (mpc->dev_num == itf)
135 return mpc;
136 mpc = mpc->next;
144 struct mpoa_client *mpc;
146 mpc = mpcs; /* our global linked list */
147 while (mpc != NULL) {
148 if (mpc->mpoad_vcc == vcc)
149 return mpc;
150 mpc = mpc->next;
158 struct mpoa_client *mpc;
160 mpc = mpcs; /* our global linked list */
161 while (mpc != NULL) {
162 if (mpc->dev == dev)
163 return mpc;
164 mpc = mpc->next;
283 struct mpoa_client *mpc;
285 mpc = kzalloc(sizeof(struct mpoa_client), GFP_KERNEL);
286 if (mpc == NULL)
288 rwlock_init(&mpc->ingress_lock);
289 rwlock_init(&mpc->egress_lock);
290 mpc->next = mpcs;
291 atm_mpoa_init_cache(mpc);
293 mpc->parameters.mpc_p1 = MPC_P1;
294 mpc->parameters.mpc_p2 = MPC_P2;
295 memset(mpc->parameters.mpc_p3, 0, sizeof(mpc->parameters.mpc_p3));
296 mpc->parameters.mpc_p4 = MPC_P4;
297 mpc->parameters.mpc_p5 = MPC_P5;
298 mpc->parameters.mpc_p6 = MPC_P6;
300 mpcs = mpc;
302 return mpc;
312 static void start_mpc(struct mpoa_client *mpc, struct net_device *dev)
315 dprintk("(%s)\n", mpc->dev->name);
319 mpc->old_ops = dev->netdev_ops;
320 mpc->new_ops = *mpc->old_ops;
321 mpc->new_ops.ndo_start_xmit = mpc_send_packet;
322 dev->netdev_ops = &mpc->new_ops;
326 static void stop_mpc(struct mpoa_client *mpc)
328 struct net_device *dev = mpc->dev;
329 dprintk("(%s)", mpc->dev->name);
332 if (dev->netdev_ops != &mpc->new_ops) {
333 dprintk_cont(" mpc already stopped, not fatal\n");
338 dev->netdev_ops = mpc->old_ops;
339 mpc->old_ops = NULL;
341 /* close_shortcuts(mpc); ??? FIXME */
381 struct mpoa_client *mpc;
386 mpc = find_mpc_by_lec(dev); /* Sampo-Fix: moved here from below */
387 if (mpc == NULL) {
388 pr_info("(%s) no mpc\n", dev->name);
447 send_set_mps_ctrl_addr(tlvs, mpc);
449 tlvs = copy_macs(mpc, mac_addr, tlvs,
461 * plus the possible MAC address(es) to mpc->mps_macs.
462 * For a freshly allocated MPOA client mpc->mps_macs == 0.
464 static const uint8_t *copy_macs(struct mpoa_client *mpc,
472 if (mpc->number_of_mps_macs != num_macs) { /* need to reallocate? */
473 if (mpc->number_of_mps_macs != 0)
474 kfree(mpc->mps_macs);
475 mpc->number_of_mps_macs = 0;
476 mpc->mps_macs = kmalloc_array(ETH_ALEN, num_macs, GFP_KERNEL);
477 if (mpc->mps_macs == NULL) {
478 pr_info("(%s) out of mem\n", mpc->dev->name);
482 ether_addr_copy(mpc->mps_macs, router_mac);
485 memcpy(mpc->mps_macs, tlvs, mps_macs*ETH_ALEN);
487 mpc->number_of_mps_macs = num_macs;
492 static int send_via_shortcut(struct sk_buff *skb, struct mpoa_client *mpc)
507 buff = skb->data + mpc->dev->hard_header_len;
512 mpc->dev->name, ipaddr);
514 entry = mpc->in_ops->get(ipaddr, mpc);
516 entry = mpc->in_ops->add_entry(ipaddr, mpc);
518 mpc->in_ops->put(entry);
522 if (mpc->in_ops->cache_hit(entry, mpc) != OPEN) {
524 mpc->dev->name);
525 mpc->in_ops->put(entry);
530 mpc->dev->name);
534 mpc->dev->name, iph->ttl);
535 mpc->in_ops->put(entry);
544 mpc->dev->name, entry->ctrl_info.tag);
562 mpc->in_ops->put(entry);
573 struct mpoa_client *mpc;
577 mpc = find_mpc_by_lec(dev); /* this should NEVER fail */
578 if (mpc == NULL) {
594 while (i < mpc->number_of_mps_macs) {
595 if (ether_addr_equal(eth->h_dest, mpc->mps_macs + i * ETH_ALEN))
596 if (send_via_shortcut(skb, mpc) == 0) /* try shortcut */
602 return __netdev_start_xmit(mpc->old_ops, skb, dev, false);
608 struct mpoa_client *mpc;
623 mpc = find_mpc_by_itfnum(ioc_data.dev_num);
624 if (mpc == NULL)
628 in_entry = mpc->in_ops->get(ipaddr, mpc);
632 mpc->dev->name);
634 mpc->in_ops->put(in_entry);
638 mpc->dev->name, &in_entry->ctrl_info.in_dst_ip);
640 mpc->in_ops->put(in_entry);
642 pr_info("(%s) attaching egress SVC\n", mpc->dev->name);
645 vcc->proto_data = mpc->dev;
656 struct mpoa_client *mpc;
660 mpc = find_mpc_by_lec(dev);
661 if (mpc == NULL) {
667 in_entry = mpc->in_ops->get_by_vcc(vcc, mpc);
670 mpc->dev->name, &in_entry->ctrl_info.in_dst_ip);
672 mpc->in_ops->put(in_entry);
674 eg_entry = mpc->eg_ops->get_by_vcc(vcc, mpc);
676 dprintk("(%s) egress SVC closed\n", mpc->dev->name);
678 mpc->eg_ops->put(eg_entry);
690 struct mpoa_client *mpc;
716 mpc = find_mpc_by_lec(dev);
717 if (mpc == NULL) {
741 eg = mpc->eg_ops->get_by_tag(tag, mpc);
765 mpc->eg_ops->put(eg);
776 mpc->eg_ops->put(eg);
789 .type = "mpc",
797 struct mpoa_client *mpc;
812 mpc = find_mpc_by_itfnum(arg);
813 if (mpc == NULL) {
814 dprintk("allocating new mpc for itf %d\n", arg);
815 mpc = alloc_mpc();
816 if (mpc == NULL)
818 mpc->dev_num = arg;
819 mpc->dev = find_lec_by_itfnum(arg);
822 if (mpc->mpoad_vcc) {
827 if (mpc->dev) { /* check if the lec is LANE2 capable */
828 priv = netdev_priv(mpc->dev);
830 dev_put(mpc->dev);
831 mpc->dev = NULL;
836 mpc->mpoad_vcc = vcc;
842 if (mpc->dev) {
846 start_mpc(mpc, mpc->dev);
850 if (memcmp(mpc->mps_ctrl_addr, empty, ATM_ESA_LEN) != 0)
851 send_set_mps_ctrl_addr(mpc->mps_ctrl_addr, mpc);
858 static void send_set_mps_ctrl_addr(const char *addr, struct mpoa_client *mpc)
862 memcpy(mpc->mps_ctrl_addr, addr, ATM_ESA_LEN);
866 msg_to_mpoad(&mesg, mpc);
871 struct mpoa_client *mpc;
874 mpc = find_mpc_by_vcc(vcc);
875 if (mpc == NULL) {
879 if (!mpc->mpoad_vcc) {
884 mpc->mpoad_vcc = NULL;
885 if (mpc->dev) {
886 struct lec_priv *priv = netdev_priv(mpc->dev);
888 stop_mpc(mpc);
889 dev_put(mpc->dev);
892 mpc->in_ops->destroy_cache(mpc);
893 mpc->eg_ops->destroy_cache(mpc);
901 (mpc->dev) ? mpc->dev->name : "<unknown>");
911 struct mpoa_client *mpc = find_mpc_by_vcc(vcc);
915 if (mpc == NULL) {
916 pr_info("no mpc found\n");
919 dprintk("(%s)", mpc->dev ? mpc->dev->name : "<unknown>");
923 MPOA_res_reply_rcvd(mesg, mpc);
927 MPOA_trigger_rcvd(mesg, mpc);
931 ingress_purge_rcvd(mesg, mpc);
935 egress_purge_rcvd(mesg, mpc);
939 mps_death(mesg, mpc);
943 MPOA_cache_impos_rcvd(mesg, mpc);
947 set_mpc_ctrl_addr_rcvd(mesg, mpc);
951 set_mps_mac_addr_rcvd(mesg, mpc);
955 clean_up(mesg, mpc, DIE);
959 clean_up(mesg, mpc, RELOAD);
963 mpc->parameters = mesg->content.params;
975 int msg_to_mpoad(struct k_message *mesg, struct mpoa_client *mpc)
980 if (mpc == NULL || !mpc->mpoad_vcc) {
990 atm_force_charge(mpc->mpoad_vcc, skb->truesize);
992 sk = sk_atm(mpc->mpoad_vcc);
1003 struct mpoa_client *mpc;
1018 mpc = find_mpc_by_itfnum(priv->itfnum);
1019 if (mpc == NULL) {
1020 dprintk("allocating new mpc for %s\n", dev->name);
1021 mpc = alloc_mpc();
1022 if (mpc == NULL) {
1023 pr_info("no new mpc");
1027 mpc->dev_num = priv->itfnum;
1028 mpc->dev = dev;
1034 mpc = find_mpc_by_lec(dev);
1035 if (mpc == NULL)
1038 stop_mpc(mpc);
1039 dev_put(mpc->dev);
1040 mpc->dev = NULL;
1044 mpc = find_mpc_by_lec(dev);
1045 if (mpc == NULL)
1047 if (mpc->mpoad_vcc != NULL)
1048 start_mpc(mpc, dev);
1055 mpc = find_mpc_by_lec(dev);
1056 if (mpc == NULL)
1058 if (mpc->mpoad_vcc != NULL)
1059 stop_mpc(mpc);
1080 static void MPOA_trigger_rcvd(struct k_message *msg, struct mpoa_client *mpc)
1085 entry = mpc->in_ops->get(dst_ip, mpc);
1087 entry = mpc->in_ops->add_entry(dst_ip, mpc);
1091 msg_to_mpoad(msg, mpc);
1093 mpc->in_ops->put(entry);
1101 msg_to_mpoad(msg, mpc);
1103 mpc->in_ops->put(entry);
1108 (mpc->dev) ? mpc->dev->name : "<unknown>");
1109 mpc->in_ops->put(entry);
1155 static void MPOA_res_reply_rcvd(struct k_message *msg, struct mpoa_client *mpc)
1158 in_cache_entry *entry = mpc->in_ops->get(dst_ip, mpc);
1161 mpc->dev->name, &dst_ip);
1163 mpc->dev->name, entry);
1166 mpc->dev->name);
1172 pr_info("(%s) RESOLVED entry!\n", mpc->dev->name);
1173 mpc->in_ops->put(entry);
1187 mpc->in_ops->put(entry);
1193 mpc->dev->name);
1194 mpc->in_ops->put(entry);
1198 check_qos_and_open_shortcut(msg, mpc, entry);
1200 mpc->in_ops->put(entry);
1206 static void ingress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc)
1210 in_cache_entry *entry = mpc->in_ops->get_with_mask(dst_ip, mpc, mask);
1214 mpc->dev->name, &dst_ip);
1220 mpc->dev->name, &dst_ip);
1221 write_lock_bh(&mpc->ingress_lock);
1222 mpc->in_ops->remove_entry(entry, mpc);
1223 write_unlock_bh(&mpc->ingress_lock);
1224 mpc->in_ops->put(entry);
1225 entry = mpc->in_ops->get_with_mask(dst_ip, mpc, mask);
1229 static void egress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc)
1232 eg_cache_entry *entry = mpc->eg_ops->get_by_cache_id(cache_id, mpc);
1236 mpc->dev->name);
1240 write_lock_irq(&mpc->egress_lock);
1241 mpc->eg_ops->remove_entry(entry, mpc);
1242 write_unlock_irq(&mpc->egress_lock);
1244 mpc->eg_ops->put(entry);
1284 static void mps_death(struct k_message *msg, struct mpoa_client *mpc)
1288 dprintk("(%s)\n", mpc->dev->name);
1290 if (memcmp(msg->MPS_ctrl, mpc->mps_ctrl_addr, ATM_ESA_LEN)) {
1291 pr_info("(%s) wrong MPS\n", mpc->dev->name);
1296 read_lock_irq(&mpc->egress_lock);
1297 entry = mpc->eg_cache;
1302 read_unlock_irq(&mpc->egress_lock);
1304 mpc->in_ops->destroy_cache(mpc);
1305 mpc->eg_ops->destroy_cache(mpc);
1309 struct mpoa_client *mpc)
1312 eg_cache_entry *entry = mpc->eg_ops->get_by_cache_id(msg->content.eg_info.cache_id, mpc);
1316 mpc->dev->name, entry, holding_time);
1318 entry = mpc->eg_ops->add_entry(msg, mpc);
1319 mpc->eg_ops->put(entry);
1323 mpc->eg_ops->update(entry, holding_time);
1327 write_lock_irq(&mpc->egress_lock);
1328 mpc->eg_ops->remove_entry(entry, mpc);
1329 write_unlock_irq(&mpc->egress_lock);
1331 mpc->eg_ops->put(entry);
1335 struct mpoa_client *mpc)
1348 memcpy(mpc->our_ctrl_addr, mesg->MPS_ctrl, ATM_ESA_LEN);
1351 mpc->dev ? mpc->dev->name : "<unknown>");
1356 if (mpc->dev) {
1357 priv = netdev_priv(mpc->dev);
1358 retval = priv->lane2_ops->associate_req(mpc->dev,
1359 mpc->dev->dev_addr,
1363 mpc->dev->name);
1364 retval = priv->lane2_ops->resolve(mpc->dev, NULL, 1, NULL, NULL);
1367 mpc->dev->name);
1389 static void clean_up(struct k_message *msg, struct mpoa_client *mpc, int action)
1397 read_lock_irq(&mpc->egress_lock);
1398 entry = mpc->eg_cache;
1402 msg_to_mpoad(msg, mpc);
1405 read_unlock_irq(&mpc->egress_lock);
1408 msg_to_mpoad(msg, mpc);
1422 struct mpoa_client *mpc = mpcs;
1426 while (mpc != NULL) {
1427 mpc->in_ops->clear_count(mpc);
1428 mpc->eg_ops->clear_expired(mpc);
1430 mpc->parameters.mpc_p4 * HZ) {
1431 mpc->in_ops->check_resolving(mpc);
1435 mpc->parameters.mpc_p5 * HZ) {
1436 mpc->in_ops->refresh(mpc);
1439 mpc = mpc->next;
1483 pr_info("mpc.c: initialized\n");
1490 struct mpoa_client *mpc, *tmp;
1500 mpc = mpcs;
1502 while (mpc != NULL) {
1503 tmp = mpc->next;
1504 if (mpc->dev != NULL) {
1505 stop_mpc(mpc);
1506 priv = netdev_priv(mpc->dev);
1511 mpc->in_ops->destroy_cache(mpc);
1512 mpc->eg_ops->destroy_cache(mpc);
1514 kfree(mpc->mps_macs);
1515 memset(mpc, 0, sizeof(struct mpoa_client));
1516 ddprintk("about to kfree %p\n", mpc);
1517 kfree(mpc);
1518 ddprintk("next mpc is at %p\n", tmp);
1519 mpc = tmp;